@code-yeongyu/senpi 2026.9.25 → 2026.9.27
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 +36 -0
- package/dist/bun-runtime.d.ts +18 -2
- package/dist/bun-runtime.d.ts.map +1 -1
- package/dist/bun-runtime.js +60 -8
- package/dist/bun-runtime.js.map +1 -1
- package/dist/bundle/chunks/{app-server-command-RB6QUPRI.js → app-server-command-7WEJGW7D.js} +1 -1
- package/dist/bundle/chunks/bun-extension-importer-R4HXF3GD.js +14 -0
- package/dist/bundle/chunks/{chunk-JJ3NJZBD.js → chunk-3QCAGZFO.js} +19 -18
- package/dist/bundle/chunks/chunk-HCXLCGMF.js +8 -0
- package/dist/bundle/chunks/{chunk-OZCB6BP3.js → chunk-HH3D5ZYA.js} +3 -3
- package/dist/bundle/chunks/chunk-W3D3ZYDS.js +2 -0
- package/dist/bundle/chunks/{cli-main-KO53KYDN.js → cli-main-YLZ4MMLV.js} +1 -1
- package/dist/bundle/chunks/{interactive-host-runtime-YI75GFD5.js → interactive-host-runtime-6WY6424X.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-ABDNLJSI.js → interactive-mode-6AHR5TEM.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-JV3MNWXZ.js → multi-session-host-5IWJEFDF.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-ZYYAVCXU.js → package-manager-cli-FZKBCLWV.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-Q2OUJURB.js → rpc-mode-JSCHAE6O.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +119 -118
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +10 -5
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/dynamic-prompt/handoff.js +1 -1
- package/dist/core/dynamic-prompt/handoff.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +1 -1
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js +3 -1
- package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js.map +1 -1
- package/dist/core/extensions/bun-extension-importer.d.ts.map +1 -1
- package/dist/core/extensions/bun-extension-importer.js +10 -4
- package/dist/core/extensions/bun-extension-importer.js.map +1 -1
- package/dist/core/extensions/bun-extension-registry.js +6 -5
- package/dist/core/extensions/bun-extension-registry.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +4 -2
- package/dist/core/messages.js.map +1 -1
- package/dist/core/provider-rejected-images.d.ts +18 -0
- package/dist/core/provider-rejected-images.d.ts.map +1 -0
- package/dist/core/provider-rejected-images.js +107 -0
- package/dist/core/provider-rejected-images.js.map +1 -0
- package/dist/core/session-title-generator.d.ts.map +1 -1
- package/dist/core/session-title-generator.js +21 -3
- package/dist/core/session-title-generator.js.map +1 -1
- package/dist/core/session-title-reasoning.d.ts +14 -0
- package/dist/core/session-title-reasoning.d.ts.map +1 -0
- package/dist/core/session-title-reasoning.js +31 -0
- package/dist/core/session-title-reasoning.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +13 -0
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +2 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/runtime-notice-presenter.d.ts +8 -0
- package/dist/modes/interactive/runtime-notice-presenter.d.ts.map +1 -0
- package/dist/modes/interactive/runtime-notice-presenter.js +69 -0
- package/dist/modes/interactive/runtime-notice-presenter.js.map +1 -0
- package/dist/modes/interactive/runtime-notice.d.ts +50 -0
- package/dist/modes/interactive/runtime-notice.d.ts.map +1 -0
- package/dist/modes/interactive/runtime-notice.js +104 -0
- package/dist/modes/interactive/runtime-notice.js.map +1 -0
- package/docs/environment-variables.md +2 -0
- package/docs/quickstart.md +7 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -22
- package/dist/bundle/chunks/bun-extension-importer-H4IJCWWQ.js +0 -14
- package/dist/bundle/chunks/chunk-34HMVB33.js +0 -2
- package/dist/bundle/chunks/chunk-SGYEOIOJ.js +0 -8
- package/node_modules/@code-yeongyu/senpi-desktop-engine/README.md +0 -31
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.d.ts +0 -38
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.js +0 -117
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.d.ts +0 -3
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.js +0 -3
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.d.ts +0 -42
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.js +0 -79
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/check-prebuild-fresh.mjs +0 -160
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/index.d.ts +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/index.js +0 -23
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/prebuilds/darwin-arm64/senpi-desktop-engine +0 -0
- package/node_modules/@code-yeongyu/senpi-desktop-engine/package.json +0 -53
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/README.md +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.d.ts +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/package.json +0 -44
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/README.md +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.d.ts +0 -38
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.d.ts +0 -28
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.js +0 -102
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.d.ts +0 -14
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.js +0 -71
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.d.ts +0 -7
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.js +0 -4
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.d.ts +0 -66
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.js +0 -8
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.d.ts +0 -44
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.d.ts +0 -59
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/package.json +0 -45
- package/node_modules/@code-yeongyu/senpi-desktop-service/README.md +0 -27
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.d.ts +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-service/package.json +0 -44
- package/node_modules/@code-yeongyu/senpi-desktop-tool/README.md +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.d.ts +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-tool/package.json +0 -44
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-ZKZAATFM.js";import{TIP_DEFINITIONS}from"./chunk-UYCGOK6M.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-6WBYI25N.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,environmentContextMessageIfChanged,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,reserveSessionWrite,resolveEnvironmentContext,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-OZCB6BP3.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,PROCESS_START_TOLERANCE_MS,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,ownProcessStartedAtMs,processBootAtMs,safeRegExp,sameBoot,sameProcessStart}from"./chunk-YS5YEX4S.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,addAccount,all_exports,assertValidAccountName,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-SGYEOIOJ.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-77ACEMYL.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-EJKCBRYK.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-6Q6DGME2.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-WM5FVFAP.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-MKAM7IRH.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-CLZVNQW3.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths}from"./chunk-3WBSBDBX.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-UBPMXBOJ.js";import{createRgEngine,ensureTool}from"./chunk-FIJJKSPL.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-HZAKOVHN.js";import{discoverEnvSlots}from"./chunk-TTY5BHCG.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-FHXKBENX.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{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-Y54V65MS.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-SUQDU5KM.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-BSOJHK4W.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,TURN_RETRY_SUPPRESSION_PREFIX,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderFailureForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-KMJXSXRX.js";import{require_proper_lockfile}from"./chunk-L6JO4M6J.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-ELFCNCBY.js";import{INSPECTOR_VM_IMPORT_WARNING,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,getPiUserAgent,getReleaseChangelogUrl,isRecoverableInspectorVmImportError}from"./chunk-34HMVB33.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,VERSION,canonicalizePath,envValue,expandTildePath,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-Y65WFI5H.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{resolveToolNameMatch}from"./chunk-WASCMT6Y.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-TTHMOL5G.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{LEGACY_PROVIDER_IDS,ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,supportsConfigurationUpdate,upsertSlot}from"./chunk-WL5EQYNL.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.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 platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.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 constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,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=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let 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};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex,options,{glob,posix:posix5}),result3={glob,state,regex,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync39,mkdirSync as mkdirSync23,readFileSync as readFileSync38,writeFileSync as writeFileSync20}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname45}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize2,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2);return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function 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 newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}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;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...providerTools(context,config.model)}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve42=>{let abortHandler=()=>resolve42(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve42,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve42(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){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,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,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(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,partialResult})))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},isError=afterResult.isError??isError)}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return 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==="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}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,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.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage);break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve42,reject)=>{resolveCompletion=resolve42,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
2
|
+
import{CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,SessionSelectorComponent,appendHiddenTuiStdout,appendUncaughtCrashLog,areExperimentalFeaturesEnabled,formatKeyText,keyDisplayText,keyHint,keyText,minimatch,parseGitUrl,rawKeyHint,readPiManifest,readSkillMarkdownSource,redactSensitiveOutput,redactSensitiveTokenValues,require_ignore,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector}from"./chunk-ZKZAATFM.js";import{TIP_DEFINITIONS}from"./chunk-UYCGOK6M.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-6WBYI25N.js";import{CURRENT_SESSION_VERSION,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,GOAL_CONTINUATION_MESSAGE_TYPE,MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,SESSION_CONTEXT_ENTRY_ID,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,assertSessionCwdExists,assertValidSessionId,buildContextEntries,buildSessionContext,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,environmentContextMessageIfChanged,executeBashWithOperations,formatMissingSessionCwdPrompt,formatSize,getDefaultSessionDir,getLatestCompactionEntry,getMissingSessionCwdIssue,getSessionContextEntryId,isContextExcludedCustomMessage,isTransportGoneError,migrateSessionEntries,parseSessionEntries,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sessionEntryToContextMessages,stripAnsi,truncateHead,truncateLine,truncateTail,unregisterSessionWriter}from"./chunk-HH3D5ZYA.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MAX_DURABLE_MONITORS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,PROCESS_START_TOLERANCE_MS,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,ownProcessStartedAtMs,processBootAtMs,safeRegExp,sameBoot,sameProcessStart}from"./chunk-YS5YEX4S.js";import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,FooterDataProvider,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,SENTINEL_OAUTH_FIELDS,addAccount,all_exports,assertValidAccountName,builtinProviders,classifyReasoningCapability,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findGitPaths,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,refreshSlot,registerBundledOAuthFlowLoaders,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,upsertAccount}from"./chunk-HCXLCGMF.js";import{Theme,canonicalWatchPath,detectTerminalBackgroundFromEnv,detectTerminalBackgroundTheme,detectTerminalThemeForAuto,flushRawStdout,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,resolveThemeSetting,restoreStderr,restoreStdout,setRegisteredThemes,setTheme,setThemeInstance,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,watchWithErrorHandler,writeRawStdout}from"./chunk-77ACEMYL.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,decodeKittyPrintable,dist_exports,expandPasteMarkers,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,hyperlink,imageFallback,isKeyRelease,isViewportTUI,matchesKey,outerKittyGraphicsMode,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-EJKCBRYK.js";import{AssistantEditError,SessionStreamingError,UserEditError,assertExpectedLeaf,assertExpectedUserLeaf,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,userTextEquals}from"./chunk-6Q6DGME2.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SettingsManager,TERMINAL_MOUSE_MODES,applyHttpProxySettings,configureHttpDispatcher,formatHttpIdleTimeoutMs,getSettingsPath,isTerminalMouseMode,parseSettingsJson,require_undici,wasSelfWrite}from"./chunk-WM5FVFAP.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,loadHostLaunchSpec,parseHostLaunchSpec,readHostStatus,runHostCommand,runHostRequest}from"./chunk-MKAM7IRH.js";import{GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,decideHostAction,ensureHost,handoffHost,parseHostProtocolInfo,probeHost,stopHost}from"./chunk-CLZVNQW3.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-HH3KJDWA.js";import{createHostDaemonPaths}from"./chunk-3WBSBDBX.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-UBPMXBOJ.js";import{createRgEngine,ensureTool}from"./chunk-FIJJKSPL.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep}from"./chunk-HZAKOVHN.js";import{discoverEnvSlots}from"./chunk-TTY5BHCG.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid}from"./chunk-FHXKBENX.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{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-Y54V65MS.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-SUQDU5KM.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-BSOJHK4W.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,StringEnum,TURN_RETRY_SUPPRESSION_PREFIX,compile_exports,composeShellCommand,contentText,cursorOverflowCompactionSettings,describeProviderFailureForUser,dropFailedAssistantTurns,findEnvKeys,getApiProvider,getCursorVariantAlias,getEnvApiKey,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isProviderStreamStallError,isProviderTimeoutError,isRecoverableLength,isRetryableAssistantError,isRetryableErrorMessage,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,retryAssistantCall,retryDelayMs,retryTransientCall,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,stripTurnRetrySuppressionPrefix,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-KMJXSXRX.js";import{require_proper_lockfile}from"./chunk-L6JO4M6J.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-ELFCNCBY.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-W3D3ZYDS.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,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-Y65WFI5H.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{resolveToolNameMatch}from"./chunk-WASCMT6Y.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,sanitizeAnthropicToolPairs}from"./chunk-X4Q5YSTE.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-TTHMOL5G.js";import{cleanupSessionResources}from"./chunk-WVGCQOLJ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-BPX6QWPD.js";import{LEGACY_PROVIDER_IDS,ModelsError,accountLabel,appendLoginSlot,calculateCost,clampThinkingLevel,createModels,estimateContextTokens,getSupportedThinkingLevels,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,supportsConfigurationUpdate,upsertSlot}from"./chunk-WL5EQYNL.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.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 platform4=navigator.platform.toLowerCase();return platform4==="win32"||platform4==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path13,{windows}={})=>{let segs=path13.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.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 constants10=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants10,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants10.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse5=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants10.globChars(opts.windows),EXTGLOB_CHARS=constants10.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,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=parse5(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let 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};parse5.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants10.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source2=create(match[1]);return source2?source2+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source=create(output);return source&&opts.strictSlashes!==!0&&(source+=`${SLASH_LITERAL}?`),source};module.exports=parse5}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse5=require_parse(),utils=require_utils(),constants10=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex.state;delete regex.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex,options,{glob,posix:posix5}),result3={glob,state,regex,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex,options,posix5):match=regex.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse5(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source=`^(?!${source}).*$`);let regex=picomatch4.toRegex(source,options);return returnState===!0&&(regex.state=state),regex};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse5.fastpaths(input,options)),parsed.output||(parsed=parse5(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source,options)=>{try{let opts=options||{};return new RegExp(source,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants10;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os6 from"node:os";import*as path12 from"node:path";import{spawn as spawn11,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync39,mkdirSync as mkdirSync23,readFileSync as readFileSync38,writeFileSync as writeFileSync20}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname45}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual3}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES2,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES2,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize2,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead2,truncateLine:()=>truncateLine2,truncateTail:()=>truncateTail2,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2);return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function 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 newMessages=[...prompts],currentContext={...context,messages:[...context.messages,...prompts]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let prompt of prompts)await emit({type:"message_start",message:prompt}),await emit({type:"message_end",message:prompt});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}if(pendingMessages.length>0){for(let message2 of pendingMessages)await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);pendingMessages=[]}let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}let nextTurnContext={message,toolResults,context:currentContext,newMessages};if(await config.shouldStopAfterTurn?.(nextTurnContext)){await emit({type:"agent_end",messages:newMessages});return}if(toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,config={...config,model:nextTurnSnapshot.model??config.model,reasoning:nextTurnSnapshot.thinkingLevel===void 0?config.reasoning:nextTurnSnapshot.thinkingLevel==="off"?void 0:nextTurnSnapshot.thinkingLevel,thinkingSelection:nextTurnSnapshot.thinkingSelection===void 0?config.thinkingSelection:nextTurnSnapshot.thinkingSelection??void 0,abortServerSideFallback:nextTurnSnapshot.abortServerSideFallback??config.abortServerSideFallback}),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[])}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){pendingMessages=followUpMessages;continue}break}await emit({type:"agent_end",messages:newMessages})}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;return config.transformContext&&(messages=await config.transformContext(messages,signal)),{systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...providerTools(context,config.model)}}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result3=>{providerToolResults.push(result3)}}:{}}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await response.result(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await response.result();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve42=>{let abortHandler=()=>resolve42(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve42,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve42(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){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,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,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(resolve42=>{signal.addEventListener("abort",()=>resolve42(ABORTED),{once:!0})})}async function executePreparedToolCall(prepared,signal,emit){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(emit({type:"tool_execution_update",toolCallId:prepared.toolCall.id,toolName:prepared.toolCall.name,args:prepared.toolCall.arguments,partialResult})))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);afterResult&&(result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},isError=afterResult.isError??isError)}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return 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==="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}}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}drain(){if(this.mode==="all"){let drained=this.messages.slice();return this.messages=[],drained}let first=this.messages[0];return first?(this.messages=this.messages.slice(1),[first]):[]}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,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.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.shouldStopAfterTurn=runtimeOptions.shouldStopAfterTurn,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage)throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),shouldStopAfterTurn=this.shouldStopAfterTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,shouldStopAfterTurn:shouldStopAfterTurn?async context=>await shouldStopAfterTurn(context,this.signal):void 0,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve42=>{resolvePromise=resolve42});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage);break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve42,reject)=>{resolveCompletion=resolve42,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
|
|
3
3
|
|
|
4
4
|
<summary>
|
|
5
5
|
`,COMPACTION_SUMMARY_SUFFIX=`
|
|
@@ -600,7 +600,7 @@ ${instructions}`}],timestamp:Date.now()}],maxTokens=Math.min(4096,model.maxToken
|
|
|
600
600
|
...[truncated]`,CHARS_PER_TOKEN=4;function cursorAdmissionBudgetBytes(contextWindowTokens){return!Number.isFinite(contextWindowTokens)||contextWindowTokens<=0?0:Math.floor(contextWindowTokens)*CHARS_PER_TOKEN}function capToolResultBodies(messages,maxChars){let segmenter2=new Intl.Segmenter(void 0,{granularity:"grapheme"}),markerChars=[...segmenter2.segment(CURSOR_TRUNCATION_MARKER)].length,result3=messages.slice(),changed=!1;for(let messageIndex=result3.length-1;messageIndex>=0;messageIndex--){let message=result3[messageIndex];if(message.role!=="toolResult"||!Array.isArray(message.content))continue;let content=message.content;for(let partIndex=content.length-1;partIndex>=0;partIndex--){let part=content[partIndex];if(part.type==="image"&&typeof part.data=="string"||part.type!=="text"||typeof part.text!="string")continue;let graphemes=[...segmenter2.segment(part.text)].map(item=>item.segment);if(graphemes.length<=maxChars)continue;let kept=graphemes.slice(0,Math.max(0,maxChars-markerChars)).join("");content=content===message.content?content.slice():content,content[partIndex]={...part,text:kept+CURSOR_TRUNCATION_MARKER},result3[messageIndex]={...message,content},changed=!0}}return{messages:result3,changed}}function emptyToolResult(message){if(message.role!=="toolResult"||!Array.isArray(message.content))return message;let emptiedContent=message.content.map(part=>part.type==="text"?{...part,text:""}:part.type==="image"?{...part,data:""}:part),content=emptiedContent.filter((part,index)=>{if(index===0)return!0;let previous=emptiedContent[index-1],empty=part.type==="text"?part.text==="":part.type==="image"&&part.data==="",previousEmpty=previous.type==="text"?previous.text==="":previous.type==="image"&&previous.data==="";return!empty||!previousEmpty});return{...message,content}}function blankOldestToolResults(messages,fits2){let toolResultIndexes=messages.flatMap((message,index)=>message.role==="toolResult"&&Array.isArray(message.content)?[index]:[]),withEmptyPrefix=count2=>{let candidate=messages.slice();for(let i=0;i<count2;i++)candidate[toolResultIndexes[i]]=emptyToolResult(candidate[toolResultIndexes[i]]);return candidate},low=0,high=toolResultIndexes.length;for(;low<high;){let middle=Math.floor((low+high)/2);fits2(withEmptyPrefix(middle+1))?high=middle:low=middle+1}let count=Math.min(low+1,toolResultIndexes.length);return{messages:count>0?withEmptyPrefix(count):messages,count}}function admitCursorHistory(request2){let{messages,budgetBytes}=request2;if(!Array.isArray(messages)||messages.length===0)return{messages,changed:!1,blankedToolResults:0,bytesBefore:0,bytesAfter:0,overBudget:!1};let convert=request2.convert??(candidate=>convertToLlm(candidate)),capped=capToolResultBodies(messages,request2.maxChars??CURSOR_TOOL_RESULT_MAX_CHARS),measure=candidate=>{let converted=convert(candidate),activeUserMessageIndex=converted.at(-1)?.role==="user"?converted.length-1:-1;return measureCursorModelInputSerializedBytes(converted,activeUserMessageIndex)},bytesBefore=measure(capped.messages);if(bytesBefore<=budgetBytes)return{messages:capped.changed?capped.messages:messages,changed:capped.changed,blankedToolResults:0,bytesBefore,bytesAfter:bytesBefore,overBudget:!1};let blanked=blankOldestToolResults(capped.messages,candidate=>measure(candidate)<=budgetBytes),bytesAfter=blanked.count>0?measure(blanked.messages):bytesBefore,changed=capped.changed||blanked.count>0;return{messages:changed?blanked.messages:messages,changed,blankedToolResults:blanked.count,bytesBefore,bytesAfter,overBudget:bytesAfter>budgetBytes}}var DEFAULT_THINKING_LEVEL="medium";import{basename,dirname as dirname3,resolve as resolve2,sep}from"node:path";function getExtensionSourceLabel(extensionPath){return extensionPath.startsWith("<")?`extension:${extensionPath.replace(/[<>]/g,"")}`:`extension:${basename(extensionPath).replace(/\.(ts|js)$/,"")}`}function resolveDiscoveredResourcePaths(entries,extensions){let contributors=new Map(extensions.map(extension=>[extension.path,extension]));return entries.map(entry=>{let contributor=contributors.get(entry.extensionPath),scope=entry.scope??(contributor!==void 0&&inheritsSystemScope(contributor,entry.path)?"system":"temporary");return{path:entry.path,metadata:{source:getExtensionSourceLabel(entry.extensionPath),scope,origin:"top-level",baseDir:entry.extensionPath.startsWith("<")?void 0:dirname3(entry.extensionPath)}}})}function inheritsSystemScope(contributor,resourcePath){if(contributor.sourceInfo.scope!=="system")return!1;if(contributor.path.startsWith("<builtin:"))return!0;let packageRoot=contributor.sourceInfo.baseDir;return packageRoot!==void 0&&isUnderPath(resolve2(resourcePath),resolve2(packageRoot))}function isUnderPath(target,root){if(target===root)return!0;let prefix=root.endsWith(sep)?root:`${root}${sep}`;return target.startsWith(prefix)}var import_ignore2=__toESM(require_ignore(),1);import{existsSync,readdirSync,readFileSync as readFileSync2,statSync}from"fs";import{basename as basename2,dirname as dirname4,join as join3,relative,resolve as resolve3,sep as sep2}from"path";function createSourceInfo(path13,metadata){return{path:path13,source:metadata.source,scope:metadata.scope,origin:metadata.origin,baseDir:metadata.baseDir}}function createSyntheticSourceInfo(path13,options){return{path:path13,source:options.source,scope:options.scope??"temporary",origin:options.origin??"top-level",baseDir:options.baseDir}}var MAX_NAME_LENGTH2=64,MAX_DESCRIPTION_LENGTH2=1024,IGNORE_FILE_NAMES2=[".gitignore",".ignore",".fdignore"];function toPosixPath(p){return p.split(sep2).join("/")}function prefixIgnorePattern2(line,prefix){let trimmed=line.trim();if(!trimmed||trimmed.startsWith("#")&&!trimmed.startsWith("\\#"))return null;let pattern=line,negated=!1;pattern.startsWith("!")?(negated=!0,pattern=pattern.slice(1)):pattern.startsWith("\\!")&&(pattern=pattern.slice(1)),pattern.startsWith("/")&&(pattern=pattern.slice(1));let prefixed=prefix?`${prefix}${pattern}`:pattern;return negated?`!${prefixed}`:prefixed}function addIgnoreRules2(ig,dir,rootDir){let relativeDir=relative(rootDir,dir),prefix=relativeDir?`${toPosixPath(relativeDir)}/`:"";for(let filename of IGNORE_FILE_NAMES2){let ignorePath=join3(dir,filename);if(existsSync(ignorePath))try{let patterns=readFileSync2(ignorePath,"utf-8").split(/\r?\n/).map(line=>prefixIgnorePattern2(line,prefix)).filter(line=>!!line);patterns.length>0&&ig.add(patterns)}catch{}}}function validateName2(name){let errors=[];return name.length>MAX_NAME_LENGTH2&&errors.push(`name exceeds ${MAX_NAME_LENGTH2} characters (${name.length})`),/^[a-z0-9-]+$/.test(name)||errors.push("name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)"),(name.startsWith("-")||name.endsWith("-"))&&errors.push("name must not start or end with a hyphen"),name.includes("--")&&errors.push("name must not contain consecutive hyphens"),errors}function validateDescription2(description){let errors=[];return typeof description!="string"||description.trim()===""?errors.push("description is required"):description.length>MAX_DESCRIPTION_LENGTH2&&errors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH2} characters (${description.length})`),errors}function createSkillSourceInfo(filePath,baseDir,source){switch(source){case"user":return createSyntheticSourceInfo(filePath,{source:"local",scope:"user",baseDir});case"project":return createSyntheticSourceInfo(filePath,{source:"local",scope:"project",baseDir});case"path":return createSyntheticSourceInfo(filePath,{source:"local",baseDir});default:return createSyntheticSourceInfo(filePath,{source,baseDir})}}function loadSkillsFromDir(options){let{dir,source}=options;return loadSkillsFromDirInternal2(dir,source,!0)}function loadSkillsFromDirInternal2(dir,source,includeRootFiles,ignoreMatcher,rootDir){let skills=[],diagnostics=[];if(!existsSync(dir))return{skills,diagnostics};let root=rootDir??dir,ig=ignoreMatcher??(0,import_ignore2.default)();addIgnoreRules2(ig,dir,root);try{let entries=readdirSync(dir,{withFileTypes:!0});for(let entry of entries){if(entry.name!=="SKILL.md")continue;let fullPath=join3(dir,entry.name),isFile=entry.isFile();if(entry.isSymbolicLink())try{isFile=statSync(fullPath).isFile()}catch{continue}let relPath=toPosixPath(relative(root,fullPath));if(!isFile||ig.ignores(relPath))continue;let result3=loadSkillFromFile2(fullPath,source);return result3.skill&&skills.push(result3.skill),diagnostics.push(...result3.diagnostics),{skills,diagnostics}}for(let entry of entries){if(shouldSkipSkillWalkDirectoryName(entry.name))continue;let fullPath=join3(dir,entry.name),isDirectory=entry.isDirectory(),isFile=entry.isFile();if(entry.isSymbolicLink())try{let stats=statSync(fullPath);isDirectory=stats.isDirectory(),isFile=stats.isFile()}catch{continue}let relPath=toPosixPath(relative(root,fullPath)),ignorePath=isDirectory?`${relPath}/`:relPath;if(ig.ignores(ignorePath))continue;if(isDirectory){let subResult=loadSkillsFromDirInternal2(fullPath,source,!1,ig,root);skills.push(...subResult.skills),diagnostics.push(...subResult.diagnostics);continue}if(!isFile||!includeRootFiles||!entry.name.endsWith(".md"))continue;let result3=loadSkillFromFile2(fullPath,source);result3.skill&&skills.push(result3.skill),diagnostics.push(...result3.diagnostics)}}catch{}return{skills,diagnostics}}function loadSkillFromFile2(filePath,source){let diagnostics=[],isDeclaredSkill=basename2(filePath)==="SKILL.md",rawContent;try{rawContent=readSkillMarkdownSource(filePath)}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read skill file";return diagnostics.push({type:"warning",message,path:filePath}),{skill:null,diagnostics}}let frontmatter;try{({frontmatter}=parseFrontmatter3(rawContent))}catch(error2){if(isDeclaredSkill){let message=error2 instanceof Error?error2.message:"failed to parse skill file";diagnostics.push({type:"warning",message,path:filePath})}return{skill:null,diagnostics}}let description=frontmatter.description,hasDescription=typeof description=="string"&&description.trim()!=="";if(!isDeclaredSkill&&!hasDescription)return{skill:null,diagnostics};let skillDir=dirname4(filePath),parentDirName=basename2(skillDir),descErrors=validateDescription2(description);for(let error2 of descErrors)diagnostics.push({type:"warning",message:error2,path:filePath});let name=(typeof frontmatter.name=="string"?frontmatter.name:void 0)||parentDirName,nameErrors=validateName2(name);for(let error2 of nameErrors)diagnostics.push({type:"warning",message:error2,path:filePath});return hasDescription?{skill:{name,description,filePath,baseDir:skillDir,sourceInfo:createSkillSourceInfo(filePath,skillDir,source),disableModelInvocation:frontmatter["disable-model-invocation"]===!0},diagnostics}:{skill:null,diagnostics}}function formatSkillsForPrompt(skills,fileReadTool="read"){let visibleSkills=skills.filter(s=>!s.disableModelInvocation);if(visibleSkills.length===0)return"";let rootByPath=new Map;for(let skill of visibleSkills){let dir=skill.filePath.split("/").slice(0,-2).join("/");rootByPath.has(dir)||rootByPath.set(dir,`r${rootByPath.size}`)}let lines=[`
|
|
601
601
|
|
|
602
602
|
The following skills provide specialized instructions for specific tasks.`,fileReadTool==="read"?"Use the read tool to load a skill's file whenever its description even loosely matches the task - loading an irrelevant skill costs little; missing a relevant one degrades the work.":"Use bash to load a skill's file whenever its description even loosely matches the task - loading an irrelevant skill costs little; missing a relevant one degrades the work.","When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.","","<skill_roots>"];for(let[dir,alias]of rootByPath)lines.push(` <${alias}>${escapeXml2(dir)}</${alias}>`);lines.push("</skill_roots>","A location's `rN/` prefix expands to the matching root above.","","<available_skills>");for(let skill of visibleSkills){let dir=skill.filePath.split("/").slice(0,-2).join("/"),alias=rootByPath.get(dir),relative21=skill.filePath.startsWith(`${dir}/`)?skill.filePath.slice(dir.length+1):skill.filePath;lines.push(" <skill>"),lines.push(` <name>${escapeXml2(skill.name)}</name>`),lines.push(` <description>${escapeXml2(skill.description)}</description>`),lines.push(` <location>${escapeXml2(`${alias}/${relative21}`)}</location>`),lines.push(" </skill>")}return lines.push("</available_skills>"),lines.join(`
|
|
603
|
-
`)}function escapeXml2(str3){return str3.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function loadSkills2(options){let{agentDir,skillPaths,includeDefaults}=options,resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(agentDir??getAgentDir()),skillMap=new Map,realPathSet=new Set,allDiagnostics=[],collisionDiagnostics=[];function addSkills(result3){allDiagnostics.push(...result3.diagnostics);for(let skill of result3.skills){let realPath=canonicalizePath(skill.filePath);if(realPathSet.has(realPath))continue;let existing=skillMap.get(skill.name);existing?collisionDiagnostics.push({type:"collision",message:`name "${skill.name}" collision`,path:skill.filePath,collision:{resourceType:"skill",name:skill.name,winnerPath:existing.filePath,loserPath:skill.filePath}}):(skillMap.set(skill.name,skill),realPathSet.add(realPath))}}includeDefaults&&(addSkills(loadSkillsFromDirInternal2(join3(resolvedAgentDir,"skills"),"user",!0)),addSkills(loadSkillsFromDirInternal2(resolve3(resolvedCwd,CONFIG_DIR_NAME,"skills"),"project",!0)));let userSkillsDir=join3(resolvedAgentDir,"skills"),projectSkillsDir=resolve3(resolvedCwd,CONFIG_DIR_NAME,"skills"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve3(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep2)?normalizedRoot:`${normalizedRoot}${sep2}`;return target.startsWith(prefix)},getSource=resolvedPath=>{if(!includeDefaults){if(isUnderPath2(resolvedPath,userSkillsDir))return"user";if(isUnderPath2(resolvedPath,projectSkillsDir))return"project"}return"path"};for(let rawPath of skillPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(!existsSync(resolvedPath)){allDiagnostics.push({type:"warning",message:"skill path does not exist",path:resolvedPath});continue}try{let stats=statSync(resolvedPath),source=getSource(resolvedPath);if(stats.isDirectory())addSkills(loadSkillsFromDirInternal2(resolvedPath,source,!0));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let result3=loadSkillFromFile2(resolvedPath,source);result3.skill?addSkills({skills:[result3.skill],diagnostics:result3.diagnostics}):allDiagnostics.push(...result3.diagnostics)}else allDiagnostics.push({type:"warning",message:"skill path is not a markdown file",path:resolvedPath})}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read skill path";allDiagnostics.push({type:"warning",message,path:resolvedPath})}}return{skills:Array.from(skillMap.values()),diagnostics:[...allDiagnostics,...collisionDiagnostics]}}function buildHandoffSection(options={}){let nextRule=options.turnEndRuleStatedElsewhere?"The Next you name is executed in this same response with tool calls.":"The Next you name is executed in this same response with tool calls; a Next with nothing after it is a defect.",betweenRule=options.briefUpdatesBetweenHandoffs?"Between handoffs, one
|
|
603
|
+
`)}function escapeXml2(str3){return str3.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function loadSkills2(options){let{agentDir,skillPaths,includeDefaults}=options,resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(agentDir??getAgentDir()),skillMap=new Map,realPathSet=new Set,allDiagnostics=[],collisionDiagnostics=[];function addSkills(result3){allDiagnostics.push(...result3.diagnostics);for(let skill of result3.skills){let realPath=canonicalizePath(skill.filePath);if(realPathSet.has(realPath))continue;let existing=skillMap.get(skill.name);existing?collisionDiagnostics.push({type:"collision",message:`name "${skill.name}" collision`,path:skill.filePath,collision:{resourceType:"skill",name:skill.name,winnerPath:existing.filePath,loserPath:skill.filePath}}):(skillMap.set(skill.name,skill),realPathSet.add(realPath))}}includeDefaults&&(addSkills(loadSkillsFromDirInternal2(join3(resolvedAgentDir,"skills"),"user",!0)),addSkills(loadSkillsFromDirInternal2(resolve3(resolvedCwd,CONFIG_DIR_NAME,"skills"),"project",!0)));let userSkillsDir=join3(resolvedAgentDir,"skills"),projectSkillsDir=resolve3(resolvedCwd,CONFIG_DIR_NAME,"skills"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve3(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep2)?normalizedRoot:`${normalizedRoot}${sep2}`;return target.startsWith(prefix)},getSource=resolvedPath=>{if(!includeDefaults){if(isUnderPath2(resolvedPath,userSkillsDir))return"user";if(isUnderPath2(resolvedPath,projectSkillsDir))return"project"}return"path"};for(let rawPath of skillPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(!existsSync(resolvedPath)){allDiagnostics.push({type:"warning",message:"skill path does not exist",path:resolvedPath});continue}try{let stats=statSync(resolvedPath),source=getSource(resolvedPath);if(stats.isDirectory())addSkills(loadSkillsFromDirInternal2(resolvedPath,source,!0));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let result3=loadSkillFromFile2(resolvedPath,source);result3.skill?addSkills({skills:[result3.skill],diagnostics:result3.diagnostics}):allDiagnostics.push(...result3.diagnostics)}else allDiagnostics.push({type:"warning",message:"skill path is not a markdown file",path:resolvedPath})}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read skill path";allDiagnostics.push({type:"warning",message,path:resolvedPath})}}return{skills:Array.from(skillMap.values()),diagnostics:[...allDiagnostics,...collisionDiagnostics]}}function buildHandoffSection(options={}){let nextRule=options.turnEndRuleStatedElsewhere?"The Next you name is executed in this same response with tool calls.":"The Next you name is executed in this same response with tool calls; a Next with nothing after it is a defect.",betweenRule=options.briefUpdatesBetweenHandoffs?"Between handoffs, a one-line update on what you just found, ending with `Now: [task]. Next: [task].`, helps the user follow along.":"Between handoffs, work without narration.";return`## Handoff
|
|
604
604
|
|
|
605
605
|
A handoff is the todo list's creation (in the message that creates it, after the routing line, or the next one), each todo phase change, a blocker or plan change, and the final message; the routing line is not one. Before writing one, weigh what the user originally asked for and what they would want to know right now; then state it in one short block:
|
|
606
606
|
|
|
@@ -724,7 +724,7 @@ no effect (no persistent shell session). Standard senpi safety
|
|
|
724
724
|
guardrails still apply.
|
|
725
725
|
`;function anthropicBashExtension(pi){pi.on("before_provider_request",(event,ctx)=>addAnthropicBashToPayload(ctx.model?.api,event.payload)),pi.on("before_agent_start",async(event,ctx)=>{if(ctx.model?.api==="anthropic-messages"&&isAnthropicBashEnabled())return{systemPrompt:`${event.systemPrompt}
|
|
726
726
|
${ANTHROPIC_BASH_SECTION}`}},{previewSafe:!0})}import{existsSync as existsSync8,readFileSync as readFileSync13}from"node:fs";import{join as join15}from"node:path";import{createHash}from"node:crypto";var DEFAULT_AFFINITY_KEY="claude-sdk-oauth-default",AllAccountsBlockedError=class extends Error{constructor(soonestUnblockAt3,blockReason){super(soonestUnblockAt3===void 0?"All Anthropic Subscription accounts are blocked until re-login.":`All Anthropic Subscription accounts are blocked until ${new Date(soonestUnblockAt3).toISOString()}.`),this.name="AllAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt3,this.blockReason=blockReason}};function getAffinityKey(options){return options.affinityKey??options.sessionId??DEFAULT_AFFINITY_KEY}function score(key,accountName2){return createHash("sha256").update(`${key}\0${accountName2}`).digest().readBigUInt64BE(0)}function rendezvousOrder2(key,accounts){return[...accounts].map(account=>({account,score:score(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isBlocked(account,now2){return account.blockReason==="auth_error"||account.blockedUntil!==void 0&&account.blockedUntil>now2}function clearExpiredBlocks(accounts,now2=Date.now()){return accounts.map(account=>{if(account.blockReason!=="auth_error"&&account.blockedUntil!==void 0&&account.blockedUntil<=now2){let{blockedUntil:_blockedUntil,blockReason:_blockReason,...available}=account;return available}return account})}function selectUnblocked(accounts,options,now2){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);return pinned&&!isBlocked(pinned,now2)?pinned:rendezvousOrder2(getAffinityKey(options),accounts).find(account=>!isBlocked(account,now2))}function soonestUnblockAt(accounts,now2){let candidates=accounts.map(account=>account.blockedUntil).filter(value2=>value2!==void 0&&value2>now2);return candidates.length===0?void 0:Math.min(...candidates)}function selectAccount(accounts,options={}){let now2=options.now??Date.now(),selected=selectUnblocked(accounts,options,now2);if(selected)return selected;let cleared=clearExpiredBlocks(accounts,now2),afterClear=selectUnblocked(cleared,options,now2);if(afterClear)return afterClear;throw new AllAccountsBlockedError(soonestUnblockAt(accounts,now2),accounts.some(account=>account.blockReason==="auth_error")?"auth_error":void 0)}var systemPromptModeSources=new WeakMap;function isRecord8(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function parseSettingSources(value2){if(Array.isArray(value2)&&value2.every(source=>source==="user"||source==="project"||source==="local"))return[...value2]}function parseEnvironmentSettingSources(value2){if(value2!==void 0)return value2===""?[]:parseSettingSources(value2.split(",").map(source=>source.trim()))}function parseSystemPromptMode(value2){return value2==="preset-append"||value2==="full"||value2==="override"?value2:void 0}function parseResumeMode(value2){return value2==="auto"||value2==="off"?value2:void 0}function parseTokenInjection(value2){return value2==="oauth-slots"||value2==="config-dir"||value2==="ambient"?value2:void 0}function parseEnvironmentBoolean(value2){if(value2!==void 0)switch(value2.toLowerCase()){case"1":case"true":return!0;case"0":case"false":return!1;default:return}}function parseNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function parseProviderSettings(value2){if(!isRecord8(value2))return{};let enabled=typeof value2.enabled=="boolean"?value2.enabled:void 0,appendSystemPrompt=typeof value2.appendSystemPrompt=="boolean"?value2.appendSystemPrompt:void 0,systemPromptMode=parseSystemPromptMode(value2.systemPromptMode),systemPromptFile=parseNonEmptyString(value2.systemPromptFile),resumeMode=parseResumeMode(value2.resumeMode),settingSources=parseSettingSources(value2.settingSources),strictMcpConfig=typeof value2.strictMcpConfig=="boolean"?value2.strictMcpConfig:void 0,pinnedAccount=parseNonEmptyString(value2.pinnedAccount),tokenInjection=parseTokenInjection(value2.tokenInjection);return{...enabled!==void 0?{enabled}:{},...appendSystemPrompt!==void 0?{appendSystemPrompt}:{},...systemPromptMode!==void 0?{systemPromptMode}:{},...systemPromptFile!==void 0?{systemPromptFile}:{},...resumeMode!==void 0?{resumeMode}:{},...settingSources!==void 0?{settingSources}:{},...strictMcpConfig!==void 0?{strictMcpConfig}:{},...pinnedAccount!==void 0?{pinnedAccount}:{},...tokenInjection!==void 0?{tokenInjection}:{}}}function parseEnvironmentSettings(environment){let enabled=parseEnvironmentBoolean(environment.SENPI_CLAUDE_SDK_OAUTH_ENABLED),systemPromptMode=parseSystemPromptMode(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_MODE),systemPromptFile=parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_FILE),resumeMode=parseResumeMode(environment.SENPI_CLAUDE_SDK_OAUTH_RESUME),tokenInjection=parseTokenInjection(environment.SENPI_CLAUDE_SDK_OAUTH_TOKEN_INJECTION),settingSources=parseEnvironmentSettingSources(environment.SENPI_CLAUDE_SDK_OAUTH_SETTING_SOURCES),pinnedAccount=parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_PINNED_ACCOUNT);return{...enabled!==void 0?{enabled}:{},...systemPromptMode!==void 0?{systemPromptMode}:{},...systemPromptFile!==void 0?{systemPromptFile}:{},...resumeMode!==void 0?{resumeMode}:{},...tokenInjection!==void 0?{tokenInjection}:{},...settingSources!==void 0?{settingSources}:{},...pinnedAccount!==void 0?{pinnedAccount}:{}}}function resolveSystemPromptMode(settings){return settings.systemPromptMode!==void 0?{mode:settings.systemPromptMode,source:systemPromptModeSources.get(settings)??"setting",conflict:settings.appendSystemPrompt!==void 0}:settings.appendSystemPrompt!==void 0?{mode:settings.appendSystemPrompt?"full":"preset-append",source:"legacy",conflict:!1}:{mode:"full",source:"default",conflict:!1}}function loadAnthropicSubscriptionProviderSettings(settingsManager,environment=process.env){let global=settingsManager.getGlobalSettings(),project=settingsManager.getProjectSettings(),environmentSettings=parseEnvironmentSettings(environment),settings={...parseProviderSettings(global.anthropicSubscriptionProvider??global.claudeSdkOauthProvider),...parseProviderSettings(project.anthropicSubscriptionProvider??project.claudeSdkOauthProvider),...environmentSettings};return environmentSettings.systemPromptMode!==void 0&&systemPromptModeSources.set(settings,"env"),settings}function settingsFingerprint(path13){return getFileContentRevision(path13)??"missing"}var cachedAnthropicSubscriptionManager;function loadAnthropicSubscriptionProviderSettingsFromDisk(cwd){let agentDir=getAgentDir(),key=`${cwd}|${settingsFingerprint(getSettingsPath(cwd,agentDir,"global"))}|${settingsFingerprint(getSettingsPath(cwd,agentDir,"project"))}`,settingsManager=cachedAnthropicSubscriptionManager?.cwd===cwd&&cachedAnthropicSubscriptionManager.key===key?cachedAnthropicSubscriptionManager.manager:void 0;return settingsManager||(settingsManager=SettingsManager.create(cwd,agentDir),cachedAnthropicSubscriptionManager={cwd,key,manager:settingsManager}),loadAnthropicSubscriptionProviderSettings(settingsManager)}var cliPinsBySession=new Map,ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL="Anthropic Subscription";function asCredential(value2){return value2?.type==="oauth"?value2:void 0}function slotStatus(slot){return slot.blockReason==="auth_error"?"blocked until re-login":slot.blockedUntil!==void 0&&slot.blockedUntil>Date.now()?`blocked until ${new Date(slot.blockedUntil).toISOString()}`:"available"}function readAccounts(ctx,environment){let credential=asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID));return{credential,accounts:listAccounts(credential??emptyCredential(),environment)}}function accountError(ctx,name){ctx.ui.notify(`Anthropic Subscription account '${name}' does not exist.`,"error")}function parseArgs3(rawArgs){return rawArgs.trim().split(/\s+/).filter(Boolean)}function getSessionClaudeAccountPin(sessionId){return sessionId===void 0?void 0:cliPinsBySession.get(sessionId)}function resolveClaudeAccountPin(cliPinnedAccount,settingsPinnedAccount,storedPinnedAccount){return cliPinnedAccount??settingsPinnedAccount??storedPinnedAccount}function registerClaudeAccountCommand(pi,deps={}){let loadSettings=deps.loadSettings??loadAnthropicSubscriptionProviderSettingsFromDisk,environment=deps.environment??(name=>process.env[name]);pi.registerFlag("claude-account",{type:"string",description:"Pin Anthropic Subscription account for this session."}),pi.on("session_start",(_event,ctx)=>{let flag=pi.getFlag("claude-account"),sessionId=ctx.sessionManager.getSessionId();typeof flag=="string"&&flag.length>0?cliPinsBySession.set(sessionId,flag):cliPinsBySession.delete(sessionId)}),pi.on("session_shutdown",(_event,ctx)=>{cliPinsBySession.delete(ctx.sessionManager.getSessionId())}),pi.registerCommand("claude-account",{description:"List and manage Anthropic Subscription accounts.",argumentHint:"[add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]",handler:async(rawArgs,ctx)=>{if(await accountDisplayNameCommand(ctx,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,rawArgs))return;let args=parseArgs3(rawArgs),action=args[0]??"list";if(action==="list"){showAccounts2(ctx,loadSettings(ctx.cwd),environment);return}if(action==="add"){await addAccount2(ctx,deps);return}if(action==="remove"){await removeNamedAccount(ctx,args[1],environment);return}if(action==="pin"&&args[1]!=="unpin"){await pinNamedAccount(ctx,args[1],environment);return}if(action==="unpin"||action==="pin"&&args[1]==="unpin"){await unpinAccount(ctx);return}ctx.ui.notify("Usage: /claude-account [add | remove <id> | pin <id> | unpin | rename <id> <display name...> | clear-name <id>]","error")}})}function showAccounts2(ctx,settings,environment){let{credential,accounts}=readAccounts(ctx,environment),cliPin=getSessionClaudeAccountPin(ctx.sessionManager.getSessionId()),pinned=resolveClaudeAccountPin(cliPin,settings.pinnedAccount,credential?.pinned),pinSource=cliPin!==void 0?"CLI":settings.pinnedAccount!==void 0?"settings":"stored",affinityPick,affinityError;if(accounts.length>0)try{affinityPick=selectAccount(accounts,{sessionId:ctx.sessionManager.getSessionId(),pinnedAccount:pinned}).name}catch(error2){affinityError=error2 instanceof Error?error2.message:String(error2)}let lines=["Anthropic Subscription accounts:"];accounts.length===0&&lines.push(" (none)");for(let account of accounts){let states2=[accountLabel(account),account.source,slotStatus(account)];account.name===pinned&&states2.push("pinned"),account.name===affinityPick&&states2.push("affinity pick"),lines.push(` ${states2.join(" | ")}`)}let labelFor=name=>accountLabel(accounts.find(account=>account.name===name)??{name});lines.push(`Pinned account: ${pinned===void 0?"none":`${labelFor(pinned)} (${pinSource.toLowerCase()})`}`),lines.push(`Affinity pick: ${affinityPick===void 0?affinityError?`unavailable - ${affinityError}`:"none":labelFor(affinityPick)}`),ctx.ui.notify(lines.join(`
|
|
727
|
-
`),"info")}async function addAccount2(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/claude-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("Anthropic Subscription account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!==LOGIN_CANCELLED_MESSAGE&&ctx.ui.notify(`Failed to add Anthropic Subscription account: ${message}`,"error")}}async function removeNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account remove <name>","error");return}let{accounts}=readAccounts(ctx,environment),target=accounts.find(account=>account.name===name);if(!target)return accountError(ctx,name);if(target.source==="env"){ctx.ui.notify(`Anthropic Subscription account '${name}' comes from the environment and cannot be removed.`,"error");return}try{await removeProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function pinNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account pin <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unpinAccount(ctx){if(!asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID))?.pinned){ctx.ui.notify("No stored Anthropic Subscription account pin is set.","info");return}await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned Anthropic Subscription account.","info")}var CLAUDE_SDK_OAUTH_API_ID="claude-sdk-oauth";import{spawn as spawn2}from"node:child_process";import{readFileSync as readFileSync10,statSync as statSync4}from"node:fs";import{createRequire as createRequire2}from"node:module";import{posix as posix2,win32 as win322}from"node:path";import{createHash as createHash2}from"crypto";import{chmodSync as chmodSync3,existsSync as existsSync5,lstatSync,mkdirSync as mkdirSync3,readFileSync as readFileSync8,renameSync as renameSync4,unlinkSync,writeFileSync as writeFileSync5}from"fs";import{tmpdir as osTmpdir}from"os";import{basename as basename5,join as join9}from"path";function tmpdir(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join9(tmpdir(),process.platform==="win32"?"claude":`claude-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync3(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync3(dir,448)}else try{mkdirSync3(dir,{recursive:!0,mode:448})}catch{}return dir}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync8(embeddedPath),hash=createHash2("sha256").update(content).digest("hex").slice(0,16),tmpDir=join9(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename5(embeddedPath),tmpPath=join9(tmpDir,fileName);if(mkdirSync3(tmpDir,{recursive:!0,mode:448}),existsSync5(tmpPath))return tmpPath;let tmpFile=join9(tmpDir,`${fileName}.tmp.${process.pid}`);writeFileSync5(tmpFile,content),chmodSync3(tmpFile,493);try{renameSync4(tmpFile,tmpPath)}catch(e){if((e.code==="EPERM"||e.code==="EBUSY")&&existsSync5(tmpPath)){try{unlinkSync(tmpFile)}catch{}return tmpPath}throw e}return tmpPath}catch(err2){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err2.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text2=deps.readText?.(batchPath),match=text2===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text2);if(!match?.[1])return;let target=win32.join(win32.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform4,pathext){return platform4!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform4,path13){if(path13===void 0)return[];let delimiter2=platform4==="win32"?";":":";return path13.split(delimiter2).map(entry=>platform4==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join82=deps.platform==="win32"?win32.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path13=join82(directory,candidate);if(!deps.isFile(path13))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win32.extname(path13).toLowerCase()))return path13;let target=nativeTargetOfBatchFile(path13,deps);if(target!==void 0)return target;deps.onSkip?.(path13)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync9}from"node:fs";import{dirname as dirname7,join as join10}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text2){let match=text2===void 0?null:VERSION_PATTERN.exec(text2);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath2(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync9(join10(dirname7(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform4,arch3,preferMusl=!1){let ext=platform4==="win32"?".exe":"";if(platform4==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch3}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch3}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform4}-${arch3}/claude${ext}`]}function spawnableSpelling(platform4,candidate){return platform4==="win32"?win322.toNamespacedPath(win322.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source)=>({executable,source,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
|
|
727
|
+
`),"info")}async function addAccount2(ctx,deps){if(!ctx.hasUI){ctx.ui.notify("/claude-account add requires an interactive UI.","error");return}try{let receipt;await ctx.modelRegistry.modelRuntime.login(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,"oauth",{...createExtensionLoginInteraction(ctx,{providerLabel:ANTHROPIC_SUBSCRIPTION_PROVIDER_LABEL,openBrowser:deps.openBrowser}),onAccountCommitted:committed=>{receipt=committed}}),emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),ctx.ui.notify("Anthropic Subscription account added.","info"),await promptAccountDisplayName(ctx,receipt)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);message!==LOGIN_CANCELLED_MESSAGE&&ctx.ui.notify(`Failed to add Anthropic Subscription account: ${message}`,"error")}}async function removeNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account remove <name>","error");return}let{accounts}=readAccounts(ctx,environment),target=accounts.find(account=>account.name===name);if(!target)return accountError(ctx,name);if(target.source==="env"){ctx.ui.notify(`Anthropic Subscription account '${name}' comes from the environment and cannot be removed.`,"error");return}try{await removeProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Removed Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function pinNamedAccount(ctx,name,environment){if(!name){ctx.ui.notify("Usage: /claude-account pin <name>","error");return}if(!readAccounts(ctx,environment).accounts.some(account=>account.name===name))return accountError(ctx,name);try{await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,name),ctx.ui.notify(`Pinned Anthropic Subscription account: ${name}.`,"info")}catch(error2){ctx.ui.notify(error2 instanceof Error?error2.message:String(error2),"error")}}async function unpinAccount(ctx){if(!asCredential(ctx.modelRegistry.authStorage.get(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID))?.pinned){ctx.ui.notify("No stored Anthropic Subscription account pin is set.","info");return}await pinProviderAccount(ctx.modelRegistry.authStorage,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,null),ctx.ui.notify("Unpinned Anthropic Subscription account.","info")}var CLAUDE_SDK_OAUTH_API_ID="claude-sdk-oauth";import{spawn as spawn2}from"node:child_process";import{readFileSync as readFileSync10,statSync as statSync4}from"node:fs";import{createRequire as createRequire2}from"node:module";import{posix as posix2,win32 as win322}from"node:path";import{createHash as createHash2}from"crypto";import{chmodSync as chmodSync3,existsSync as existsSync5,lstatSync,mkdirSync as mkdirSync3,readFileSync as readFileSync8,renameSync as renameSync4,unlinkSync,writeFileSync as writeFileSync5}from"fs";import{tmpdir as osTmpdir}from"os";import{basename as basename5,join as join9}from"path";function tmpdir(){return process.env.CLAUDE_CODE_TMPDIR?process.env.CLAUDE_CODE_TMPDIR:process.platform==="darwin"?"/tmp":osTmpdir()}function safeTempBase(){let dir=join9(tmpdir(),process.platform==="win32"?"claude":`claude-${process.getuid?.()??0}`);if(typeof process.getuid=="function"){mkdirSync3(dir,{recursive:!0,mode:448});let uid=process.getuid(),st=lstatSync(dir);if(!st.isDirectory())throw new Error(`Temp directory ${dir} is not a directory (may be an attacker-planted symlink). Refusing to use it.`);if(st.uid!==uid)throw new Error(`Temp directory ${dir} is owned by uid ${st.uid}, expected ${uid}. Refusing to use it \u2014 another user may have pre-created it.`);(st.mode&511)!==448&&chmodSync3(dir,448)}else try{mkdirSync3(dir,{recursive:!0,mode:448})}catch{}return dir}function extractFromBunfs(embeddedPath){if(!embeddedPath.includes("$bunfs")&&!embeddedPath.includes("~BUN"))return embeddedPath;try{let content=readFileSync8(embeddedPath),hash=createHash2("sha256").update(content).digest("hex").slice(0,16),tmpDir=join9(safeTempBase(),`claude-agent-sdk-${hash}`),fileName=basename5(embeddedPath),tmpPath=join9(tmpDir,fileName);if(mkdirSync3(tmpDir,{recursive:!0,mode:448}),existsSync5(tmpPath))return tmpPath;let tmpFile=join9(tmpDir,`${fileName}.tmp.${process.pid}`);writeFileSync5(tmpFile,content),chmodSync3(tmpFile,493);try{renameSync4(tmpFile,tmpPath)}catch(e){if((e.code==="EPERM"||e.code==="EBUSY")&&existsSync5(tmpPath)){try{unlinkSync(tmpFile)}catch{}return tmpPath}throw e}return tmpPath}catch(err2){return console.warn(`[claude-agent-sdk] Failed to extract CLI from $bunfs: ${err2.message}. Child processes cannot access $bunfs paths \u2014 the CLI will likely fail to start.`),embeddedPath}}import{posix,win32}from"node:path";var WIN32_BATCH_EXTENSIONS=new Set([".bat",".cmd"]),CMD_SHIM_NATIVE_TARGET=/"%~?dp0%?\\([^"%]+?\.exe)"/i;function nativeTargetOfBatchFile(batchPath,deps){let text2=deps.readText?.(batchPath),match=text2===void 0?null:CMD_SHIM_NATIVE_TARGET.exec(text2);if(!match?.[1])return;let target=win32.join(win32.dirname(batchPath),match[1]);return deps.isFile(target)?target:void 0}var WIN32_DEFAULT_PATHEXT=".COM;.EXE;.BAT;.CMD";function namesToProbe(name,platform4,pathext){return platform4!=="win32"?[name]:(pathext??WIN32_DEFAULT_PATHEXT).split(";").filter(extension=>extension.length>0).map(extension=>extension.toLowerCase()).map(extension=>`${name}${extension}`)}function pathDirectories(platform4,path13){if(path13===void 0)return[];let delimiter2=platform4==="win32"?";":":";return path13.split(delimiter2).map(entry=>platform4==="win32"?entry.replace(/^"(.*)"$/,"$1"):entry).filter(entry=>entry.length>0)}function findExecutableOnPath(name,deps){let join83=deps.platform==="win32"?win32.join:posix.join,names=namesToProbe(name,deps.platform,deps.env("PATHEXT"));for(let directory of pathDirectories(deps.platform,deps.env("PATH")))for(let candidate of names){let path13=join83(directory,candidate);if(!deps.isFile(path13))continue;if(deps.platform!=="win32"||!WIN32_BATCH_EXTENSIONS.has(win32.extname(path13).toLowerCase()))return path13;let target=nativeTargetOfBatchFile(path13,deps);if(target!==void 0)return target;deps.onSkip?.(path13)}}import{execFileSync}from"node:child_process";import{readFileSync as readFileSync9}from"node:fs";import{dirname as dirname7,join as join10}from"node:path";import{fileURLToPath as fileURLToPath2}from"node:url";var VERSION_PATTERN=/(\d+)\.(\d+)\.(\d+)/,VERSION_PROBE_TIMEOUT_MS=5e3;function parseClaudeCodeVersion(text2){let match=text2===void 0?null:VERSION_PATTERN.exec(text2);if(match)return[Number(match[1]),Number(match[2]),Number(match[3])]}function isNewerClaudeCodeVersion(candidate,baseline){let left=parseClaudeCodeVersion(candidate),right=parseClaudeCodeVersion(baseline);if(left===void 0||right===void 0)return!1;for(let index=0;index<3;index++)if(left[index]!==right[index])return left[index]>right[index];return!1}var probedVersions=new Map;function probeClaudeCodeVersion(executable){if(probedVersions.has(executable))return probedVersions.get(executable);let version;try{let output=execFileSync(executable,["--version"],{encoding:"utf8",timeout:VERSION_PROBE_TIMEOUT_MS,windowsHide:!0,stdio:["ignore","pipe","ignore"]});version=VERSION_PATTERN.exec(output)?.[0]}catch{version=void 0}return probedVersions.set(executable,version),version}function bundledClaudeCodeVersion(){try{let entry=fileURLToPath2(import.meta.resolve("@anthropic-ai/claude-agent-sdk")),manifest=JSON.parse(readFileSync9(join10(dirname7(entry),"package.json"),"utf8"));return typeof manifest!="object"||manifest===null||!("claudeCodeVersion"in manifest)?void 0:typeof manifest.claudeCodeVersion=="string"?manifest.claudeCodeVersion:void 0}catch{return}}function claudeCodeExecutableCandidates(platform4,arch3,preferMusl=!1){let ext=platform4==="win32"?".exe":"";if(platform4==="linux"){let glibc=`@anthropic-ai/claude-agent-sdk-linux-${arch3}/claude${ext}`,musl=`@anthropic-ai/claude-agent-sdk-linux-${arch3}-musl/claude${ext}`;return preferMusl?[musl,glibc]:[glibc,musl]}return[`@anthropic-ai/claude-agent-sdk-${platform4}-${arch3}/claude${ext}`]}function spawnableSpelling(platform4,candidate){return platform4==="win32"?win322.toNamespacedPath(win322.resolve(candidate)):posix2.resolve(candidate)}function describeClaudeCodeExecutable(deps){let tried=[],accept=candidate=>{let spelled=spawnableSpelling(deps.platform,candidate);return tried.push(spelled),deps.isFile(spelled)?spelled:void 0},done=(executable,source)=>({executable,source,tried}),override=deps.env("CLAUDE_CODE_EXECUTABLE");if(override){let accepted=accept(override);if(accepted!==void 0)return done(accepted,"override")}let candidates=claudeCodeExecutableCandidates(deps.platform,deps.arch,deps.platform==="linux"&&deps.isMusl?.()===!0),bundled=acceptBundled(deps,candidates,accept,tried);if(bundled!==void 0){let newer=newerClaudeOnPath(deps,bundled);return newer===void 0?done(bundled,"bundled"):(tried.push(newer),done(newer,"path"))}let onPath=findExecutableOnPath("claude",{...deps,onSkip:batchFile=>tried.push(`${batchFile} (batch file wrapping no native binary)`)});if(onPath!==void 0){let accepted=accept(onPath);if(accepted!==void 0)return done(accepted,"path")}else tried.push(deps.env("PATH")?"claude on PATH":"claude on PATH (PATH is unset)");return{executable:void 0,source:void 0,tried}}function acceptBundled(deps,candidates,accept,tried){if(deps.isCompiledBun?.()&&deps.extractFromBunfs)for(let candidate of candidates){let extracted;try{extracted=deps.extractFromBunfs(deps.resolve(candidate))}catch{continue}let accepted=accept(extracted);if(accepted!==void 0)return accepted}for(let candidate of candidates){let resolved;try{resolved=deps.resolve(candidate)}catch{tried.push(candidate);continue}let accepted=accept(resolved);if(accepted!==void 0)return accepted}}function newerClaudeOnPath(deps,bundled){let versionOf=deps.versionOf;if(versionOf===void 0)return;let onPath=findExecutableOnPath("claude",deps);if(onPath===void 0)return;let spelled=spawnableSpelling(deps.platform,onPath);if(spelled===bundled||!deps.isFile(spelled))return;let pathVersion=versionOf(spelled);if(pathVersion===void 0)return;let bundledVersion=deps.bundledVersion?.()??versionOf(bundled);return isNewerClaudeCodeVersion(pathVersion,bundledVersion)?spelled:void 0}function resolveClaudeCodeExecutable(deps){return resolveClaudeCodeRun(deps).executable}function resolveClaudeCodeRun(deps){let resolution=describeClaudeCodeExecutable(deps);if(resolution.executable!==void 0&&resolution.source!==void 0)return{executable:resolution.executable,source:resolution.source};throw new Error([`Claude Code executable not found for ${deps.platform}-${deps.arch}. Tried:`,...resolution.tried.map(candidate=>` - ${candidate}`),"Reinstall @anthropic-ai/claude-agent-sdk without --omit=optional, install Claude Code so `claude` is on PATH, or set CLAUDE_CODE_EXECUTABLE to the binary."].join(`
|
|
728
728
|
`))}var defaultRequire=null,isCompiledBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN");function isMuslLinuxRuntime(){if(process.platform!=="linux"||typeof process.report?.getReport!="function")return!1;let report=process.report.getReport();return report===null||!("header"in report)||typeof report.header!="object"||report.header===null?!1:!("glibcVersionRuntime"in report.header)||report.header.glibcVersionRuntime===void 0}function readBatchFileText(path13){try{return readFileSync10(path13,"utf8")}catch{return}}function isRegularFile(path13){try{return statSync4(path13).isFile()}catch{return!1}}var defaultDeps={platform:process.platform,arch:process.arch,env:name=>process.env[name],isFile:isRegularFile,readText:readBatchFileText,isMusl:isMuslLinuxRuntime,isCompiledBun:()=>isCompiledBunBinary,extractFromBunfs,bundledVersion:bundledClaudeCodeVersion,versionOf:probeClaudeCodeVersion,resolve:spec=>(defaultRequire||(defaultRequire=createRequire2(import.meta.resolve("@anthropic-ai/claude-agent-sdk"))),defaultRequire.resolve(spec))},activeDeps=defaultDeps;function defaultExecutableDeps(){return activeDeps}var AMBIENT_STATUS_TTL_MS=3e4,AMBIENT_PROBE_TIMEOUT_MS=1e4;function createAmbientAuthStatusReader(probe,now2=Date.now,ttlMs=AMBIENT_STATUS_TTL_MS){let cached,inFlight,startProbe=()=>{let status=probe().then(value2=>(cached={at:now2(),value:value2},value2));inFlight=status;let clear=()=>{inFlight===status&&(inFlight=void 0)};return status.then(clear,clear),status};return signal=>signal?.aborted?Promise.reject(signal.reason):cached&&now2()-cached.at<ttlMs?Promise.resolve(cached.value):untilAborted(inFlight??startProbe(),signal)}function untilAborted(status,signal){if(signal===void 0)return status;if(signal.aborted)return Promise.reject(signal.reason);let abortController=new AbortController,aborted=new Promise((_resolve,reject)=>{signal.addEventListener("abort",()=>reject(signal.reason),{once:!0,signal:abortController.signal})});return Promise.race([status,aborted]).finally(()=>abortController.abort())}async function probeAmbientClaudeAuthStatus(options={}){let timeoutMs=options.timeoutMs??AMBIENT_PROBE_TIMEOUT_MS,spawnProbe=options.spawnProbe??((command,args)=>spawn2(command,[...args],{stdio:"ignore",windowsHide:!0})),executable;try{executable=resolveClaudeCodeExecutable(defaultExecutableDeps())}catch{return!1}return new Promise(resolve42=>{let settled=!1,finish=available=>{settled||(settled=!0,clearTimeout(deadline),resolve42(available))},child=spawnProbe(executable,["auth","status"]),deadline=setTimeout(()=>{child.kill("SIGKILL"),finish(!1)},timeoutMs);deadline.unref?.(),child.once("error",()=>finish(!1)),child.once("close",code=>finish(code===0))})}var readAmbientClaudeAuthStatus=createAmbientAuthStatusReader(probeAmbientClaudeAuthStatus);var ANTHROPIC_SUBSCRIPTION_NAME="Anthropic Subscription (Claude Pro/Max)",ENV_TOKEN_NAMES=["CLAUDE_CODE_OAUTH_TOKEN",...Array.from({length:15},(_,index)=>`CLAUDE_CODE_OAUTH_TOKEN_${index+2}`)],ENV_TOKEN_NAME_SET=new Set(ENV_TOKEN_NAMES),AUTH_CHECK={source:"Anthropic Subscription",type:"oauth"};function requestClaudeEnvironment(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let environment={};for(let[name,entry]of Object.entries(value2))ENV_TOKEN_NAME_SET.has(name)&&typeof entry=="string"&&(environment[name]=entry);return environment}function toSlot(credential,name,source){return{name,access:credential.access,refresh:credential.refresh,expires:credential.expires,source}}function recoveryTargetName(existing){if(existing.length===1)return existing[0]?.name;let authBlocked=existing.filter(slot=>slot.blockReason==="auth_error");if(authBlocked.length===1)return authBlocked[0]?.name}async function promptAccountName(callbacks,existing){if(existing.length===0)return"default";let recovery=recoveryTargetName(existing),fallback=`account-${existing.length+1}`;if(!callbacks.onPrompt)return recovery??fallback;let names=existing.map(slot=>slot.name).join(", "),message=recovery===void 0?`Name for this account (existing: ${names}; press Enter to add ${fallback}, or type an existing name to refresh it)`:`Name for this account (existing: ${names}; press Enter to refresh '${recovery}' with this login)`;return(await callbacks.onPrompt({message,placeholder:recovery??fallback})).trim()||recovery||fallback}function createOAuthConfig(deps){let claudeEnvironment=async ctx=>{let entries=await Promise.all(ENV_TOKEN_NAMES.map(async name=>[name,await ctx.env(name)]));return Object.fromEntries(entries.filter(entry=>entry[1]!==void 0))},configuredFor=async(ctx,stored,signal,environment)=>{let storedAccounts2=stored?.type==="oauth"&&Array.isArray(stored.accounts)?stored.accounts:[],selectedStoredAccount=stored?.type==="oauth"&&stored.access!==SENTINEL_OAUTH_FIELDS.access&&stored.refresh!==SENTINEL_OAUTH_FIELDS.refresh,effectiveEnvironment=environment??await claudeEnvironment(ctx),environmentTokenCount=Object.values(effectiveEnvironment).filter(Boolean).length,accountCount=storedAccounts2.length+(selectedStoredAccount?1:0)+environmentTokenCount,settings=deps.readSettings?.();return(settings?.tokenInjection??(accountCount>0?"oauth-slots":"ambient"))==="ambient"?environmentTokenCount>0?!0:settings?.enabled!==!0?!1:(deps.readAmbientAuthStatus??readAmbientClaudeAuthStatus)(signal):accountCount>0};return{name:ANTHROPIC_SUBSCRIPTION_NAME,async check({ctx,credential,signal}){let requestEnvironment=requestClaudeEnvironment(credential?.env);return await configuredFor(ctx,credential,signal,Object.keys(requestEnvironment).length>0?requestEnvironment:void 0)?AUTH_CHECK:void 0},async resolveAmbient({ctx,env,signal}){let requestEnvironment=requestClaudeEnvironment(env),environment=Object.keys(requestEnvironment).length>0?requestEnvironment:await claudeEnvironment(ctx);if(await configuredFor(ctx,void 0,signal,environment))return{auth:{apiKey:SENTINEL_OAUTH_FIELDS.access},...Object.keys(environment).length>0?{env:environment}:{},source:AUTH_CHECK.source}},async login(callbacks){let current=await deps.readCurrent()??emptyCredential();if(listAccounts(current).length===0&&deps.readAnthropicCredential&&callbacks.onPrompt){let imported=await deps.readAnthropicCredential();if(imported){let answer=(await callbacks.onPrompt({message:"An Anthropic OAuth login already exists. Move it here (the anthropic provider is logged out) instead of a new login? [y/N]"})).trim().toLowerCase();if(answer==="y"||answer==="yes")return await deps.removeAnthropicCredential?.(),addAccount(current,toSlot(imported,"imported-anthropic","import"))}}let interaction={signal:callbacks.signal??new AbortController().signal,prompt:async prompt=>prompt.type==="select"?"":callbacks.onPrompt?callbacks.onPrompt({message:prompt.message}):"",notify:event=>{event.type==="auth_url"&&callbacks.onAuth&&callbacks.onAuth({url:event.url}),event.type==="progress"&&callbacks.onProgress&&callbacks.onProgress(event.message)}},credential=await(deps.loginFlow??await loadAnthropicOAuth()).login(interaction),existingAfter=listAccounts(current),name=await promptAccountName(callbacks,existingAfter);return upsertAccount(current,toSlot(credential,name,"login"))},async refreshToken(credentials){return credentials},getApiKey(_credentials){return SENTINEL_OAUTH_FIELDS.access}}}import{createHash as createHash3}from"node:crypto";var IMAGE_MEDIA_TYPES=["image/jpeg","image/png","image/gif","image/webp"];function appendSdkContentBlocks(blocks,content){if(typeof content=="string")return content.length>0&&blocks.push({type:"text",text:content}),content.trim().length>0;let hasText=!1;for(let entry of content)hasText=appendEntry(blocks,entry)||hasText;return hasText}function isRecord9(value2){return typeof value2=="object"&&value2!==null}function parseImageMediaType(value2){for(let mediaType of IMAGE_MEDIA_TYPES)if(mediaType===value2)return mediaType}function omittedPlaceholder(entry){return isRecord9(entry)&&typeof entry.type=="string"?entry.type==="image"?typeof entry.mimeType=="string"&&typeof entry.data=="string"?`[image block omitted: unsupported media type ${entry.mimeType}]`:"[image block omitted: missing data]":`[unsupported content block omitted: ${entry.type}]`:"[unsupported content block omitted]"}function imageFromEntry(entry){if(typeof entry.mimeType!="string"||typeof entry.data!="string")return;let mediaType=parseImageMediaType(entry.mimeType);if(mediaType!==void 0)return{type:"image",source:{type:"base64",media_type:mediaType,data:entry.data}}}function appendEntry(blocks,entry){if(typeof entry=="string")return blocks.push({type:"text",text:entry}),entry.trim().length>0;if(!isRecord9(entry))return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0;if(entry.type==="text")return typeof entry.text=="string"?(blocks.push({type:"text",text:entry.text}),entry.text.trim().length>0):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0);if(entry.type==="image"){let image=imageFromEntry(entry);return image?(blocks.push(image),!1):(blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0)}return blocks.push({type:"text",text:omittedPlaceholder(entry)}),!0}var SDK_TO_PI_TOOL_NAME={read:"read",write:"write",edit:"edit",bash:"bash",grep:"grep",glob:"find"},PI_TO_SDK_TOOL_NAME={read:"Read",write:"Write",edit:"Edit",bash:"Bash",grep:"Grep",find:"Glob",glob:"Glob"},HOST_TOOL_POLICY_FINGERPRINT="host-tool-denial-v2",BUILTIN_SDK_TOOLS=["Read","Write","Edit","Bash","Grep","Glob"],TOOL_EXECUTION_DENIED_MESSAGE="Senpi executes this tool on the host and returns its result as the next user message. Wait for that result; this denial is not a failure.",HOST_TOOL_EXECUTION_DENIED_MESSAGE=TOOL_EXECUTION_DENIED_MESSAGE,CUSTOM_TOOLS_MCP_SERVER_NAME="custom-tools",CUSTOM_TOOLS_MCP_PREFIX=`mcp__${CUSTOM_TOOLS_MCP_SERVER_NAME}__`,HOST_CAPTURED_SDK_TOOL_MATCHER="Bash|Write|Edit|Read|Grep|Glob|mcp__custom-tools__.*",HOST_TOOL_DENIAL_HOOKS={PreToolUse:[{matcher:HOST_CAPTURED_SDK_TOOL_MATCHER,hooks:[async()=>({continue:!1,hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:HOST_TOOL_EXECUTION_DENIED_MESSAGE}})]}]};function pascalCase(value2){return value2.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(part=>`${part[0]?.toUpperCase()??""}${part.slice(1)}`).join("")}function mapPiToolNameToSdk(name,customToolNameToSdk){let normalized2=name.toLowerCase();return customToolNameToSdk?.get(name)??customToolNameToSdk?.get(normalized2)??PI_TO_SDK_TOOL_NAME[normalized2]??pascalCase(name)}function mapSdkToolNameToPi(name,customToolNameToPi){let normalized2=name.toLowerCase();return SDK_TO_PI_TOOL_NAME[normalized2]??customToolNameToPi?.get(name)??customToolNameToPi?.get(normalized2)??(normalized2.startsWith(CUSTOM_TOOLS_MCP_PREFIX)?name.slice(CUSTOM_TOOLS_MCP_PREFIX.length):name)}function mapToolArgs(toolName,args){let input=args??{};switch(toolName.toLowerCase()){case"read":return{path:input.file_path??input.path,offset:input.offset,limit:input.limit};case"write":return{path:input.file_path??input.path,content:input.content};case"edit":return{path:input.file_path??input.path,edits:Array.isArray(input.edits)?input.edits:[{oldText:input.old_string??input.oldText??input.old_text,newText:input.new_string??input.newText??input.new_text}]};case"bash":return{command:input.command,timeout:typeof input.timeout=="number"?input.timeout/1e3:input.timeout};case"grep":return{pattern:input.pattern,path:input.path,glob:input.glob,ignoreCase:input["-i"]??input.ignoreCase,context:input.context??input["-C"],limit:input.head_limit??input.limit};case"glob":case"find":return{pattern:input.pattern,path:input.path,limit:input.limit};default:return{...input}}}function resolveSdkTools(context){if(!context.tools)return{sdkTools:[...BUILTIN_SDK_TOOLS],customTools:[],customToolNameToSdk:new Map,customToolNameToPi:new Map};let sdkTools2=new Set,customTools=[],customToolNameToSdk=new Map,customToolNameToPi=new Map;for(let tool of context.tools){let normalized2=tool.name.toLowerCase(),sdkName=PI_TO_SDK_TOOL_NAME[normalized2];if(sdkName){sdkTools2.add(sdkName);continue}let customSdkName=`${CUSTOM_TOOLS_MCP_PREFIX}${tool.name}`;customTools.push(tool),customToolNameToSdk.set(tool.name,customSdkName),customToolNameToSdk.set(normalized2,customSdkName),customToolNameToPi.set(customSdkName,tool.name),customToolNameToPi.set(customSdkName.toLowerCase(),tool.name)}return{sdkTools:[...sdkTools2],customTools,customToolNameToSdk,customToolNameToPi}}var canUseTool=async()=>({behavior:"deny",message:TOOL_EXECUTION_DENIED_MESSAGE});var sentHashesByEntry=new WeakMap;function stableValue(value2,seen=new WeakSet){if(typeof value2=="function")return`[function:${value2.name}:${value2.toString()}]`;if(typeof value2=="bigint")return value2.toString();if(value2===null||typeof value2!="object")return value2;if(seen.has(value2))return"[circular]";seen.add(value2);let normalized2=Array.isArray(value2)?value2.map(item=>stableValue(item,seen)):Object.fromEntries(Object.entries(value2).filter(([,item])=>item!==void 0).sort(([left],[right])=>left.localeCompare(right)).map(([key,item])=>[key,stableValue(item,seen)]));return seen.delete(value2),normalized2}function digest(value2){return createHash3("sha256").update(JSON.stringify(stableValue(value2))).digest("hex")}function sessionSyncDigest(value2){return digest(value2)}function isContentlessUserMessage(message){return message.role!=="user"?!1:Array.isArray(message.content)&&message.content.length===0}function sentMessages(context){return context.messages.filter(isTransmittedMessage)}function isTransmittedMessage(message){return message.role!=="user"&&message.role!=="toolResult"?!1:!isContentlessUserMessage(message)}function sentMessageHashes(messages){return messages.filter(isTransmittedMessage).map(message=>digest(message.role==="user"?{role:message.role,content:message.content}:{role:message.role,toolCallId:message.toolCallId,toolName:message.toolName,content:message.content}))}function sentHashPrefixDigest(hashes,count=hashes.length){return digest(hashes.slice(0,count))}function sentHashesForEntry(entry){return sentHashesByEntry.get(entry)}function recordSyncedStream(entry,hashes){let copy=[...hashes];sentHashesByEntry.set(entry,copy),entry.sentCount=copy.length,entry.syncedPrefixHash=sentHashPrefixDigest(copy),entry.branchInfo=null}function configFingerprint(options,context,authLane,accountName2){return{systemPromptHash:digest(options.systemPrompt??null),toolsetHash:digest({tools:options.tools??[],reasoning:{thinking:options.thinking,effort:options.effort,maxThinkingTokens:options.maxThinkingTokens},contextTools:(context.tools??[]).map(tool=>({name:tool.name,description:tool.description,parameters:tool.parameters})),cwd:options.cwd,authLane,accountName:accountName2,permissionMode:options.permissionMode,hostToolPolicy:HOST_TOOL_POLICY_FINGERPRINT,settingSources:options.settingSources,extraArgs:options.extraArgs,pathToClaudeCodeExecutable:options.pathToClaudeCodeExecutable,includePartialMessages:options.includePartialMessages})}}function appendContent(blocks,content){if(content===""){blocks.push({type:"text",text:""});return}appendSdkContentBlocks(blocks,content)}function buildDeltaPromptBlocks(messages,customToolNameToSdk){let blocks=[];for(let[index,message]of messages.entries())index>0&&blocks.push({type:"text",text:`
|
|
729
729
|
|
|
730
730
|
`}),message.role==="toolResult"&&blocks.push({type:"text",text:`Tool result (${mapPiToolNameToSdk(message.toolName,customToolNameToSdk)}, id=${message.toolCallId}):
|
|
@@ -1258,11 +1258,11 @@ ${JSON.stringify(entry.schema??{},null,2)}`);let args;try{let parsed=JSON.parse(
|
|
|
1258
1258
|
`))}async function reconnectServer(name,ctx,pi,service3){if(ensureKnown(name,ctx,service3))try{await service3.reconnectServer(name),await service3.attachSession({type:"session_start",reason:"reload"},ctx,pi),ctx.ui.notify(`MCP reconnect ${name} connected`)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`MCP reconnect ${name} failed: ${message}`,"error")}}function ensureKnown(name,ctx,service3){if(name.length>0&&service3.getServerSnapshots().some(snapshot=>snapshot.name===name))return!0;let known=service3.getServerSnapshots().map(snapshot=>snapshot.name).join(", ");return ctx.ui.notify(`Unknown MCP server: ${name||"<missing>"}
|
|
1259
1259
|
Known MCP servers: ${known||"(none)"}`,"error"),!1}function parseServerConfig(endpoint){let first=endpoint[0]??"";return/^https?:\/\//.test(first)?baseServer({type:"http",url:first}):baseServer({type:"stdio",command:first,args:endpoint.slice(1)})}function baseServer(endpoint){return{args:[],connectTimeoutMs:15e3,enabled:!0,exposure:"auto",idleTimeoutMin:10,lifecycle:"lazy",logLevel:"info",requestTimeoutMs:3e4,startupTimeoutMs:MCP_STARTUP_RACE_MS,...endpoint}}function splitCommandArgs(raw){return(raw.match(/"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+/g)??[]).map(part=>part.replace(/^["']|["']$/g,"").replace(/\\(["'])/g,"$1"))}var registeredCommandNames=new Set;function registerMcpPromptCommands(serviceOrPi,piOrServers,serversArg){let service3=serversArg===void 0?void 0:serviceOrPi,pi=serversArg===void 0?serviceOrPi:piOrServers,servers=serversArg===void 0?piOrServers:serversArg,added=[];for(let server of servers)for(let prompt of server.prompts){let commandName=`mcp:${server.server}:${prompt.name}`;(service3?.isMcpPromptCommandRegistered(commandName)??registeredCommandNames.has(commandName))||(service3?service3.markMcpPromptCommandRegistered(commandName):registeredCommandNames.add(commandName),added.push(commandName),pi.registerCommand(commandName,{description:prompt.description??`MCP prompt ${prompt.name} from ${server.server}`,handler:async(_args,ctx)=>{try{let collected=await collectPromptArguments(prompt.arguments??[],ctx);if(collected===void 0)return;let result3=await server.connection.client.getPrompt({arguments:collected,name:prompt.name},{timeout:server.requestTimeoutMs});ctx.ui.setEditorText(flattenPromptMessages(result3.messages))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);createMcpLogger(server.server).warn(`prompt ${prompt.name} failed: ${message}`),ctx.ui.notify(`MCP prompt ${prompt.name} failed: ${message}`,"error")}}}))}return added}async function collectPromptArguments(declared,ctx){let collected={};for(let argument of declared){let title=`${argument.name}${argument.required?"":" (optional)"}`,value2=await ctx.ui.input(title,argument.description);if(value2!==void 0&&value2.length>0){collected[argument.name]=value2;continue}if(argument.required){ctx.ui.notify(`MCP prompt cancelled: required argument '${argument.name}' not provided.`,"warning");return}}return collected}function flattenPromptMessages(messages){return messages.map(message=>{let content=message.content,text2=typeof content?.text=="string"?content.text:JSON.stringify(message.content);return messages.length>1?`${message.role}: ${text2}`:text2}).join(`
|
|
1260
1260
|
|
|
1261
|
-
`)}import{existsSync as existsSync22,readFileSync as readFileSync28}from"node:fs";import{join as join41}from"node:path";function parseSkillMcpDeclarations(skills){let servers=new Map,warnings=[];for(let skill of skills){let{declared,sourcePath,warning}=readSkillServers(skill);warning!==void 0&&warnings.push(warning);for(let[name,raw]of Object.entries(declared)){let globs=normalizeGlobs(raw.includeTools),existing=servers.get(name);if(existing===void 0){servers.set(name,{includeToolsBySkill:new Map([[skill.name,globs]]),raw,sourcePath});continue}existing.includeToolsBySkill.set(skill.name,globs)}}return{servers,warnings}}function readSkillServers(skill){let sidecarPath=join41(skill.baseDir,"mcp.json");if(existsSync22(sidecarPath))try{let parsed=JSON.parse(readFileSync28(sidecarPath,"utf8"));return{declared:unwrapServerMap(parsed),sourcePath:sidecarPath}}catch(error2){return{declared:{},sourcePath:sidecarPath,warning:`Skill '${skill.name}': invalid mcp.json sidecar skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}try{let{frontmatter}=parseFrontmatter3(readFileSync28(skill.filePath,"utf8"));return frontmatter.mcp===void 0?{declared:{},sourcePath:skill.filePath}:{declared:unwrapServerMap(frontmatter.mcp),sourcePath:skill.filePath}}catch(error2){return{declared:{},sourcePath:skill.filePath,warning:`Skill '${skill.name}': unreadable frontmatter mcp block skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}}function unwrapServerMap(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let record7=value2,map=typeof record7.mcpServers=="object"&&record7.mcpServers!==null?record7.mcpServers:record7,declared={};for(let[name,server]of Object.entries(map))typeof server!="object"||server===null||Array.isArray(server)||(declared[name]=server);return declared}function normalizeGlobs(includeTools){if(!Array.isArray(includeTools))return["*"];let globs=includeTools.filter(glob=>typeof glob=="string"&&glob.length>0);return globs.length>0?globs:["*"]}function matchIncludeTools(globs,toolName){return globs.some(glob=>{let pattern=`^${glob.split("*").map(escapeRegExp3).join(".*")}$`;return new RegExp(pattern).test(toolName)})}function escapeRegExp3(text2){return text2.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function skillActivationTargets(declarations,skillName,registered){let targets=new Set;for(let[serverName2,decl]of declarations.servers){let globs=decl.includeToolsBySkill.get(skillName);if(globs!==void 0)for(let tool of registered)tool.server===serverName2&&matchIncludeTools(globs,tool.toolName)&&targets.add(tool.name)}return[...targets].sort()}var MCP_BUILTIN_EXTENSION_PATH="<builtin:mcp>";function createMcpExtension(service3,sessionOwned=!0){return pi=>{let attachPromise,attachedSessionId,controlInventoryDisposed=!1,unsubscribeControlInventoryRequest=safeEventBusOn(pi.events,MCP_CONTROL_INVENTORY_REQUEST_EVENT,data=>{!isMcpControlInventoryRequest(data)||data.sessionId!==attachedSessionId||data.respond(service3.refreshWireStatusSnapshot(data.sessionId))}),unsubscribeWireStatus=service3.onWireStatusChanged((sessionId,snapshot)=>{sessionId===void 0||sessionId!==attachedSessionId||pi.events.emit(MCP_CONTROL_INVENTORY_CHANGED_EVENT,{sessionId,snapshot})}),disposeControlInventory=()=>{controlInventoryDisposed||(controlInventoryDisposed=!0,unsubscribeControlInventoryRequest(),unsubscribeWireStatus())},sink={logger:{error(message,data){createMcpLogger("service").error(message,data)}}};registerMcpCommands(pi,service3,()=>attachPromise),installMcpNativeToolSearchGate(()=>{let setting=service3.getNativeToolSearchSetting();return setting===!0||setting==="auto"});let skillDecls={servers:new Map,warnings:[]},skillsByName=new Map,loadedSkills=new Set,revealSkill=skillName=>{if(loadedSkills.has(skillName)||!skillsByName.has(skillName))return;loadedSkills.add(skillName);let registered=service3.getTierBSearchable(),targets=skillActivationTargets(skillDecls,skillName,registered);targets.length>0&&service3.activateSkillMcpTools(targets)};pi.on("input",async(event,ctx)=>{let match=/^\s*\/skill:([A-Za-z0-9._-]+)/.exec(event.text);if(match&&revealSkill(match[1]),event.text.includes("@mcp:")){let expansion=await expandMcpResourceMentions(event.text,()=>service3.getMcpResourceServers());for(let notice2 of expansion.notices)createMcpLogger("resources").warn(notice2),ctx.ui?.notify?.(notice2,"warning");if(expansion.changed)return{action:"transform",text:expansion.text}}}),pi.on("tool_call",event=>{if(event.toolName!=="read")return;let path13=event.input.path;if(path13!==void 0)for(let[name,skill]of skillsByName)(path13===skill.filePath||path13.endsWith(skill.filePath))&&revealSkill(name)});let attach=(event,ctx)=>(attachedSessionId=ctx.sessionManager?.getSessionId?.(),attachPromise=(async()=>{await service3.attachSession(event,ctx,pi),refreshMcpInstructionsForSession(service3),sessionOwned?registerMcpPromptCommands(service3,pi,service3.getMcpPromptServers()):registerMcpPromptCommands(pi,service3.getMcpPromptServers())})(),attachPromise),onSessionStart=wrapAsync("mcp.session_start",(event,ctx)=>attach(event,ctx),sink);pi.on("session_start",(event,ctx)=>{let work=onSessionStart(event,ctx)});let onBeforeAgentStart=async(event,ctx)=>{try{let preview=event.preview===!0;preview?await attachPromise:(service3.setMcpElicitationUiProvider(()=>ctx.ui),await(attachPromise??attach({type:"session_start",reason:"startup"},ctx)));let skills=preview?[]:event.systemPromptOptions.skills??[];if(skills.length>0){skillsByName=new Map(skills.map(skill=>[skill.name,skill])),skillDecls=parseSkillMcpDeclarations(skills);let declared=new Map([...skillDecls.servers].map(([name,decl])=>[name,{raw:decl.raw,sourcePath:decl.sourcePath}])),warnings=[...skillDecls.warnings,...declared.size>0?await service3.attachSkillMcpServers(declared):[]];for(let warning of warnings)createMcpLogger("skills").warn(warning)}await service3.whenAttachSettled()==="timeout"&&createMcpLogger("service").warn("MCP attach still settling at prompt build",{timeoutMs:MCP_ATTACH_SETTLE_TIMEOUT_MS});let systemPrompt=injectMcpInstructions(service3,event.systemPrompt);return systemPrompt===void 0?void 0:{systemPrompt}}catch(error2){if(!(error2 instanceof Error))throw error2;await reportMcpAsyncError("mcp.before_agent_start",error2,sink);return}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("session_shutdown",wrapAsync("mcp.session_shutdown",async event=>{event.reason==="reload"&&!sessionOwned||(disposeControlInventory(),await service3.handleSessionShutdown(event))},sink)),pi.on("session_extensions_removed",wrapAsync("mcp.session_extensions_removed",async event=>{event.removed.some(extension=>extension.path===MCP_BUILTIN_EXTENSION_PATH)&&(disposeControlInventory(),await service3.dispose("reload"))},sink))}}function hasProviderScope(){try{return bindToProviderScope(()=>{}),!0}catch{return!1}}function mcpExtension(pi){let sessionOwned=hasProviderScope();return createMcpExtension(sessionOwned?new McpService:getMcpService(),sessionOwned)(pi)}var BARE_EXPANSION_DENYLIST=new Set(["cursor","openrouter","openrouter-images"]),PROVIDER_PRECEDENCE=["anthropic-subscription","anthropic","kimi-coding"];function authTier(model,tiers){return tiers.isUsingOAuth(model)?0:tiers.hasConfiguredAuth?.(model)===!0?1:2}var MAX_PROVIDERS_PER_FAMILY=2;function parseBareSelector(raw){let trimmed=raw.trim();if(!trimmed||trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{family:trimmed.toLowerCase()};let suffix=trimmed.slice(lastColon+1).toLowerCase();if(!isValidThinkingLevel(suffix))return{family:trimmed.toLowerCase()};let family=trimmed.slice(0,lastColon).trim().toLowerCase();return family?{family,thinkingLevel:suffix}:void 0}function withoutNamespace(modelId){let cut=Math.max(modelId.lastIndexOf("."),modelId.lastIndexOf("/"));return cut===-1?modelId:modelId.slice(cut+1)}function matchesFamily(model,family){return[model.id.toLowerCase(),withoutNamespace(model.id.toLowerCase())].some(id=>id===family||id.startsWith(`${family}-`))}function pickVariant2(models,family){return[...models].sort((left,right)=>{let exact=+(withoutNamespace(right.id.toLowerCase())===family)-+(withoutNamespace(left.id.toLowerCase())===family);return exact!==0?exact:left.id.length!==right.id.length?left.id.length-right.id.length:left.id.localeCompare(right.id)})[0]}function precedenceIndex(provider){let index=PROVIDER_PRECEDENCE.indexOf(provider.toLowerCase());return index===-1?PROVIDER_PRECEDENCE.length:index}function rankFamilyModels(models,family,tiers,options={}){let byProvider=new Map;for(let model of models){if(BARE_EXPANSION_DENYLIST.has(model.provider.toLowerCase())||tiers.isFallbackEligible?.(model)===!1||!matchesFamily(model,family))continue;let bucket=byProvider.get(model.provider);bucket?bucket.push(model):byProvider.set(model.provider,[model])}let ranked=[...byProvider.values()].flatMap(variants=>{let variant=pickVariant2(variants,family);return variant?[variant]:[]}).sort((left,right)=>{let tier=authTier(left,tiers)-authTier(right,tiers);if(tier!==0)return tier;let precedence=precedenceIndex(left.provider)-precedenceIndex(right.provider);return precedence!==0?precedence:left.provider.localeCompare(right.provider)}),limit=options.limit??ranked.length;return ranked.slice(0,limit)}function availableModels(lookup){return"getAll"in lookup?lookup.getAll():[...lookup]}function authTiers(lookup){if(Array.isArray(lookup))return{isUsingOAuth:()=>!1};let registry=lookup;return{isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:typeof registry.hasConfiguredAuth=="function"?model=>registry.hasConfiguredAuth?.(model)===!0:void 0,isFallbackEligible:typeof registry.isFallbackEligible=="function"?model=>registry.isFallbackEligible?.(model)!==!1:void 0}}function isChainTombstone(entries){return Array.isArray(entries)&&entries.length===0}function selectorReference(raw){let trimmed=raw.trim();if(!trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{reference:trimmed};let prefix=trimmed.slice(0,lastColon),suffix=trimmed.slice(lastColon+1).toLowerCase();return isValidThinkingLevel(suffix)?{reference:prefix,thinkingLevel:suffix}:{reference:trimmed}}function parseFallbackSelector(raw,lookup){let models=availableModels(lookup),trimmed=raw.trim(),parsedReference=selectorReference(trimmed);if(!parsedReference)return;let fullMatch=findExactModelReferenceMatch(trimmed,models);if(fullMatch)return{raw:trimmed,provider:fullMatch.provider,id:fullMatch.id};let slashIndex=parsedReference.reference.indexOf("/"),provider=parsedReference.reference.slice(0,slashIndex).trim(),modelPattern=parsedReference.reference.slice(slashIndex+1).trim();if(!provider||!modelPattern)return;let providerModels=models.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()),parsed=parseModelPattern(parsedReference.thinkingLevel?`${modelPattern}:${parsedReference.thinkingLevel}`:modelPattern,providerModels,{allowInvalidThinkingLevelFallback:!1});if(!(!parsed.model||parsed.warning)&&!(parsedReference.thinkingLevel&&!parsed.thinkingLevel))return{raw:trimmed,provider:parsed.model.provider,id:parsed.model.id,thinkingLevel:parsed.thinkingLevel}}function formatSelector(model,thinkingLevel){let base=`${model.provider}/${model.id}`;return thinkingLevel?`${base}:${thinkingLevel}`:base}function baseSelector(selector){return`${selector.provider}/${selector.id}`}function canonicalizeFallbackChains(chains,lookup){let models=availableModels(lookup),tiers=authTiers(lookup),canonical={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry=>{let bare=parseBareSelector(entry);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical[key];return canonical}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){let base=baseSelector(selector);return selector.thinkingLevel?`${base}:${selector.thinkingLevel}`:base}function normalizedBase(selector){if(typeof selector!="string")return baseSelector(selector).toLowerCase();let normalized2=selector.trim().toLowerCase(),lastColon=normalized2.lastIndexOf(":");return lastColon===-1||!isValidThinkingLevel(normalized2.slice(lastColon+1))?normalized2:normalized2.slice(0,lastColon)}function normalizedExact(selector){return typeof selector=="string"?selector.trim().toLowerCase():formatParsedSelector(selector).toLowerCase()}function candidatesAfter(chainEntries2,currentSelector){let exact=normalizedExact(currentSelector),exactIndex=chainEntries2.findIndex(entry=>entry.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries2.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries2.findIndex(entry=>normalizedBase(entry)===base);return baseIndex===-1?chainEntries2:chainEntries2.slice(baseIndex+1)}function isPlainObject3(value2){if(value2===null||typeof value2!="object"||Array.isArray(value2))return!1;let prototype=Object.getPrototypeOf(value2);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels(model).includes(selector.thinkingLevel)&&warnings.push(`${subject} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function describeValue(value2){return value2===null?"null":Array.isArray(value2)?"an array":`a ${typeof value2}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry=>typeof entry!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry of entries){let bareEntry=parseBareSelector(entry);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry,key));continue}let parsedEntry=parseFallbackSelector(entry,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry,key));continue}parsedKey&&baseSelector(parsedEntry)===baseSelector(parsedKey)&&warnings.push(`Fallback chain entry "${entry}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry}"`,warnings)}}return warnings}function displayLookup(models){if(Array.isArray(models))return models;let registry=models;if(typeof registry.getAvailable!="function")return models;let available=registry.getAvailable();return{getAll:()=>available.length>0?available:registry.getAll(),isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:model=>registry.hasConfiguredAuth?.(model)===!0}}function withAvailableChains(settings,models){return{...settings,chains:canonicalizeFallbackChains(settings.chains,displayLookup(models))}}function loadFallbackSettings(settings,models){return withAvailableChains(settings.getRetryFallbackSettings(),models)}async function updateFallbackSettings(settings,models,update){return await update(settings),withAvailableChains(settings.getRetryFallbackSettings(),models)}var MENU2=["Show chains & live state","Add/edit chain","Remove chain","Toggle model fallback","Revert policy"];function formatModel(model){return`${model.provider}/${model.id}`}function renderFallbackState(ctx,settings){let rows=Object.entries(settings.chains).map(([target,entries])=>`${target} -> ${entries.join(", ")}`),chains=rows.length>0?rows.join(`
|
|
1261
|
+
`)}import{existsSync as existsSync22,readFileSync as readFileSync28}from"node:fs";import{join as join41}from"node:path";function parseSkillMcpDeclarations(skills){let servers=new Map,warnings=[];for(let skill of skills){let{declared,sourcePath,warning}=readSkillServers(skill);warning!==void 0&&warnings.push(warning);for(let[name,raw]of Object.entries(declared)){let globs=normalizeGlobs(raw.includeTools),existing=servers.get(name);if(existing===void 0){servers.set(name,{includeToolsBySkill:new Map([[skill.name,globs]]),raw,sourcePath});continue}existing.includeToolsBySkill.set(skill.name,globs)}}return{servers,warnings}}function readSkillServers(skill){let sidecarPath=join41(skill.baseDir,"mcp.json");if(existsSync22(sidecarPath))try{let parsed=JSON.parse(readFileSync28(sidecarPath,"utf8"));return{declared:unwrapServerMap(parsed),sourcePath:sidecarPath}}catch(error2){return{declared:{},sourcePath:sidecarPath,warning:`Skill '${skill.name}': invalid mcp.json sidecar skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}try{let{frontmatter}=parseFrontmatter3(readFileSync28(skill.filePath,"utf8"));return frontmatter.mcp===void 0?{declared:{},sourcePath:skill.filePath}:{declared:unwrapServerMap(frontmatter.mcp),sourcePath:skill.filePath}}catch(error2){return{declared:{},sourcePath:skill.filePath,warning:`Skill '${skill.name}': unreadable frontmatter mcp block skipped (${error2 instanceof Error?error2.message:String(error2)}); the skill itself still loads.`}}}function unwrapServerMap(value2){if(typeof value2!="object"||value2===null||Array.isArray(value2))return{};let record7=value2,map=typeof record7.mcpServers=="object"&&record7.mcpServers!==null?record7.mcpServers:record7,declared={};for(let[name,server]of Object.entries(map))typeof server!="object"||server===null||Array.isArray(server)||(declared[name]=server);return declared}function normalizeGlobs(includeTools){if(!Array.isArray(includeTools))return["*"];let globs=includeTools.filter(glob=>typeof glob=="string"&&glob.length>0);return globs.length>0?globs:["*"]}function matchIncludeTools(globs,toolName){return globs.some(glob=>{let pattern=`^${glob.split("*").map(escapeRegExp3).join(".*")}$`;return new RegExp(pattern).test(toolName)})}function escapeRegExp3(text2){return text2.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function skillActivationTargets(declarations,skillName,registered){let targets=new Set;for(let[serverName2,decl]of declarations.servers){let globs=decl.includeToolsBySkill.get(skillName);if(globs!==void 0)for(let tool of registered)tool.server===serverName2&&matchIncludeTools(globs,tool.toolName)&&targets.add(tool.name)}return[...targets].sort()}var MCP_BUILTIN_EXTENSION_PATH="<builtin:mcp>";function createMcpExtension(service3,sessionOwned=!0){return pi=>{let attachPromise,attachedSessionId,controlInventoryDisposed=!1,unsubscribeControlInventoryRequest=safeEventBusOn(pi.events,MCP_CONTROL_INVENTORY_REQUEST_EVENT,data=>{!isMcpControlInventoryRequest(data)||data.sessionId!==attachedSessionId||data.respond(service3.refreshWireStatusSnapshot(data.sessionId))}),unsubscribeWireStatus=service3.onWireStatusChanged((sessionId,snapshot)=>{sessionId===void 0||sessionId!==attachedSessionId||pi.events.emit(MCP_CONTROL_INVENTORY_CHANGED_EVENT,{sessionId,snapshot})}),disposeControlInventory=()=>{controlInventoryDisposed||(controlInventoryDisposed=!0,unsubscribeControlInventoryRequest(),unsubscribeWireStatus())},sink={logger:{error(message,data){createMcpLogger("service").error(message,data)}}};registerMcpCommands(pi,service3,()=>attachPromise),installMcpNativeToolSearchGate(()=>{let setting=service3.getNativeToolSearchSetting();return setting===!0||setting==="auto"});let skillDecls={servers:new Map,warnings:[]},skillsByName=new Map,loadedSkills=new Set,revealSkill=skillName=>{if(loadedSkills.has(skillName)||!skillsByName.has(skillName))return;loadedSkills.add(skillName);let registered=service3.getTierBSearchable(),targets=skillActivationTargets(skillDecls,skillName,registered);targets.length>0&&service3.activateSkillMcpTools(targets)};pi.on("input",async(event,ctx)=>{let match=/^\s*\/skill:([A-Za-z0-9._-]+)/.exec(event.text);if(match&&revealSkill(match[1]),event.text.includes("@mcp:")){let expansion=await expandMcpResourceMentions(event.text,()=>service3.getMcpResourceServers());for(let notice2 of expansion.notices)createMcpLogger("resources").warn(notice2),ctx.ui?.notify?.(notice2,"warning");if(expansion.changed)return{action:"transform",text:expansion.text}}}),pi.on("tool_call",event=>{if(event.toolName!=="read")return;let path13=event.input.path;if(path13!==void 0)for(let[name,skill]of skillsByName)(path13===skill.filePath||path13.endsWith(skill.filePath))&&revealSkill(name)});let attach=(event,ctx)=>(attachedSessionId=ctx.sessionManager?.getSessionId?.(),attachPromise=(async()=>{await service3.attachSession(event,ctx,pi),refreshMcpInstructionsForSession(service3),sessionOwned?registerMcpPromptCommands(service3,pi,service3.getMcpPromptServers()):registerMcpPromptCommands(pi,service3.getMcpPromptServers())})(),attachPromise),onSessionStart=wrapAsync("mcp.session_start",(event,ctx)=>attach(event,ctx),sink);pi.on("session_start",(event,ctx)=>{let work=onSessionStart(event,ctx)});let onBeforeAgentStart=async(event,ctx)=>{try{let preview=event.preview===!0;preview?await attachPromise:(service3.setMcpElicitationUiProvider(()=>ctx.ui),await(attachPromise??attach({type:"session_start",reason:"startup"},ctx)));let skills=preview?[]:event.systemPromptOptions.skills??[];if(skills.length>0){skillsByName=new Map(skills.map(skill=>[skill.name,skill])),skillDecls=parseSkillMcpDeclarations(skills);let declared=new Map([...skillDecls.servers].map(([name,decl])=>[name,{raw:decl.raw,sourcePath:decl.sourcePath}])),warnings=[...skillDecls.warnings,...declared.size>0?await service3.attachSkillMcpServers(declared):[]];for(let warning of warnings)createMcpLogger("skills").warn(warning)}await service3.whenAttachSettled()==="timeout"&&createMcpLogger("service").warn("MCP attach still settling at prompt build",{timeoutMs:MCP_ATTACH_SETTLE_TIMEOUT_MS});let systemPrompt=injectMcpInstructions(service3,event.systemPrompt);return systemPrompt===void 0?void 0:{systemPrompt}}catch(error2){if(!(error2 instanceof Error))throw error2;await reportMcpAsyncError("mcp.before_agent_start",error2,sink);return}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("session_shutdown",wrapAsync("mcp.session_shutdown",async event=>{event.reason==="reload"&&!sessionOwned||(disposeControlInventory(),await service3.handleSessionShutdown(event))},sink)),pi.on("session_extensions_removed",wrapAsync("mcp.session_extensions_removed",async event=>{event.removed.some(extension=>extension.path===MCP_BUILTIN_EXTENSION_PATH)&&(disposeControlInventory(),await service3.dispose("reload"))},sink))}}function hasProviderScope(){try{return bindToProviderScope(()=>{}),!0}catch{return!1}}function mcpExtension(pi){let sessionOwned=hasProviderScope();return createMcpExtension(sessionOwned?new McpService:getMcpService(),sessionOwned)(pi)}var BARE_EXPANSION_DENYLIST=new Set(["cursor","openrouter","openrouter-images"]),PROVIDER_PRECEDENCE=["anthropic-subscription","anthropic","kimi-coding"];function authTier(model,tiers){return tiers.isUsingOAuth(model)?0:tiers.hasConfiguredAuth?.(model)===!0?1:2}var MAX_PROVIDERS_PER_FAMILY=2;function parseBareSelector(raw){let trimmed=raw.trim();if(!trimmed||trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{family:trimmed.toLowerCase()};let suffix=trimmed.slice(lastColon+1).toLowerCase();if(!isValidThinkingLevel(suffix))return{family:trimmed.toLowerCase()};let family=trimmed.slice(0,lastColon).trim().toLowerCase();return family?{family,thinkingLevel:suffix}:void 0}function withoutNamespace(modelId){let cut=Math.max(modelId.lastIndexOf("."),modelId.lastIndexOf("/"));return cut===-1?modelId:modelId.slice(cut+1)}function matchesFamily(model,family){return[model.id.toLowerCase(),withoutNamespace(model.id.toLowerCase())].some(id=>id===family||id.startsWith(`${family}-`))}function pickVariant2(models,family){return[...models].sort((left,right)=>{let exact=+(withoutNamespace(right.id.toLowerCase())===family)-+(withoutNamespace(left.id.toLowerCase())===family);return exact!==0?exact:left.id.length!==right.id.length?left.id.length-right.id.length:left.id.localeCompare(right.id)})[0]}function precedenceIndex(provider){let index=PROVIDER_PRECEDENCE.indexOf(provider.toLowerCase());return index===-1?PROVIDER_PRECEDENCE.length:index}function rankFamilyModels(models,family,tiers,options={}){let byProvider=new Map;for(let model of models){if(BARE_EXPANSION_DENYLIST.has(model.provider.toLowerCase())||tiers.isFallbackEligible?.(model)===!1||!matchesFamily(model,family))continue;let bucket=byProvider.get(model.provider);bucket?bucket.push(model):byProvider.set(model.provider,[model])}let ranked=[...byProvider.values()].flatMap(variants=>{let variant=pickVariant2(variants,family);return variant?[variant]:[]}).sort((left,right)=>{let tier=authTier(left,tiers)-authTier(right,tiers);if(tier!==0)return tier;let precedence=precedenceIndex(left.provider)-precedenceIndex(right.provider);return precedence!==0?precedence:left.provider.localeCompare(right.provider)}),limit=options.limit??ranked.length;return ranked.slice(0,limit)}function availableModels(lookup){return"getAll"in lookup?lookup.getAll():[...lookup]}function authTiers(lookup){if(Array.isArray(lookup))return{isUsingOAuth:()=>!1};let registry=lookup;return{isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:typeof registry.hasConfiguredAuth=="function"?model=>registry.hasConfiguredAuth?.(model)===!0:void 0,isFallbackEligible:typeof registry.isFallbackEligible=="function"?model=>registry.isFallbackEligible?.(model)!==!1:void 0}}function isChainTombstone(entries){return Array.isArray(entries)&&entries.length===0}function selectorReference(raw){let trimmed=raw.trim();if(!trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{reference:trimmed};let prefix=trimmed.slice(0,lastColon),suffix=trimmed.slice(lastColon+1).toLowerCase();return isValidThinkingLevel(suffix)?{reference:prefix,thinkingLevel:suffix}:{reference:trimmed}}function parseFallbackSelector(raw,lookup){let models=availableModels(lookup),trimmed=raw.trim(),parsedReference=selectorReference(trimmed);if(!parsedReference)return;let fullMatch=findExactModelReferenceMatch(trimmed,models);if(fullMatch)return{raw:trimmed,provider:fullMatch.provider,id:fullMatch.id};let slashIndex=parsedReference.reference.indexOf("/"),provider=parsedReference.reference.slice(0,slashIndex).trim(),modelPattern=parsedReference.reference.slice(slashIndex+1).trim();if(!provider||!modelPattern)return;let providerModels=models.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()),parsed=parseModelPattern(parsedReference.thinkingLevel?`${modelPattern}:${parsedReference.thinkingLevel}`:modelPattern,providerModels,{allowInvalidThinkingLevelFallback:!1});if(!(!parsed.model||parsed.warning)&&!(parsedReference.thinkingLevel&&!parsed.thinkingLevel))return{raw:trimmed,provider:parsed.model.provider,id:parsed.model.id,thinkingLevel:parsed.thinkingLevel}}function formatSelector(model,thinkingLevel){let base=`${model.provider}/${model.id}`;return thinkingLevel?`${base}:${thinkingLevel}`:base}function baseSelector(selector){return`${selector.provider}/${selector.id}`}function canonicalizeFallbackChains(chains,lookup){let models=availableModels(lookup),tiers=authTiers(lookup),canonical={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry=>{let bare=parseBareSelector(entry);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical[key];return canonical}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){let base=baseSelector(selector);return selector.thinkingLevel?`${base}:${selector.thinkingLevel}`:base}function normalizedBase(selector){if(typeof selector!="string")return baseSelector(selector).toLowerCase();let normalized2=selector.trim().toLowerCase(),lastColon=normalized2.lastIndexOf(":");return lastColon===-1||!isValidThinkingLevel(normalized2.slice(lastColon+1))?normalized2:normalized2.slice(0,lastColon)}function normalizedExact(selector){return typeof selector=="string"?selector.trim().toLowerCase():formatParsedSelector(selector).toLowerCase()}function candidatesAfter(chainEntries2,currentSelector){let exact=normalizedExact(currentSelector),exactIndex=chainEntries2.findIndex(entry=>entry.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries2.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries2.findIndex(entry=>normalizedBase(entry)===base);return baseIndex===-1?chainEntries2:chainEntries2.slice(baseIndex+1)}function isPlainObject3(value2){if(value2===null||typeof value2!="object"||Array.isArray(value2))return!1;let prototype=Object.getPrototypeOf(value2);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels2(model).includes(selector.thinkingLevel)&&warnings.push(`${subject} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function describeValue(value2){return value2===null?"null":Array.isArray(value2)?"an array":`a ${typeof value2}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry=>typeof entry!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry of entries){let bareEntry=parseBareSelector(entry);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry,key));continue}let parsedEntry=parseFallbackSelector(entry,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry,key));continue}parsedKey&&baseSelector(parsedEntry)===baseSelector(parsedKey)&&warnings.push(`Fallback chain entry "${entry}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry}"`,warnings)}}return warnings}function displayLookup(models){if(Array.isArray(models))return models;let registry=models;if(typeof registry.getAvailable!="function")return models;let available=registry.getAvailable();return{getAll:()=>available.length>0?available:registry.getAll(),isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:model=>registry.hasConfiguredAuth?.(model)===!0}}function withAvailableChains(settings,models){return{...settings,chains:canonicalizeFallbackChains(settings.chains,displayLookup(models))}}function loadFallbackSettings(settings,models){return withAvailableChains(settings.getRetryFallbackSettings(),models)}async function updateFallbackSettings(settings,models,update){return await update(settings),withAvailableChains(settings.getRetryFallbackSettings(),models)}var MENU2=["Show chains & live state","Add/edit chain","Remove chain","Toggle model fallback","Revert policy"];function formatModel(model){return`${model.provider}/${model.id}`}function renderFallbackState(ctx,settings){let rows=Object.entries(settings.chains).map(([target,entries])=>`${target} -> ${entries.join(", ")}`),chains=rows.length>0?rows.join(`
|
|
1262
1262
|
`):"No fallback chains configured.",status=ctx.sessionSettings.getFallbackStatus(),live=status?.active?`active on ${status.currentModel??"unknown"} from ${status.originalSelector??"unknown"}${status.pinned?" (pinned)":""}`:"inactive";return`${chains}
|
|
1263
1263
|
Model fallback: ${settings.modelFallback?"enabled":"disabled"}
|
|
1264
1264
|
Revert policy: ${settings.revertPolicy}
|
|
1265
|
-
Live retry state: ${live}`}async function runFallbackMenu(ctx,settings,actions){if(!ctx.hasUI){ctx.ui.notify("Fallback menu requires interactive UI. Use /fallback <target> <fallback...>.","error");return}let choice=await ctx.ui.select("Model fallback",[...MENU2]);if(!choice)return;if(choice===MENU2[0]){ctx.ui.notify(renderFallbackState(ctx,settings));return}if(choice===MENU2[1]){await editChain(ctx,actions);return}if(choice===MENU2[2]){let target=await ctx.ui.select("Remove fallback chain",Object.keys(settings.chains));target&&await actions.removeChain(target);return}if(choice===MENU2[3]){await actions.toggle();return}let policy=await ctx.ui.select("Fallback revert policy",["cooldown-expiry","never"]);(policy==="cooldown-expiry"||policy==="never")&&await actions.setRevertPolicy(policy)}async function editChain(ctx,actions){let available=ctx.modelRegistry.getAvailable(),target=await ctx.ui.select("Fallback target model",available.map(formatModel));if(!target)return;let entries=[];for(;;){let fallback=await ctx.ui.select("Fallback model (Done to save)",["Done",...available.map(formatModel)]);if(!fallback||fallback==="Done")break;let model=available.find(item=>formatModel(item)===fallback);if(!model)return;let thinking=await ctx.ui.select("Thinking level",["inherit",...
|
|
1265
|
+
Live retry state: ${live}`}async function runFallbackMenu(ctx,settings,actions){if(!ctx.hasUI){ctx.ui.notify("Fallback menu requires interactive UI. Use /fallback <target> <fallback...>.","error");return}let choice=await ctx.ui.select("Model fallback",[...MENU2]);if(!choice)return;if(choice===MENU2[0]){ctx.ui.notify(renderFallbackState(ctx,settings));return}if(choice===MENU2[1]){await editChain(ctx,actions);return}if(choice===MENU2[2]){let target=await ctx.ui.select("Remove fallback chain",Object.keys(settings.chains));target&&await actions.removeChain(target);return}if(choice===MENU2[3]){await actions.toggle();return}let policy=await ctx.ui.select("Fallback revert policy",["cooldown-expiry","never"]);(policy==="cooldown-expiry"||policy==="never")&&await actions.setRevertPolicy(policy)}async function editChain(ctx,actions){let available=ctx.modelRegistry.getAvailable(),target=await ctx.ui.select("Fallback target model",available.map(formatModel));if(!target)return;let entries=[];for(;;){let fallback=await ctx.ui.select("Fallback model (Done to save)",["Done",...available.map(formatModel)]);if(!fallback||fallback==="Done")break;let model=available.find(item=>formatModel(item)===fallback);if(!model)return;let thinking=await ctx.ui.select("Thinking level",["inherit",...getSupportedThinkingLevels2(model)]);if(!thinking)return;entries.push(thinking==="inherit"?fallback:`${fallback}:${thinking}`)}entries.length>0&&await actions.setChain(target,entries)}var FLAG_NAME="no-model-fallback";function modelFallbackExtension(pi){pi.registerFlag(FLAG_NAME,{type:"boolean",default:!1,description:"Disable retry model fallback for this run."}),pi.registerCommand("fallback",{description:"View and manage retry model fallback chains.",argumentHint:"[target [fallback1 fallback2 ...]]",handler:async(rawArgs,ctx)=>handleFallbackCommand(rawArgs,ctx)})}async function handleFallbackCommand(rawArgs,ctx){let args=rawArgs.trim().split(/\s+/).filter(Boolean);if(args.length===0){let settings=loadFallbackSettings(ctx.sessionSettings,ctx.modelRegistry);await runFallbackMenu(ctx,settings,{setChain:(target,entries)=>saveChain2(ctx,target,entries),removeChain:async target=>{await updateFallbackSettings(ctx.sessionSettings,ctx.modelRegistry,sessionSettings=>sessionSettings.removeFallbackChain(target)),ctx.ui.notify(`Removed fallback chain for ${target}.`)},toggle:async()=>{await updateFallbackSettings(ctx.sessionSettings,ctx.modelRegistry,sessionSettings=>sessionSettings.setModelFallbackEnabled(!settings.modelFallback)),ctx.ui.notify(`Model fallback ${settings.modelFallback?"disabled":"enabled"}.`)},setRevertPolicy:async policy=>{await updateFallbackSettings(ctx.sessionSettings,ctx.modelRegistry,sessionSettings=>sessionSettings.setFallbackRevertPolicy(policy)),ctx.ui.notify(`Fallback revert policy set to ${policy}.`)}});return}if(args.length<2){ctx.ui.notify("Usage: /fallback <target> <fallback1> [fallback2 ...]","error");return}await saveChain2(ctx,args[0],args.slice(1))}async function saveChain2(ctx,target,entries){let warnings=validateFallbackChains({[target]:entries},ctx.modelRegistry);return warnings.length>0?(ctx.ui.notify(warnings.join(`
|
|
1266
1266
|
`),"warning"),!1):(await updateFallbackSettings(ctx.sessionSettings,ctx.modelRegistry,sessionSettings=>sessionSettings.setFallbackChain(target,entries)),ctx.ui.notify(`Fallback chain saved for ${target}.`),!0)}import{readFile as readFile13}from"node:fs/promises";import{dirname as dirname25}from"node:path";import{realpath as realpath2}from"node:fs/promises";import{isAbsolute as isAbsolute7,resolve as resolve17,sep as sep8}from"node:path";async function resolveAndContain(input){if(!input.filePath)return null;let resolvedPath=isAbsolute7(input.filePath)?input.filePath:resolve17(input.rootDir,input.filePath),canonicalRoot,canonicalPath;try{canonicalRoot=await realpath2(input.rootDir),canonicalPath=await realpath2(resolvedPath)}catch{return null}if(canonicalPath===canonicalRoot)return null;let rootBoundary=canonicalRoot.endsWith(sep8)?canonicalRoot:canonicalRoot+sep8;return canonicalPath.startsWith(rootBoundary)?{canonicalPath,canonicalRoot}:null}var InjectionFileReadError=class extends Error{constructor(path13,cause){let message=cause instanceof Error?cause.message:String(cause);super(`Failed to read ${path13}: ${message}`),this.name="InjectionFileReadError",this.path=path13}};import{constants as constants3,promises as fsPromises2}from"node:fs";import{dirname as dirname24,isAbsolute as isAbsolute8,join as join42,relative as relative9}from"node:path";var DEFAULT_FILE_NAMES=["AGENTS.md"];async function findAgentsMdUp(input){let fileNames=input.fileNames??DEFAULT_FILE_NAMES,collected=[],current=input.startDir;for(;;){let isRoot=current===input.rootDir;if(!isRoot)for(let name of fileNames){let candidate=join42(current,name);if(await fileExists(candidate)){collected.push(candidate);break}}if(isRoot)break;let parent=dirname24(current);if(parent===current||!isWithinRoot(input.rootDir,parent))break;current=parent}return collected.reverse()}function isWithinRoot(rootDir,candidate){let relativePath=relative9(rootDir,candidate);return relativePath===""||!relativePath.startsWith("..")&&!isAbsolute8(relativePath)}async function fileExists(path13){try{return await fsPromises2.access(path13,constants3.F_OK),!0}catch{return!1}}function formatDirectoryContext(input){let notice2=input.truncated?`
|
|
1267
1267
|
|
|
1268
1268
|
[Note: Content was truncated to save context window space. For full context, please read the file directly: ${input.absolutePath}]`:"";return`
|
|
@@ -2248,7 +2248,7 @@ ${TASK_MANAGEMENT_SECTION}`;if(event.preview)return{systemPrompt};let branchEntr
|
|
|
2248
2248
|
`)}var COLLAPSE_RULE_CONTENT=["Your previous output degenerated into repeated garbage (a runaway repetition loop) and was cut off.","The garbled portion has been removed from the conversation.","Snap out of it: take a breath, restate your current objective in one short sentence, then continue the task normally.","Do NOT apologize at length, do NOT repeat the garbled pattern, and do NOT restart work that was already completed."].join(`
|
|
2249
2249
|
`),LEAK_ERROR_MESSAGE="Degeneration guard: control-token leakage; treating as internal error, resampling",COLLAPSE_RULE_NAME="collapse-repetition",CONTROL_LEAK_RULE_NAME="control-token-leak",REPETITIVE_TURNS_RULE_CONTENT=["Your recent replies repeated the same near-identical status message across consecutive turns \u2014 a cross-turn repetition loop.","Stop repeating the same status; a report is useful only when something has changed.","Take a different concrete action now: use a tool, inspect new state, change the approach, or \u2014 if the task is actually blocked \u2014 say exactly what you are waiting for and stop."].join(`
|
|
2250
2250
|
`);var DEFAULT_TTSR_SETTINGS={enabled:!0,repeatMode:"once",repeatGap:10,disabledRules:[]},COLLAPSE_REMEDIATION={retryMode:"nudge",contextMode:"truncate",corruptionScope:"output-region",nudgeKey:"collapse-repetition"},CONTROL_LEAK_REMEDIATION={retryMode:"provider-error",contextMode:"discard",corruptionScope:"generation",errorKind:"control-token-leak"},TTSR_INJECTION_CUSTOM_TYPE="ttsr-injection";var BUILTIN_RULES=[{name:COLLAPSE_RULE_NAME,detector:"collapse",remediation:COLLAPSE_REMEDIATION,summary:"abort the stream, truncate the garbage from history, inject a corrective nudge, then continue"},{name:CONTROL_LEAK_RULE_NAME,detector:"control-leak",remediation:CONTROL_LEAK_REMEDIATION,summary:"abort the stream, replace the generation with an error shell, then resample via bounded provider retry"}];function registerTtsrCommands(pi,getState2){pi.registerCommand("ttsr",{description:"Show TTSR stream-rule status: builtin detectors, user rules, injected rules.",handler:async(_args,ctx)=>{ctx.ui.notify(formatTtsrStatus(getState2()),"info")}})}function formatTtsrStatus(state){let builtinRules=state.rules.filter(rule=>rule.source==="builtin"),userRules=state.rules.filter(rule=>rule.source!=="builtin");return["TTSR stream rules","","STATUS",state.disabled?"disabled (ttsr-disabled flag set)":"enabled","","BUILTIN RULES","DETECTORS",...BUILTIN_RULES.map(formatBuiltinRule),"STREAM RULES",...builtinRules.length===0?["(none)"]:builtinRules.map(formatBuiltinStreamRule),"","USER RULES",...formatUserRules(userRules),"","INJECTED",state.injectedRuleNames.length===0?"(none)":state.injectedRuleNames.join(", ")].join(`
|
|
2251
|
-
`)}function formatBuiltinRule(rule){return[`${rule.name} [detector: ${rule.detector}]`,`remediation: ${rule.summary}`,`(mode: ${rule.remediation.retryMode}, scope: ${rule.remediation.corruptionScope})`].join(" ")}function formatBuiltinStreamRule(rule){return`${rule.name} [stream rule, scope: ${formatScope(rule.scope)}]`}function formatUserRules(rules){return rules.length===0?["(none)"]:rules.map(rule=>`${rule.name} [${rule.source}, scope: ${formatScope(rule.scope)}]`)}function formatScope(scope){let parts=[];scope.allowText&&parts.push("text"),scope.allowThinking&&parts.push("thinking");for(let toolScope of scope.toolScopes)parts.push(toolScope.pathGlob===void 0?`tool:${toolScope.toolName}`:`tool:${toolScope.toolName}(${toolScope.pathGlob})`);return parts.length===0?"none":parts.join("+")}function createGenerationState(){return{abortClaimed:!1,userCancelled:!1}}function resolveDetection(directLeak,collapse,corroboratedLeak){let leak=directLeak??corroboratedLeak;return leak?{owner:"control-token-leak",observedRules:collapse?["control-token-leak","collapse-repetition"]:["control-token-leak"],match:leak,remediation:CONTROL_LEAK_REMEDIATION}:collapse?{owner:"collapse-repetition",observedRules:["collapse-repetition"],match:collapse,remediation:COLLAPSE_REMEDIATION}:null}function claimAbort(state,resolution){return state.abortClaimed||state.userCancelled?!1:(state.abortClaimed=!0,state.abortOwner=resolution.owner,state.selfAbortAt=Date.now(),!0)}function markUserCancelled(state){state.userCancelled=!0}var REPETITIVE_TURNS_RULE_NAME="repetitive-turns";var WORD_PATTERN=/[\p{L}\p{N}#]+/gu,DIGIT_RUN_PATTERN=/\d[\d.,:/-]*/g,HEX_LIKE_PATTERN=/\b[0-9a-f]{7,}\b/gi;var HANDOFF_ASK_CLAUSE=/\bAsk:[\s\S]*?(?=\b(?:For you|You need|Now)
|
|
2251
|
+
`)}function formatBuiltinRule(rule){return[`${rule.name} [detector: ${rule.detector}]`,`remediation: ${rule.summary}`,`(mode: ${rule.remediation.retryMode}, scope: ${rule.remediation.corruptionScope})`].join(" ")}function formatBuiltinStreamRule(rule){return`${rule.name} [stream rule, scope: ${formatScope(rule.scope)}]`}function formatUserRules(rules){return rules.length===0?["(none)"]:rules.map(rule=>`${rule.name} [${rule.source}, scope: ${formatScope(rule.scope)}]`)}function formatScope(scope){let parts=[];scope.allowText&&parts.push("text"),scope.allowThinking&&parts.push("thinking");for(let toolScope of scope.toolScopes)parts.push(toolScope.pathGlob===void 0?`tool:${toolScope.toolName}`:`tool:${toolScope.toolName}(${toolScope.pathGlob})`);return parts.length===0?"none":parts.join("+")}function createGenerationState(){return{abortClaimed:!1,userCancelled:!1}}function resolveDetection(directLeak,collapse,corroboratedLeak){let leak=directLeak??corroboratedLeak;return leak?{owner:"control-token-leak",observedRules:collapse?["control-token-leak","collapse-repetition"]:["control-token-leak"],match:leak,remediation:CONTROL_LEAK_REMEDIATION}:collapse?{owner:"collapse-repetition",observedRules:["collapse-repetition"],match:collapse,remediation:COLLAPSE_REMEDIATION}:null}function claimAbort(state,resolution){return state.abortClaimed||state.userCancelled?!1:(state.abortClaimed=!0,state.abortOwner=resolution.owner,state.selfAbortAt=Date.now(),!0)}function markUserCancelled(state){state.userCancelled=!0}var REPETITIVE_TURNS_RULE_NAME="repetitive-turns";var WORD_PATTERN=/[\p{L}\p{N}#]+/gu,DIGIT_RUN_PATTERN=/\d[\d.,:/-]*/g,HEX_LIKE_PATTERN=/\b[0-9a-f]{7,}\b/gi;var HANDOFF_ASK_CLAUSE=/\bAsk:[\s\S]*?(?=\b(?:For you|You need|Now):)/g;function normalizeTurnText(text2){return text2.replace(HANDOFF_ASK_CLAUSE," ").toLowerCase().replace(HEX_LIKE_PATTERN,"#").replace(DIGIT_RUN_PATTERN,"#").split(/\s+/).filter(token=>token.length>0).join(" ").trim()}function wordTrigrams(normalized2){let words2=normalized2.match(WORD_PATTERN)??[],grams=new Set;for(let i=0;i+3<=words2.length;i++)grams.add(`${words2[i]} ${words2[i+1]} ${words2[i+2]}`);return grams}function trigramJaccard(a,b){let gramsA=wordTrigrams(a),gramsB=wordTrigrams(b);if(gramsA.size===0||gramsB.size===0)return 0;let intersection=0;for(let gram of gramsA)gramsB.has(gram)&&(intersection+=1);return intersection/(gramsA.size+gramsB.size-intersection)}function isNearDuplicateOfPreviousTurn(normalizedCandidate,normalizedPrevious){return trigramJaccard(normalizedCandidate,normalizedPrevious)>=.55}function createRepetitiveTurnsState(){return{history:[],streak:0,latched:!1}}function jaccardSets(a,b){if(a.size===0||b.size===0)return 0;let intersection=0;for(let gram of a)b.has(gram)&&(intersection+=1);return intersection/(a.size+b.size-intersection)}function recordTurnText(state,text2){let normalized2=normalizeTurnText(text2);if(normalized2.length<40)return null;let grams=wordTrigrams(normalized2),previous=state.history[state.history.length-1],similarity=previous===void 0?0:jaccardSets(grams,previous.grams);return state.history.push({normalized:normalized2,grams}),state.history.length>6&&state.history.shift(),similarity>=.55?state.streak+=1:(state.streak=0,state.latched&&(state.latched=!1)),state.latched||state.streak<2?null:(state.latched=!0,{rule:REPETITIVE_TURNS_RULE_NAME,reason:`assistant repeated a near-identical message across ${state.streak+1} consecutive turns (jaccard ${similarity.toFixed(2)})`,anomalyStartOffset:0,garbageStartOffset:0,detail:{mechanism:"cross-turn",streak:state.streak+1,similarity:Number(similarity.toFixed(3)),sample:normalized2.slice(0,80)}})}import{lstatSync as lstatSync5,readdirSync as readdirSync6,readFileSync as readFileSync31}from"node:fs";import{homedir as homedir8}from"node:os";import{dirname as dirname33,join as join57,normalize as normalize2}from"node:path";var INLINE_FLAG_PREFIX=/^\(\?([a-z]+)\)/,TRANSLATABLE_INLINE_FLAGS=/^[ims]+$/;function compileRuleCondition(condition){let match=INLINE_FLAG_PREFIX.exec(condition),flagText=match?.[1];try{if(match!==null&&flagText!==void 0&&TRANSLATABLE_INLINE_FLAGS.test(flagText)){let flags=Array.from(new Set(flagText)).join("");return{regex:new RegExp(condition.slice(match[0].length),flags)}}return{regex:new RegExp(condition)}}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);return{regex:null,warning:`invalid condition "${condition}": ${message}`}}}var import_yaml4=__toESM(require_dist(),1);var ANY_TOOL_NAME="*";var TOOL_SCOPE_TOKEN_PATTERN=/^(?:(?<prefix>tool)(?::(?<tool>[a-z0-9_-]+))?|(?<bare>[a-z0-9_-]+))(?:\((?<path>[^)]+)\))?$/i,DEFAULT_SCOPE={allowText:!0,allowThinking:!1,toolScopes:[{toolName:ANY_TOOL_NAME}]};function parseToolScopeToken(token){let groups=TOOL_SCOPE_TOKEN_PATTERN.exec(token)?.groups;if(groups===void 0)return;let hasToolPrefix=groups.prefix!==void 0,toolName=(groups.tool??(hasToolPrefix?void 0:groups.bare))?.trim().toLowerCase(),pathGlob=groups.path?.trim(),hasGlob=pathGlob!==void 0&&pathGlob.length>0;return toolName===void 0||toolName.length===0?hasGlob?{toolName:ANY_TOOL_NAME,pathGlob}:{toolName:ANY_TOOL_NAME}:hasGlob?{toolName,pathGlob}:{toolName}}function toolScopeKey(toolScope){return`${toolScope.toolName}(${toolScope.pathGlob??""})`}function parseScope(tokens){if(tokens.length===0)return{allowText:DEFAULT_SCOPE.allowText,allowThinking:DEFAULT_SCOPE.allowThinking,toolScopes:[...DEFAULT_SCOPE.toolScopes]};let allowText=!1,allowThinking=!1,toolScopes=[],seenToolScopes=new Set,pushToolScope=toolScope=>{let key=toolScopeKey(toolScope);seenToolScopes.has(key)||(seenToolScopes.add(key),toolScopes.push(toolScope))};for(let rawToken of tokens){let token=rawToken.trim();if(token.length===0)continue;let normalized2=token.toLowerCase();if(normalized2==="text"){allowText=!0;continue}if(normalized2==="thinking"){allowThinking=!0;continue}if(normalized2==="tool"||normalized2==="toolcall"){pushToolScope({toolName:ANY_TOOL_NAME});continue}let toolScope=parseToolScopeToken(token);toolScope!==void 0&&pushToolScope(toolScope)}return{allowText,allowThinking,toolScopes}}function hasReachableScope(scope){return scope.allowText||scope.allowThinking||scope.toolScopes.length>0}var FRONTMATTER_FENCE="---",CLOSING_FENCE_PATTERN=`
|
|
2252
2252
|
---`,FALLBACK_KEY_VALUE=/^([\w-]+):\s*(.*)$/,CONDITION_GLOB_SCOPE_TOOLS=["edit","write"],CATCH_ALL_CONDITION=".*",REGEX_META_CHARS=/[\\^$+|()]/,GLOB_META_CHARS=/[?*[\]{}]/,EXTENSION_GLOB=/^\*\.[^\s/]+$/;function isRecord47(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function parseFallbackFields(metadata){let fields={};for(let line of metadata.split(`
|
|
2253
2253
|
`)){let match=FALLBACK_KEY_VALUE.exec(line),key=match?.[1];if(key===void 0)continue;let raw=(match?.[2]??"").trim();if(raw.length===0){fields[key]=raw;continue}try{let parsed=(0,import_yaml4.parse)(raw);parsed===null||typeof parsed!="object"||Array.isArray(parsed)?fields[key]=parsed:fields[key]=raw}catch{fields[key]=raw}}return fields}function parseFrontmatterFields(metadata){try{let loaded2=(0,import_yaml4.parse)(metadata);return isRecord47(loaded2)?loaded2:{}}catch{return parseFallbackFields(metadata)}}function splitFrontmatter(markdown){let normalized2=markdown.replace(/\r\n?/g,`
|
|
2254
2254
|
`);if(!normalized2.startsWith(FRONTMATTER_FENCE))return{fields:{},body:normalized2};let endIndex=normalized2.indexOf(CLOSING_FENCE_PATTERN,FRONTMATTER_FENCE.length);if(endIndex===-1)return{fields:{},body:normalized2};let metadata=normalized2.slice(FRONTMATTER_FENCE.length+1,endIndex),body=normalized2.slice(endIndex+CLOSING_FENCE_PATTERN.length).trim();return{fields:parseFrontmatterFields(metadata),body}}function normalizeStringList(value2){if(typeof value2=="string"){let token=value2.trim();return token.length>0?[token]:void 0}if(!Array.isArray(value2))return;let tokens=value2.filter(item=>typeof item=="string").map(item=>item.trim()).filter(item=>item.length>0);if(tokens.length!==0)return Array.from(new Set(tokens))}function splitScopeTokens(value2){let tokens=[],current="",parenDepth=0,bracketDepth=0,braceDepth=0,quote;for(let index=0;index<value2.length;index++){let char=value2.charAt(index);if(quote!==void 0){current+=char,char===quote&&value2.charAt(index-1)!=="\\"&&(quote=void 0);continue}if(char==='"'||char==="'"){quote=char,current+=char;continue}if(char==="(")parenDepth+=1;else if(char===")")parenDepth=Math.max(0,parenDepth-1);else if(char==="[")bracketDepth+=1;else if(char==="]")bracketDepth=Math.max(0,bracketDepth-1);else if(char==="{")braceDepth+=1;else if(char==="}")braceDepth=Math.max(0,braceDepth-1);else if(char===","&&parenDepth===0&&bracketDepth===0&&braceDepth===0){let token=current.trim();token.length>0&&tokens.push(token),current="";continue}current+=char}let tail=current.trim();return tail.length>0&&tokens.push(tail),tokens}function stripSurroundingQuotes(token){let first=token.charAt(0);return token.length>=2&&(first==='"'||first==="'")&&token.charAt(token.length-1)===first?token.slice(1,-1).trim():token}function normalizeScopeField(value2){let normalized2=normalizeStringList(value2);if(normalized2===void 0)return;let tokens=normalized2.flatMap(splitScopeTokens).map(stripSurroundingQuotes).filter(item=>item.length>0);if(tokens.length!==0)return Array.from(new Set(tokens))}function isLikelyFileGlob(value2){let token=value2.trim();return token.length===0||REGEX_META_CHARS.test(token)||!GLOB_META_CHARS.test(token)?!1:token.includes("/")?!0:EXTENSION_GLOB.test(token)}function parseRuleFile(markdown,meta){let{fields,body}=splitFrontmatter(markdown),rawCondition=fields.condition??fields.ttsr_trigger??fields.ttsrTrigger,parsedCondition=normalizeStringList(rawCondition),parsedScope=normalizeScopeField(fields.scope),inferredScopeTokens=[],condition=[];for(let token of parsedCondition??[]){if(isLikelyFileGlob(token)){for(let toolName of CONDITION_GLOB_SCOPE_TOOLS)inferredScopeTokens.push(`tool:${toolName}(${token})`);continue}condition.push(token)}if(condition.length===0&&inferredScopeTokens.length>0&&condition.push(CATCH_ALL_CONDITION),condition.length===0)return{skipped:!0,name:meta.name,warning:`rule "${meta.name}" has no condition or legacy ttsr_trigger alias, skipping`};for(let pattern of condition){let compiled=compileRuleCondition(pattern);if(compiled.regex===null)return{skipped:!0,name:meta.name,warning:`rule "${meta.name}" skipped: ${compiled.warning??"invalid condition"}`}}let scope=parseScope([...parsedScope??[],...inferredScopeTokens]);if(!hasReachableScope(scope))return{skipped:!0,name:meta.name,warning:`rule "${meta.name}" scope excludes every stream, skipping`};let description=typeof fields.description=="string"?fields.description:void 0,globs=normalizeStringList(fields.globs),interruptMode=fields.interruptMode==="never"?"never":"always";return{name:meta.name,...meta.path!==void 0?{path:meta.path}:{},content:body,...description!==void 0?{description}:{},...globs!==void 0?{globs}:{},condition:Array.from(new Set(condition)),scope,interruptMode,source:meta.source}}var SENPI_DIR_NAME=".senpi",TTSR_DIR_NAME="ttsr",MARKDOWN_EXTENSION=".md",MAX_PARENT_SEARCH_DEPTH=100;function isDirectorySync(path13){try{return lstatSync5(path13).isDirectory()}catch{return!1}}function findProjectRootSync(cwd,homeDir){let normalizedHome=normalize2(homeDir),current=normalize2(cwd);for(let depth=0;depth<=MAX_PARENT_SEARCH_DEPTH;depth+=1){if(current===normalizedHome)return cwd;if(isDirectorySync(join57(current,SENPI_DIR_NAME)))return current;let parent=dirname33(current);if(parent===current)return cwd;current=parent}return cwd}function listMarkdownFilesSync(dir){try{return readdirSync6(dir,{withFileTypes:!0}).filter(entry=>entry.isFile()&&entry.name.endsWith(MARKDOWN_EXTENSION)).map(entry=>entry.name).sort()}catch{return[]}}function loadRulesSync(dir,source){let rules=[],warnings=[];for(let fileName of listMarkdownFilesSync(dir)){let path13=join57(dir,fileName),name=fileName.slice(0,fileName.length-MARKDOWN_EXTENSION.length),markdown;try{markdown=readFileSync31(path13,"utf-8")}catch{warnings.push(`rule "${name}" at ${path13} could not be read, skipping`);continue}let parsed=parseRuleFile(markdown,{name,path:path13,source});if("skipped"in parsed){warnings.push(parsed.warning);continue}rules.push(parsed)}return{rules,warnings}}function discoverTtsrRulesSync(cwd,homeDir){let resolvedHome=homeDir??homedir8(),globalDir=join57(resolvedHome,SENPI_DIR_NAME,TTSR_DIR_NAME),projectRoot=findProjectRootSync(cwd,resolvedHome),projectDir=join57(projectRoot,SENPI_DIR_NAME,TTSR_DIR_NAME),globalResult=loadRulesSync(globalDir,"global"),projectResult=projectDir===globalDir?{rules:[],warnings:[]}:loadRulesSync(projectDir,"project"),projectNames=new Set(projectResult.rules.map(rule=>rule.name));return{rules:[...globalResult.rules.filter(rule=>!projectNames.has(rule.name)),...projectResult.rules],warnings:[...globalResult.warnings,...projectResult.warnings]}}var import_picomatch3=__toESM(require_picomatch2(),1),PICOMATCH_OPTIONS3={dot:!0},MIN_STREAM_BUFFER_TAIL_CHARS=1024,STREAM_BUFFER_TAIL_SAFETY_FACTOR=4,TtsrManager=class{#settings;#compileCondition;#rules=new Map;#injectionRecords=new Map;#buffers=new Map;#maxConditionLength=0;#messageCount=0;#canMatchText=!1;#canMatchThinking=!1;constructor(settings,compileCondition){this.#settings=settings,this.#compileCondition=compileCondition}#canTrigger(ruleName){let record7=this.#injectionRecords.get(ruleName);return record7===void 0?!0:this.#settings.repeatMode==="once"?!1:this.#messageCount-record7.lastInjectedAt>=this.#settings.repeatGap}#compileGlob(pattern,ruleName){try{return(0,import_picomatch3.default)(pattern,PICOMATCH_OPTIONS3)}catch(error2){console.warn("TTSR glob pattern is invalid, skipping glob",{ruleName,pattern,error:error2 instanceof Error?error2.message:String(error2)});return}}#normalizePath(pathValue){return pathValue.replaceAll("\\","/")}#matchesGlob(matcher,filePaths){if(filePaths===void 0||filePaths.length===0)return!1;for(let filePath of filePaths){let normalized2=this.#normalizePath(filePath);if(matcher(normalized2))return!0;let slashIndex=normalized2.lastIndexOf("/"),basename27=slashIndex===-1?normalized2:normalized2.slice(slashIndex+1);if(basename27!==normalized2&&matcher(basename27))return!0}return!1}#matchesGlobalPaths(entry,context){for(let matcher of entry.globalPathMatchers)if(this.#matchesGlob(matcher,context.filePaths))return!0;return entry.globalPathMatchers.length===0}#matchesScope(entry,context){let scope=entry.rule.scope;if(context.source==="text")return scope.allowText;if(context.source==="thinking")return scope.allowThinking;let toolName=context.toolName?.trim().toLowerCase();for(let toolScope of scope.toolScopes){if(toolScope.toolName!=="*"&&toolScope.toolName.toLowerCase()!==toolName)continue;let pathMatcher=entry.toolPathMatchers.get(toolScope);if(!(pathMatcher!==void 0&&!this.#matchesGlob(pathMatcher,context.filePaths)))return!0}return!1}#matchesCondition(entry,streamBuffer){for(let condition of entry.conditions)if(condition.lastIndex=0,condition.test(streamBuffer))return!0;return!1}addRule(rule){if(!this.#settings.enabled||this.#settings.disabledRules.includes(rule.name)||this.#rules.has(rule.name))return!1;let conditions=[];for(let pattern of rule.condition){let compiled=this.#compileCondition(pattern);if(compiled===null){console.warn("TTSR condition has invalid regex pattern, skipping condition",{ruleName:rule.name,pattern});continue}conditions.push(compiled),pattern.length>this.#maxConditionLength&&(this.#maxConditionLength=pattern.length)}if(conditions.length===0)return console.warn("TTSR rule has no valid condition, skipping rule",{ruleName:rule.name}),!1;let scope=rule.scope;if(!scope.allowText&&!scope.allowThinking&&scope.toolScopes.length===0)return console.warn("TTSR scope excludes all streams, skipping rule",{ruleName:rule.name}),!1;let globalPathMatchers=[];for(let glob of rule.globs??[]){let matcher=this.#compileGlob(glob,rule.name);matcher!==void 0&&globalPathMatchers.push(matcher)}let toolPathMatchers=new Map;for(let toolScope of scope.toolScopes){if(toolScope.pathGlob===void 0)continue;let matcher=this.#compileGlob(toolScope.pathGlob,rule.name);matcher!==void 0&&toolPathMatchers.set(toolScope,matcher)}return this.#rules.set(rule.name,{rule,conditions,globalPathMatchers,toolPathMatchers}),scope.allowText&&(this.#canMatchText=!0),scope.allowThinking&&(this.#canMatchThinking=!0),!0}checkDelta(delta,context){if(context.source==="text"&&!this.#canMatchText)return[];if(context.source==="thinking"&&!this.#canMatchThinking)return[];let bufferKey=`${context.source}:${context.streamKey}`,nextBuffer=`${this.#buffers.get(bufferKey)??""}${delta}`,cap=this.#streamBufferCapChars();return nextBuffer.length>cap&&(nextBuffer=nextBuffer.slice(-cap)),this.#buffers.set(bufferKey,nextBuffer),this.#matchBuffer(nextBuffer,context)}#streamBufferCapChars(){return Math.max(MIN_STREAM_BUFFER_TAIL_CHARS,this.#maxConditionLength*STREAM_BUFFER_TAIL_SAFETY_FACTOR)}getStreamBufferLengths(){return new Map(Array.from(this.#buffers,([key,buffer])=>[key,buffer.length]))}#matchBuffer(buffer,context){if(!this.#settings.enabled)return[];let matches=[];for(let[name,entry]of this.#rules)this.#canTrigger(name)&&this.#matchesScope(entry,context)&&this.#matchesGlobalPaths(entry,context)&&this.#matchesCondition(entry,buffer)&&matches.push(entry.rule);return matches}markInjected(rulesToMark){this.markInjectedByNames(rulesToMark.map(rule=>rule.name))}markInjectedByNames(ruleNames){for(let rawName of ruleNames){let ruleName=rawName.trim();ruleName.length!==0&&this.#injectionRecords.set(ruleName,{lastInjectedAt:this.#messageCount})}}getInjectedRuleNames(){return Array.from(this.#injectionRecords.keys())}restoreInjected(ruleNames){for(let name of ruleNames)this.#injectionRecords.set(name,{lastInjectedAt:0})}resetBuffers(){this.#buffers.clear()}hasRules(){return this.#settings.enabled?this.#rules.size>0:!1}getRules(){return Array.from(this.#rules.values(),entry=>entry.rule)}incrementMessageCount(){this.#messageCount+=1}getMessageCount(){return this.#messageCount}getSettings(){return this.#settings}};function assertNever2(value2){throw new Error(`unexpected assistant message event: ${String(value2)}`)}function getTtsrStreamDelta(event){let deltaEvent=event.assistantMessageEvent;switch(deltaEvent.type){case"text_delta":return{source:"text",streamKey:`text:${String(deltaEvent.contentIndex)}`,delta:deltaEvent.delta};case"thinking_delta":return{source:"thinking",streamKey:`thinking:${String(deltaEvent.contentIndex)}`,delta:deltaEvent.delta};case"toolcall_delta":{let block=deltaEvent.partial.content[deltaEvent.contentIndex];return{source:"tool",streamKey:`tool:${String(deltaEvent.contentIndex)}`,delta:deltaEvent.delta,toolName:block?.type==="toolCall"?block.name:void 0}}case"start":case"text_start":case"text_end":case"thinking_start":case"thinking_end":case"toolcall_start":case"toolcall_end":case"done":case"error":return null;default:return assertNever2(deltaEvent)}}var TRUNCATION_MARKER="[output interrupted by stream rule]",TRANSPORT_TIMEOUT_ERROR_PATTERN=/^Request timed out\.?$/i;function streamBlockText(block,kind){if(kind==="tool"||typeof block!="object"||block===null||!("type"in block)||block.type!==kind)return;let value2=Reflect.get(block,kind);return typeof value2=="string"?value2:void 0}function replaceStreamBlockText(block,kind,text2){return kind==="text"&&block.type==="text"?{...block,text:text2}:kind==="thinking"&&block.type==="thinking"?{...block,thinking:text2}:block}function buildTruncateReplacement(message,garbageStartOffset,streamKind){if(streamKind==="tool"){let content2=message.content.filter(block=>typeof block!="object"||block===null||!("type"in block)?!0:block.type!=="toolCall");return{...message,content:[...content2,{type:"text",text:TRUNCATION_MARKER}],stopReason:message.stopReason==="toolUse"?"aborted":message.stopReason}}let remaining=Math.max(0,garbageStartOffset),truncated=!1,content=[];for(let block of message.content){let text2=streamBlockText(block,streamKind);if(!(truncated&&text2!==void 0)){if(text2===void 0||remaining>text2.length){content.push(block),text2!==void 0&&(remaining-=text2.length);continue}content.push(replaceStreamBlockText(block,streamKind,text2.slice(0,remaining))),truncated=!0}}content.push({type:"text",text:TRUNCATION_MARKER});let result3={...message,content};return result3.errorMessage!==void 0&&TRANSPORT_TIMEOUT_ERROR_PATTERN.test(result3.errorMessage)&&delete result3.errorMessage,result3}function buildErrorShellReplacement(){return{role:"assistant",content:[],stopReason:"error",errorMessage:LEAK_ERROR_MESSAGE}}function buildNudgeMessage(ruleName,ruleContent){return{customType:TTSR_INJECTION_CUSTOM_TYPE,content:renderSystemInterrupt(ruleName,ruleContent),display:!1,details:{rules:[ruleName]}}}function collectAssistantText(message){if(!Array.isArray(message.content))return null;let combined="";for(let block of message.content){if(typeof block!="object"||block===null||!("type"in block)||block.type!=="text")continue;let value2=Reflect.get(block,"text");typeof value2=="string"&&(combined+=value2)}return combined.length>0?combined:null}var RESTORED_TURN_LIMIT=8;function readPersistedAssistantTexts(ctx){let texts=[];for(let entry of ctx.sessionManager.getEntries()){if(typeof entry!="object"||entry===null||!("type"in entry)||entry.type!=="message")continue;let message=Reflect.get(entry,"message");if(typeof message!="object"||message===null||Reflect.get(message,"role")!=="assistant")continue;let text2=collectAssistantText({content:Reflect.get(message,"content")});text2!==null&&texts.push(text2)}return texts.slice(-RESTORED_TURN_LIMIT)}var RepetitiveTurnsLane=class{#state=createRepetitiveTurnsState();#armed=!1;#recovering=!1;#currentTurnText="";#lastCompletedTurnText=null;#enabled=!0;configure(disabledRules){this.#enabled=!disabledRules.has(REPETITIVE_TURNS_RULE_NAME)}resetSession(){this.#state=createRepetitiveTurnsState(),this.#armed=!1,this.#recovering=!1,this.#currentTurnText="",this.#lastCompletedTurnText=null}restoreFromHistory(assistantTexts){for(let text2 of assistantTexts)this.recordCompletedTurn(text2);this.#armed=!1}resetTurn(){this.#armed=!1,this.#currentTurnText=""}disarm(){this.#armed=!1}get armed(){return this.#armed}observeTextDelta(delta,canArm){if(this.#enabled&&!this.#armed&&!this.#recovering&&canArm&&this.#lastCompletedTurnText!==null){let candidate=normalizeTurnText(this.#currentTurnText+delta);candidate.length>=40&&isNearDuplicateOfPreviousTurn(candidate,this.#lastCompletedTurnText)&&(this.#armed=!0)}return this.#currentTurnText+=delta,this.#armed}commitArmedTurn(turnText){this.#armed=!1,this.#recovering=!0,turnText!==null&&(this.#lastCompletedTurnText=normalizeTurnText(turnText))}recordCompletedTurn(turnText){let normalized2=normalizeTurnText(turnText);if(this.#lastCompletedTurnText=normalized2,!this.#enabled)return;if(recordTurnText(this.#state,turnText)===null){this.#recovering&&(this.#recovering=!1);return}this.#armed=!0}};function buildStreamRemediation(pending,message){return pending.resolution.remediation.corruptionScope==="generation"?{replacement:buildErrorShellReplacement(),nudge:null,owner:pending.resolution.owner,observedRules:pending.resolution.observedRules,retryMode:"provider-error"}:{replacement:buildTruncateReplacement(message,pending.resolution.match.garbageStartOffset,pending.streamKind),nudge:buildNudgeMessage(pending.resolution.owner,COLLAPSE_RULE_CONTENT),owner:pending.resolution.owner,observedRules:pending.resolution.observedRules,retryMode:"nudge"}}function isHighSurrogate(code){return code>=55296&&code<=56319}function isLowSurrogate(code){return code>=56320&&code<=57343}var ScalarScanner=class{#offset=0;#pendingHigh;push(delta){let entries=[],input=delta;this.#pendingHigh!==void 0&&(input=this.#pendingHigh+delta,this.#offset-=1,this.#pendingHigh=void 0);let i=0;for(;i<input.length;){let code=input.charCodeAt(i);if(isHighSurrogate(code)){if(i+1>=input.length){this.#pendingHigh=input[i],this.#offset+=1;break}let next=input.charCodeAt(i+1);if(isLowSurrogate(next)){entries.push({value:input.slice(i,i+2),startOffset:this.#offset,width:2}),this.#offset+=2,i+=2;continue}}entries.push({value:input.slice(i,i+1),startOffset:this.#offset,width:1}),this.#offset+=1,i+=1}return entries}hasPendingSurrogate(){return this.#pendingHigh!==void 0}get offset(){return this.#offset}},FixedRing=class{#capacity;#entries=[];constructor(capacity){this.#capacity=capacity}push(entry){this.#entries.push(entry),this.#entries.length>this.#capacity&&this.#entries.shift()}getBack(offset){return this.#entries[this.#entries.length-1-offset]}get size(){return this.#entries.length}toArray(){return[...this.#entries]}clear(){this.#entries=[]}};function isAsciiWhitespace(code){return code===32||code>=9&&code<=13}var CharCode={Tab:9,LineFeed:10,VerticalTab:11,FormFeed:12,CarriageReturn:13,Space:32,LessThan:60,LeftBracket:91,Backslash:92,RightBracket:93,Underscore:95,Pipe:124};var CJK_SCALAR_RUN_THRESHOLD=224,PUNCTUATION_RUN_THRESHOLD=256,RUN_WHITESPACE_MAX_CHARS=32,RUN_WHITESPACE_TARGET_RATIO=8,NEWLINE_FLOOD_MIN_CHARS=320,NEWLINE_FLOOD_MIN_NEWLINES=8,GENERIC_FLOOD_MIN_CHARS=480,ASCII_PRINTABLE_MAX=126,ASCII_END=127,BOX_DRAWING_START=9472,BLOCK_ELEMENT_END=9631,NON_DECORATIVE_ASCII_PUNCT=new Set([33,36,37,38,63,64]);function codePointOf(entry){return entry.value.codePointAt(0)??0}function isAsciiAlphanumeric(code){return code>=48&&code<=57||code>=65&&code<=90||code>=97&&code<=122}function isBoxDrawing(code){return code>=BOX_DRAWING_START&&code<=BLOCK_ELEMENT_END}function isDecorativeScalar(code){return code<=ASCII_END?code>CharCode.Space&&code<=ASCII_PRINTABLE_MAX&&!isAsciiAlphanumeric(code)&&!NON_DECORATIVE_ASCII_PUNCT.has(code):isBoxDrawing(code)}function runThresholdFor(entry){let code=codePointOf(entry);return code>ASCII_END?isBoxDrawing(code)?0:CJK_SCALAR_RUN_THRESHOLD:NON_DECORATIVE_ASCII_PUNCT.has(code)?PUNCTUATION_RUN_THRESHOLD:0}function createDominantRunState(){return{active:!1,target:"",targetWidth:0,threshold:0,count:0,whitespaceUsed:0,startOffset:0}}function updateDominantRun(state,entry){let code=codePointOf(entry);if(isAsciiWhitespace(code)){if(!state.active)return null;let nextWhitespace=state.whitespaceUsed+1;return nextWhitespace>RUN_WHITESPACE_MAX_CHARS||nextWhitespace*RUN_WHITESPACE_TARGET_RATIO>state.count?(state.active=!1,null):(state.whitespaceUsed=nextWhitespace,null)}let threshold=runThresholdFor(entry);return threshold===0?(state.active=!1,null):!state.active||state.target!==entry.value?(state.active=!0,state.target=entry.value,state.targetWidth=entry.width,state.threshold=threshold,state.count=1,state.whitespaceUsed=0,state.startOffset=entry.startOffset,null):(state.count+=1,state.count<state.threshold?null:{rule:"collapse-repetition",reason:`dominant scalar run U+${code.toString(16)} repeated ${state.count} times`,anomalyStartOffset:state.startOffset,garbageStartOffset:state.startOffset+state.targetWidth,detail:{mechanism:"dominant-scalar-run",codePoint:code,count:state.count,threshold:state.threshold}})}function createWhitespaceFloodState(){return{count:0,newlines:0,startOffset:0}}function updateWhitespaceFlood(state,entry){let code=codePointOf(entry);if(!isAsciiWhitespace(code))return state.count=0,state.newlines=0,null;state.count===0&&(state.startOffset=entry.startOffset),state.count+=1,code===CharCode.LineFeed&&(state.newlines+=1);let newlineFlood=state.count>=NEWLINE_FLOOD_MIN_CHARS&&state.newlines>=NEWLINE_FLOOD_MIN_NEWLINES,genericFlood=state.count>=GENERIC_FLOOD_MIN_CHARS;return!newlineFlood&&!genericFlood?null:{rule:"collapse-repetition",reason:`whitespace flood of ${state.count} characters with ${state.newlines} newlines`,anomalyStartOffset:state.startOffset,garbageStartOffset:state.startOffset+1,detail:{mechanism:"whitespace-flood",whitespaceChars:state.count,newlines:state.newlines}}}var LINE_RING_CAPACITY=16,LINE_PERIOD_MAX=4,LINE_CYCLE_MIN_CYCLES=6,LINE_MIN_REPEATED_CHARS=384,LINE_TEXT_RETENTION_MAX=512,SAMPLE_LENGTH=80,HASH_A_OFFSET=2166136261,HASH_A_PRIME=16777619,HASH_B_OFFSET=5381,HASH_B_MULTIPLIER=31;function createLineCycleState(){return{ring:new FixedRing(LINE_RING_CAPACITY),matched:new Array(LINE_PERIOD_MAX+1).fill(0),repeatedChars:new Array(LINE_PERIOD_MAX+1).fill(0),blockStart:new Array(LINE_PERIOD_MAX+1).fill(0),cycleWidth:new Array(LINE_PERIOD_MAX+1).fill(0),hashA:HASH_A_OFFSET,hashB:HASH_B_OFFSET,length:0,startOffset:0,hasContent:!1,retained:"",retaining:!0}}function measureCycleWidth(ring,period){let width=0;for(let back=1;back<=period;back++){let line=ring.getBack(back);if(line===void 0)break;width+=line.utf16Length+1}return width}function measureBlockChars(ring,period){let chars=0;for(let back=0;back<=period;back++){let line=ring.getBack(back);if(line===void 0)break;chars+=line.utf16Length}return chars}function updateLineCycles(state,entry){if(entry.value.charCodeAt(0)===CharCode.LineFeed)return completeLine(state,entry);for(let i=0;i<entry.value.length;i++){let code=entry.value.charCodeAt(i);state.hashA=Math.imul(state.hashA^code,HASH_A_PRIME),state.hashB=Math.imul(state.hashB,HASH_B_MULTIPLIER)+code|0}let codePoint=entry.value.codePointAt(0)??0;return!state.hasContent&&!isAsciiWhitespace(codePoint)&&!isDecorativeScalar(codePoint)&&(state.hasContent=!0),state.length+=entry.width,state.retaining&&(state.retained+=entry.value,state.retained.length>LINE_TEXT_RETENTION_MAX&&(state.retaining=!1,state.retained="")),null}function completeLine(state,entry){let line={hashA:state.hashA,hashB:state.hashB,utf16Length:state.length,startOffset:state.startOffset,eligible:state.hasContent,text:state.retaining?state.retained:void 0};state.ring.push(line),state.hashA=HASH_A_OFFSET,state.hashB=HASH_B_OFFSET,state.length=0,state.startOffset=entry.startOffset+1,state.hasContent=!1,state.retained="",state.retaining=!0;for(let period=1;period<=LINE_PERIOD_MAX;period++){let back=state.ring.getBack(period);if(back===void 0||!back.eligible||!line.eligible||back.utf16Length!==line.utf16Length||back.hashA!==line.hashA||back.hashB!==line.hashB){state.matched[period]=0,state.repeatedChars[period]=0;continue}if(state.matched[period]===0?(state.blockStart[period]=back.startOffset,state.cycleWidth[period]=measureCycleWidth(state.ring,period),state.repeatedChars[period]=measureBlockChars(state.ring,period),state.matched[period]=1):(state.matched[period]+=1,state.repeatedChars[period]+=line.utf16Length),state.matched[period]<(LINE_CYCLE_MIN_CYCLES-1)*period||state.repeatedChars[period]<LINE_MIN_REPEATED_CHARS)continue;let cycles=Math.floor(state.matched[period]/period)+1;return{rule:"collapse-repetition",reason:`line cycle with period ${period} over ${cycles} cycles (${state.repeatedChars[period]} repeated chars)`,anomalyStartOffset:state.blockStart[period],garbageStartOffset:state.blockStart[period]+state.cycleWidth[period],detail:{mechanism:"line-cycle",period,cycles,repeatedChars:state.repeatedChars[period],sample:(line.text??"").slice(0,SAMPLE_LENGTH)}}}return null}var NEAR_DUPLICATE_MIN_CHARS=64,NEAR_DUPLICATE_MIN_WORD_CHARS=24,NEAR_DUPLICATE_SIMILARITY=.5,NEAR_DUPLICATE_LOOKBACK=32,NEAR_DUPLICATE_WINDOW=12,NEAR_DUPLICATE_ECHO_THRESHOLD=8,NEAR_DUPLICATE_TEXT_RETENTION_MAX=512,SAMPLE_LENGTH2=80,WORD_PATTERN2=/[\p{L}\p{N}#]+/gu,FENCE_PATTERN=/^(?:```|~~~)/;function createNearDuplicateState(){return{history:new FixedRing(NEAR_DUPLICATE_LOOKBACK),window:new FixedRing(NEAR_DUPLICATE_WINDOW),lineLength:0,lineWordChars:0,lineHasContent:!1,lineStartOffset:0,lineText:"",length:0,wordChars:0,startOffset:0,retained:"",fenced:!1,insideFence:!1}}function tokenize3(text2){return new Set(normalizeTurnText(text2).match(WORD_PATTERN2)??[])}function jaccard(a,b){if(a.size===0||b.size===0)return 0;let intersection=0;for(let token of a)b.has(token)&&(intersection+=1);return intersection/(a.size+b.size-intersection)}function resetParagraph(state){state.length=0,state.wordChars=0,state.startOffset=0,state.retained="",state.fenced=!1}function countEchoes(state){let echoes=0;for(let back=state.window.size-1;back>=0;back--)state.window.getBack(back)?.echoed===!0&&(echoes+=1);return echoes}function oldestEcho(state){for(let back=state.window.size-1;back>=0;back--){let entry=state.window.getBack(back);if(entry?.echoed===!0)return entry}}function completeParagraph(state){let eligible=!state.fenced&&state.length>=NEAR_DUPLICATE_MIN_CHARS&&state.wordChars>=NEAR_DUPLICATE_MIN_WORD_CHARS,text2=state.retained,startOffset=state.startOffset;if(resetParagraph(state),!eligible)return null;let tokens=tokenize3(text2);if(tokens.size===0)return null;let best=0,anchor;for(let back=0;back<state.history.size;back++){let previous=state.history.getBack(back);if(previous===void 0)continue;let similarity=jaccard(tokens,previous.tokens);similarity>best&&(best=similarity,anchor=previous)}let echoed=best>=NEAR_DUPLICATE_SIMILARITY&&anchor!==void 0;state.history.push({tokens,startOffset,sample:text2.slice(0,SAMPLE_LENGTH2)}),state.window.push({echoed,startOffset,anchorStartOffset:echoed&&anchor!==void 0?anchor.startOffset:startOffset});let echoes=countEchoes(state);if(echoes<NEAR_DUPLICATE_ECHO_THRESHOLD)return null;let first=oldestEcho(state);return first===void 0?null:{rule:"collapse-repetition",reason:`${echoes} of the last ${state.window.size} paragraphs restate an earlier paragraph of the same message`,anomalyStartOffset:first.anchorStartOffset,garbageStartOffset:first.startOffset,detail:{mechanism:"near-duplicate-paragraphs",echoes,window:state.window.size,similarity:Number(best.toFixed(3)),sample:anchor?.sample??""}}}function foldLine(state){state.length===0&&(state.startOffset=state.lineStartOffset),state.length+=state.lineLength+1,state.wordChars+=state.lineWordChars,(state.insideFence||FENCE_PATTERN.test(state.lineText.trimStart()))&&(state.fenced=!0),state.retained.length<NEAR_DUPLICATE_TEXT_RETENTION_MAX&&(state.retained+=`${state.lineText}
|
|
@@ -2287,7 +2287,7 @@ ${command}`:command,spawnContext=resolveSpawnContext(resolvedCommand,ctx?.cwd||c
|
|
|
2287
2287
|
|
|
2288
2288
|
${notice2}`,content,details}},appendStatus=(text2,status)=>`${text2?`${text2}
|
|
2289
2289
|
|
|
2290
|
-
`:""}${status}`;try{let exitCode;try{exitCode=(await ops.exec(spawnContext.command,spawnContext.cwd,{onData:handleData,signal,timeout,env:spawnContext.env})).exitCode}catch(err2){let snapshot2;try{snapshot2=await finishOutput()}catch(cleanupError){throw new AggregateError([err2,cleanupError],"Bash command and output cleanup failed")}let{text:text2}=formatOutput(snapshot2,"");if(err2 instanceof Error&&err2.message==="aborted")throw new Error(appendStatus(text2,"Command aborted"));if(err2 instanceof Error&&err2.message.startsWith("timeout:")){let timeoutSecs=err2.message.split(":")[1];throw new Error(appendStatus(text2,`Command timed out after ${timeoutSecs} seconds`))}try{await output.removeTempFile()}catch(unlinkError){throw new AggregateError([err2,unlinkError],"Bash command and output cleanup failed")}throw err2}let snapshot=await finishOutput(),{text:outputText,content,details}=formatOutput(snapshot);if(exitCode!==0&&exitCode!==null)throw new Error(appendStatus(outputText,`Command exited with code ${exitCode}`));return{content,details}}finally{clearUpdateTimer()}},...createShellRenderers(config.prompt)}}var bashToolConfig={name:"bash",label:"bash",shellName:"bash",prompt:"$",promptSnippet:bashToolSystemPromptContribution.snippet,promptGuidelines:bashToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-bash"};function createBashToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,bashToolConfig,options),exposure:"eval"}}function createBashTool2(cwd,options){let definition=createBashToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants7}from"fs";import{access as fsAccess2,readFile as fsReadFile2,writeFile as fsWriteFile}from"fs/promises";import{constants as constants6}from"fs";import{access as access4,readFile as readFile20}from"fs/promises";import{accessSync as accessSync2,constants as constants5}from"node:fs";import{access as access3}from"node:fs/promises";var NARROW_NO_BREAK_SPACE2="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE2}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function fileExists3(filePath){try{return accessSync2(filePath,constants5.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access3(filePath,constants5.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists3(resolved))return resolved;let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists3(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists3(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists3(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists3(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}function detectLineEnding2(content){let crlfIdx=content.indexOf(`\r
|
|
2290
|
+
`:""}${status}`;try{let exitCode;try{exitCode=(await ops.exec(spawnContext.command,spawnContext.cwd,{onData:handleData,signal,timeout,env:spawnContext.env})).exitCode}catch(err2){let snapshot2;try{snapshot2=await finishOutput()}catch(cleanupError){throw new AggregateError([err2,cleanupError],"Bash command and output cleanup failed")}let{text:text2}=formatOutput(snapshot2,"");if(err2 instanceof Error&&err2.message==="aborted")throw new Error(appendStatus(text2,"Command aborted"));if(err2 instanceof Error&&err2.message.startsWith("timeout:")){let timeoutSecs=err2.message.split(":")[1];throw new Error(appendStatus(text2,`Command timed out after ${timeoutSecs} seconds`))}try{await output.removeTempFile()}catch(unlinkError){throw new AggregateError([err2,unlinkError],"Bash command and output cleanup failed")}throw err2}let snapshot=await finishOutput(),{text:outputText,content,details}=formatOutput(snapshot);if(exitCode!==0&&exitCode!==null)throw new Error(appendStatus(outputText,`Command exited with code ${exitCode}`));return{content,details}}finally{clearUpdateTimer()}},...createShellRenderers(config.prompt)}}var bashToolConfig={name:"bash",label:"bash",shellName:"bash",prompt:"$",promptSnippet:bashToolSystemPromptContribution.snippet,promptGuidelines:bashToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-bash"};function createBashToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,bashToolConfig,options),exposure:"eval"}}function createBashTool2(cwd,options){let definition=createBashToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants7}from"fs";import{access as fsAccess2,readFile as fsReadFile2,writeFile as fsWriteFile}from"fs/promises";import{constants as constants6}from"fs";import{access as access4,readFile as readFile20}from"fs/promises";import{accessSync as accessSync2,constants as constants5}from"node:fs";import{access as access3}from"node:fs/promises";var NARROW_NO_BREAK_SPACE2="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE2}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function unquotedPath(filePath){return/^@?(["'])(.+)\1$/.exec(filePath.trim())?.[2]}function fileExists3(filePath){try{return accessSync2(filePath,constants5.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access3(filePath,constants5.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists3(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPath(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists3(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists3(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists3(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists3(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPathAsync(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}function detectLineEnding2(content){let crlfIdx=content.indexOf(`\r
|
|
2291
2291
|
`),lfIdx=content.indexOf(`
|
|
2292
2292
|
`);return lfIdx===-1||crlfIdx===-1?`
|
|
2293
2293
|
`:crlfIdx<lfIdx?`\r
|
|
@@ -2366,12 +2366,12 @@ ${renderToolDiff(generateAddedContentDiff(normalizedContent,maxLines),{filePath:
|
|
|
2366
2366
|
|
|
2367
2367
|
${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",line)).join(`
|
|
2368
2368
|
`)}`}remaining>0&&(text2+=`${theme2.fg("muted",`
|
|
2369
|
-
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text2}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str2(renderArgs?.file_path??renderArgs?.path),fileContent=str2(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text2=context.lastComponent??new Text("",0,0);return text2.setText(output),text2}};var writeSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path13,content)=>fsWriteFile2(path13,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path13,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path13,ctx?.cwd||cwd),dir=dirname39(absolutePath);return withFileMutationQueue2(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path13}`}],details:createWriteDetails(path13,content,baseline)}})},...writeRenderers}}function createWriteTool2(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool2(cwd,options?.bash),createEditTool2(cwd,options?.edit),createWriteTool2(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}import{constants as constants9,copyFileSync,existsSync as existsSync32,mkdirSync as mkdirSync16}from"node:fs";import{basename as basename23,join as join65,parse as parse4,resolve as resolve34}from"node:path";import{basename as basename22}from"node:path";var RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function cloneJsonValue(value2){let serialized=JSON.stringify(value2);if(serialized===void 0)throw new Error("Expected JSON-serializable value");return JSON.parse(serialized)}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}async function emitSessionShutdownEvent(extensionRunner,event){return extensionRunner.hasHandlers("session_shutdown")?(await extensionRunner.emit(event),!0):!1}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let ext of extensionsResult.extensions){let handlers=ext.handlers.get("project_trust");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.extensions=extensions,this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){this.runtime.sendMessage=actions.sendMessage,this.runtime.sendUserMessage=actions.sendUserMessage,this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest;for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err2){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}wrapUIPromptContext(ui){let questionFn=ui.question;return{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts))}:{}}}withUIPrompt(kind,title,run){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title},this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run().finally(finish)}catch(err2){throw finish(),err2}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path13,resolvedPath})=>({path:path13,resolvedPath}))}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing=toolsByName.get(tool.definition.name);(!existing||existing.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing=serversByName.get(decl.name);existing===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing.extensionPath} and ${ext.path}; keeping first declaration from ${existing.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value2){this.runtime.flagValues.set(name,value2)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(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()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename22(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run){let base={type:"tool_hook_status",hookRunId:`${run.toolCallId}:${run.hookName}:${this.nextToolHookRunIndex++}`,hookName:run.hookName,toolName:run.toolName,toolCallId:run.toolCallId,extensionPath:run.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run.extensionPath,run.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage8)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage8!==void 0?{errorMessage:errorMessage8}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal;return{get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},abort:source=>{runner.assertActive(),runner.abortFn(source)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async messages=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())}}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text2,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text2,options)),context.editUserMessage=(entryId,text2,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text2,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`),{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,budget){let controller=new AbortController,startedAt=Date.now(),outcome,settled=Promise.resolve(handler({...event,signal:controller.signal},this.createContext(extensionPath))).then(()=>{outcome={ok:!0}},error2=>{outcome={ok:!1,error:error2}});if(budget.warnMs>0||budget.timeoutMs>0){let warnTimer,capTimer,timedOut=!1;try{timedOut=await new Promise(resolve42=>{budget.warnMs>0&&(warnTimer=setTimeout(()=>{let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now()-startedAt}ms${capNote}.`)},budget.warnMs)),budget.timeoutMs>0&&(capTimer=setTimeout(()=>resolve42(!0),budget.timeoutMs)),settled.then(()=>resolve42(!1))})}finally{clearTimeout(warnTimer),clearTimeout(capTimer)}if(timedOut){controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`)),this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`});return}}else await settled;if(outcome&&!outcome.ok)throw outcome.error}async emit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let ext of this.extensions){let handlers=ext.handlers.get(event.type);if(!(!handlers||handlers.length===0))for(let handler of handlers)try{if(isSessionShutdown){shutdownBudget??=this.resolveSessionShutdownBudget(),await this.runSessionShutdownHandler(ext.path,event,handler,shutdownBudget);continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}async emitMessageEnd(event){let currentMessage=event.message,modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("message_end");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let currentEvent={...event,message:currentMessage},handlerResult=await handler(currentEvent,this.createContext(ext.path));if(!handlerResult?.message)continue;if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:ext.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}currentMessage=handlerResult.message,modified=!0}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"message_end",error:message,stack})}}return modified?currentMessage:void 0}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_result");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;endStatus="failed",errorMessage8=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage8)}}}if(modified)return{content:currentEvent.content,details:currentEvent.details,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_call");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err2){throw endStatus="failed",errorMessage8=err2 instanceof Error?err2.message:String(err2),err2}finally{hookRun.end(endStatus,errorMessage8)}}}return result3}async emitUserBash(event){for(let ext of this.extensions){let handlers=ext.handlers.get("user_bash");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult)return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack})}}}async emitContext(messages,excludeExtensionPath){let currentMessages=cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message});for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("context");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler({type:"context",messages:currentMessages},this.createContext(ext.path));handlerResult&&handlerResult.messages&&(currentMessages=handlerResult.messages)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context",error:message,stack})}}return currentMessages}async prepareProviderRequest(messages,excludeExtensionPath){return{messages:await this.emitContext(messages,excludeExtensionPath),transformPayload:async payload=>await this.emitBeforeProviderRequest(payload,excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("before_provider_request");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}}return currentPayload}async emitBeforeProviderHeaders(headers){for(let ext of this.extensions){let handlers=ext.handlers.get("before_provider_headers");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}}return headers}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let ext of this.extensions){let handlers=ext.handlers.get("before_agent_start");if(!(!handlers||handlers.length===0))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},handlerResult=await handler(event,ctx);if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0)}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry,extensionPath)=>typeof entry=="string"?{path:entry,extensionPath}:entry.scope===void 0?{path:entry.path,extensionPath}:{path:entry.path,extensionPath,scope:entry.scope};for(let ext of this.extensions){let handlers=ext.handlers.get("resources_discover");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry=>toEntry(entry,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry=>toEntry(entry,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry=>toEntry(entry,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry=>toEntry(entry,ext.path)))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text2,images,source,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let ext of this.extensions)for(let handler of ext.handlers.get("input")??[])try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err2){this.emitError({extensionPath:ext.path,event:"input",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}return currentText!==text2||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};import{join as join64}from"node:path";async function joinStartupBranches(primary,secondary){let[primaryResult,secondaryResult]=await Promise.allSettled([primary,secondary]);if(primaryResult.status==="rejected")throw primaryResult.reason;if(secondaryResult.status==="rejected")throw secondaryResult.reason;return{primary:primaryResult.value,secondary:secondaryResult.value}}function applyExtensionFlagValues(resourceLoader,extensionFlagValues){if(!extensionFlagValues)return[];let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredFlags=new Map;for(let extension of extensionsResult.extensions)for(let[name,flag]of extension.flags)registeredFlags.has(name)||registeredFlags.set(name,{type:flag.type});let unknownFlags=[];for(let[name,value2]of extensionFlagValues){let flag=registeredFlags.get(name);if(!flag){unknownFlags.push(name);continue}if(flag.type==="boolean"){extensionsResult.runtime.flagValues.set(name,!0);continue}if(typeof value2=="string"){extensionsResult.runtime.flagValues.set(name,value2);continue}diagnostics.push({type:"error",message:`Extension flag "--${name}" requires a value`})}return unknownFlags.length>0&&diagnostics.push({type:"error",message:`Unknown option${unknownFlags.length===1?"":"s"}: ${unknownFlags.map(name=>`--${name}`).join(", ")}`}),diagnostics}async function createAgentSessionServices(options){let cwd=resolvePath(options.cwd),agentDir=options.agentDir?resolvePath(options.agentDir):getAgentDir(),authStorage=AuthStorage.create(join64(agentDir,"auth.json")),runtimePromise=options.modelRuntime!==void 0?Promise.resolve(options.modelRuntime):ModelRuntime.create({credentials:authStorage,authPath:join64(agentDir,"auth.json"),agentDir,modelsPath:join64(agentDir,"models.json"),signal:options.modelRuntimeSignal}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),resourceLoader=new DefaultResourceLoader({...options.resourceLoaderOptions??{},cwd,agentDir,settingsManager,mcpRegistry:options.mcpRegistry}),{primary:modelRuntime}=await joinStartupBranches(runtimePromise,resourceLoader.reload(options.resourceLoaderReloadOptions)),modelRegistry=new ModelRegistry(modelRuntime,authStorage);modelRuntime.setSettingsManager(settingsManager);let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredProviders=new Set;for(let registration of drainPendingProviderRegistrations(extensionsResult.runtime))try{registration.kind==="config"?(modelRuntime.registerProvider(registration.name,registration.config,{refresh:!1}),registeredProviders.add(registration.name)):(modelRuntime.registerNativeProvider(registration.provider,{refresh:!1}),registeredProviders.add(registration.provider.id))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${registration.extensionPath}" error: ${message}`})}return options.modelRuntime===void 0?await modelRuntime.refresh({allowNetwork:!1}):registeredProviders.size>0&&await modelRuntime.refresh({allowNetwork:!1,providers:[...registeredProviders]}),diagnostics.push(...applyExtensionFlagValues(resourceLoader,options.extensionFlagValues)),{cwd,agentDir,authStorage,modelRegistry,modelRuntime,settingsManager,resourceLoader,diagnostics}}async function createAgentSessionFromServices(options){return createAgentSession({cwd:options.services.cwd,agentDir:options.services.agentDir,modelRuntime:options.services.modelRuntime,modelRegistry:options.services.modelRegistry,authStorage:options.services.authStorage,settingsManager:options.services.settingsManager,resourceLoader:options.services.resourceLoader,sessionManager:options.sessionManager,model:options.model,thinkingLevel:options.thinkingLevel,thinkingSelection:options.thinkingSelection,scopedModels:options.scopedModels,favoriteModels:options.favoriteModels,tools:options.tools,excludeTools:options.excludeTools,noTools:options.noTools,customTools:options.customTools,sessionStartEvent:options.sessionStartEvent,autoTitleSessions:options.autoTitleSessions})}var SessionImportFileNotFoundError=class extends Error{constructor(filePath){super(`File not found: ${filePath}`),this.name="SessionImportFileNotFoundError",this.filePath=filePath}};function extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text"&&typeof part.text=="string").map(part=>part.text).join("")}var AgentSessionRuntime=class{constructor(_session,_services,createRuntime,_diagnostics=[],_modelFallbackMessage,launchProfile){this._session=_session,this._services=_services,this.createRuntime=createRuntime,this._diagnostics=_diagnostics,this._modelFallbackMessage=_modelFallbackMessage,this._launchProfile=launchProfile}get services(){return this._services}get session(){return this._session}get cwd(){return this._services.cwd}get diagnostics(){return this._diagnostics}get modelFallbackMessage(){return this._modelFallbackMessage}get launchProfile(){return this._launchProfile}setRebindSession(rebindSession){this.rebindSession=rebindSession}setBeforeSessionInvalidate(beforeSessionInvalidate){this.beforeSessionInvalidate=beforeSessionInvalidate}async emitAttachmentEvent(type2){let runner=this.session.extensionRunner;runner.hasHandlers(type2)&&await runner.emit({type:type2})}async emitBeforeSwitch(reason,targetSessionFile){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_switch")?{cancelled:(await runner.emit({type:"session_before_switch",reason,targetSessionFile}))?.cancel===!0}:{cancelled:!1}}async emitBeforeFork(entryId,options){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_fork")?{cancelled:(await runner.emit({type:"session_before_fork",entryId,...options}))?.cancel===!0}:{cancelled:!1}}async teardownCurrent(reason,targetSessionFile){let mark=label3=>{reason==="resume"&&time(label3,"switch")};await this.session.abort(),mark("abort");let oldRunner=this.session.extensionRunner;typeof oldRunner.getExtensionIdentities=="function"&&(this._removedOnReplacement={oldRunner,oldIdentities:oldRunner.getExtensionIdentities(),reason}),await emitSessionShutdownEvent(oldRunner,{type:"session_shutdown",reason,targetSessionFile}),mark("shutdown"),this.beforeSessionInvalidate?.();let replaced=this.session.sessionManager;this.session.dispose(),unregisterSessionWriter(replaced),mark("dispose")}async reportRemovedExtensions(){let pending=this._removedOnReplacement;if(this._removedOnReplacement=void 0,!pending)return;let newRunner=this.session.extensionRunner;if(typeof newRunner.getExtensionIdentities!="function")return;let newResolvedPaths=new Set(newRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=pending.oldIdentities.filter(extension=>!newResolvedPaths.has(extension.resolvedPath));removed.length!==0&&await pending.oldRunner.emit({type:"session_extensions_removed",reason:pending.reason,removed})}async apply(result3){this._session=result3.session,this._services=result3.services,this._diagnostics=result3.diagnostics,this._modelFallbackMessage=result3.modelFallbackMessage,await this.reportRemovedExtensions()}async finishSessionReplacement(withSession){this.rebindSession&&await this.rebindSession(this.session),withSession&&await withSession(this.session.createReplacedSessionContext())}async switchSession(sessionPath,options){resetTimings("switch");let beforeResult=await this.emitBeforeSwitch("resume",sessionPath);if(beforeResult.cancelled)return beforeResult;time("beforeSwitch","switch");let previousSessionFile=this.session.sessionFile,sessionManager=SessionManager.open(sessionPath,void 0,options?.cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),time("open","switch"),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},projectTrustContext:options?.projectTrustContextFactory?.(sessionManager.getCwd()),launchProfile:this._launchProfile})),time("apply","switch"),await this.finishSessionReplacement(options?.withSession),time("rebind","switch"),{cancelled:!1}}async newSession(options){let beforeResult=await this.emitBeforeSwitch("new");if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile,sessionDir=this.session.sessionManager.getSessionDir(),sessionManager=this.session.sessionManager.isPersisted()?SessionManager.create(this.cwd,sessionDir):SessionManager.inMemory(this.cwd);return options?.parentSession&&sessionManager.newSession({parentSession:options.parentSession}),await this.teardownCurrent("new",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"new",previousSessionFile},launchProfile:this._launchProfile})),options?.setup&&(await options.setup(this.session.sessionManager),this.session.agent.state.messages=this.session.sessionManager.buildSessionContext().messages),await this.finishSessionReplacement(options?.withSession),{cancelled:!1}}async fork(entryId,options){let position=options?.position??"before";if((await this.emitBeforeFork(entryId,{position})).cancelled)return{cancelled:!0};let targetLeafId,selectedText,selectedEntry=this.session.sessionManager.getEntry(entryId);if(!selectedEntry)throw new Error("Invalid entry ID for forking");if(position==="at")targetLeafId=selectedEntry.id;else{if(selectedEntry.type!=="message"||selectedEntry.message.role!=="user")throw new Error("Invalid entry ID for forking");targetLeafId=selectedEntry.parentId,selectedText=extractUserMessageText(selectedEntry.message.content)}let previousSessionFile=this.session.sessionFile;if(this.session.sessionManager.isPersisted()){let currentSessionFile=this.session.sessionFile;if(!currentSessionFile)throw new Error("Persisted session is missing a session file");let sessionDir=this.session.sessionManager.getSessionDir();if(!targetLeafId){let sessionManager3=SessionManager.create(this.cwd,sessionDir);return sessionManager3.newSession({parentSession:currentSessionFile}),await this.teardownCurrent("fork",sessionManager3.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager:sessionManager3,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}if(!existsSync32(currentSessionFile))throw new Error("This session has not been saved yet. Wait for the first assistant response before cloning or forking it.");let sessionManager2=SessionManager.open(currentSessionFile,sessionDir);if(!sessionManager2.createBranchedSession(targetLeafId))throw new Error("Failed to create forked session");return await this.teardownCurrent("fork",sessionManager2.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager2.getCwd(),agentDir:this.services.agentDir,sessionManager:sessionManager2,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}let sessionManager=this.session.sessionManager;return await this.teardownCurrent("fork",sessionManager.getSessionFile()),targetLeafId?sessionManager.createBranchedSession(targetLeafId):sessionManager.newSession({parentSession:previousSessionFile}),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}async importFromJsonl(inputPath,cwdOverride){let resolvedPath=resolvePath(inputPath);if(!existsSync32(resolvedPath))throw new SessionImportFileNotFoundError(resolvedPath);let sessionDir=this.session.sessionManager.getSessionDir();existsSync32(sessionDir)||mkdirSync16(sessionDir,{recursive:!0});let destinationPath=join65(sessionDir,basename23(resolvedPath)),sourceAlreadyStored=resolve34(destinationPath)===resolvedPath;if(!sourceAlreadyStored){let{name,ext}=parse4(destinationPath),suffix=1;for(;existsSync32(destinationPath);)destinationPath=join65(sessionDir,`${name}-${suffix++}${ext}`)}let beforeResult=await this.emitBeforeSwitch("resume",destinationPath);if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile;reserveSessionWrite(destinationPath),sourceAlreadyStored||copyFileSync(resolvedPath,destinationPath,constants9.COPYFILE_EXCL);let sessionManager=SessionManager.open(destinationPath,sessionDir,cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(),{cancelled:!1}}async dispose(){await emitSessionShutdownEvent(this.session.extensionRunner,{type:"session_shutdown",reason:"quit"}),this.beforeSessionInvalidate?.(),this.session.dispose()}};async function createAgentSessionRuntime(createRuntime,options){assertSessionCwdExists(options.sessionManager,options.cwd);let result3=await createRuntime(options);return new AgentSessionRuntime(result3.session,result3.services,createRuntime,result3.diagnostics,result3.modelFallbackMessage,options.launchProfile)}setDefaultStreamFn(streamSimple);function clampThinkingLevelToModel(level,model){if(!model?.reasoning)return"off";let requested=level??"off",available=getSupportedThinkingLevels(model);if(available.includes(requested))return requested;let ordered=["off","minimal","low","medium","high","xhigh","max"],requestedIndex=ordered.indexOf(requested);for(let index=requestedIndex-1;index>=0;index--){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}for(let index=requestedIndex+1;index<ordered.length;index++){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}return available[0]??"off"}function getDefaultAgentDir(){return getAgentDir()}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join66(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join66(agentDir,"models.json"):void 0,authStorage=options.authStorage??options.modelRegistry?.authStorage??AuthStorage.create(authPath),modelRuntime=options.modelRuntime??options.modelRegistry?.modelRuntime??await ModelRuntime.create({credentials:authStorage,modelsPath,agentDir}),modelRegistry=options.modelRegistry??new ModelRegistry(modelRuntime,authStorage),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir);modelRuntime.setSettingsManager(settingsManager);let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),scopedModels=options.scopedModels??await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:settingsManager.getEnabledModels()}),modelRuntime),favoriteModels2=options.favoriteModels??await resolveModelScope(settingsManager.getFavoriteModels()??[],modelRuntime);resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,initialModelProvenance=options.initialModelProvenance,initialResolvedThinkingLevel,initialThinkingSelection=options.thinkingSelection,modelFallbackMessage;if(model){let resolved=resolveStoredModelReference(model.provider,model.id,modelRuntime);resolved?.thinkingSelection&&(model=resolved.model,initialResolvedThinkingLevel=resolved.thinkingLevel,initialThinkingSelection??=resolved.thinkingSelection)}if(!model&&hasExistingSession&&existingSession.model){let restored=resolveStoredModelReference(existingSession.model.provider,existingSession.model.modelId,modelRuntime);restored&&modelRuntime.hasConfiguredAuth(restored.model.provider)&&(model=restored.model,initialResolvedThinkingLevel=restored.thinkingLevel,initialThinkingSelection=restored.thinkingSelection),model||(modelFallbackMessage=`Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`)}if(!model){let result3=await findInitialModel({scopedModels,isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime});model=result3.model,initialModelProvenance=result3.provenance;let selectedModel=model,scopedSelection=selectedModel?scopedModels.find(entry=>entry.model.provider===selectedModel.provider&&entry.model.id===selectedModel.id):void 0;initialResolvedThinkingLevel=scopedSelection?.thinkingLevel??result3.thinkingLevel,initialThinkingSelection=scopedSelection?.thinkingSelection??result3.thinkingSelection,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage()}let thinkingLevel=options.thinkingLevel??initialResolvedThinkingLevel,thinkingSelection=options.thinkingSelection??(options.thinkingLevel!==void 0?{level:options.thinkingLevel,source:"explicit"}:void 0)??initialThinkingSelection;if(thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel,thinkingSelection=existingSession.thinkingSelection),thinkingLevel===void 0&&model){let remembered=settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(thinkingLevel=remembered,thinkingSelection={level:remembered,source:"explicit"})}if(thinkingLevel===void 0){let configuredDefault=settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0?(thinkingLevel=configuredDefault,thinkingSelection={level:configuredDefault,source:"explicit"}):thinkingLevel=DEFAULT_THINKING_LEVEL}model?thinkingLevel=clampThinkingLevelToModel(thinkingLevel,model):thinkingLevel="off",thinkingSelection&&(thinkingSelection={...thinkingSelection,level:thinkingLevel});let defaultActiveToolNames=["read","bash","edit","write","grep"],configuredDefaultToolNames=settingsManager.getDefaultTools(),sessionDefaultToolNames=options.tools===void 0&&options.noTools===void 0?configuredDefaultToolNames:void 0,allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=(options.tools??(options.noTools?[]:configuredDefaultToolNames??defaultActiveToolNames)).filter(name=>!excludedToolNameSet?.has(name)),agent,reasoningBaseline=existingSession.configurationUpdate?sessionManager.getBranch().find(entry=>entry.type==="thinking_level_change")?.thinkingLevel??thinkingLevel:void 0,convertToLlmWithBlockImages=messages=>convertToLlmForTransport(messages,{blockImages:settingsManager.getBlockImages(),budgetBytes:TRANSPORT_IMAGE_BUDGET_BYTES,alwaysKeepNewest:1,maxHistoricalImages:settingsManager.getMaxHistoricalImages()}),extensionRunnerRef={},sessionRef={},resolveRequestServiceTier=requestModel=>{if(!supportsServiceTier(requestModel.api))return;let session2=sessionRef.current,activeModel=session2?.model;return session2&&activeModel&&modelsAreEqual(activeModel,requestModel)?session2.effectiveServiceTier:modelRuntime.getCompatibilityRequestConfig(requestModel).serviceTier};agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,thinkingSelection,reasoningBaseline,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs(),headerRunner=extensionRunnerRef.current,declaredPolicy=model2.provider?modelRuntime.getProvider(model2.provider)?.retryPolicy:void 0,profileMaxRetries=declaredPolicy===void 0?providerRetrySettings.maxRetries:declaredPolicy.providerRequest.enabled?declaredPolicy.providerRequest.maxRetries:0,serviceTier=options2?.serviceTier??resolveRequestServiceTier(model2);return modelRuntime.streamSimple(model2,context,{...options2,...serviceTier!==void 0?{serviceTier}:{},timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??profileMaxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders=>{let headers=mergeProviderAttributionHeaders(model2,settingsManager,options2?.sessionId,requestHeaders);return headerRunner?.isActive&&headerRunner.hasHandlers("before_provider_headers")?headerRunner.emitBeforeProviderHeaders(headers??{}):headers??{}}})},onPayload:async(payload,_model,request2)=>{let runner=extensionRunnerRef.current;return!runner?.isActive||!runner.hasHandlers("before_provider_request")?payload:runner.emitBeforeProviderRequest(payload,void 0,request2)},onResponse:async(response,_model)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("after_provider_response")||await runner.emit({type:"after_provider_response",status:response.status,headers:response.headers})},sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let runner=extensionRunnerRef.current;return runner?.isActive?runner.emitContext(messages):messages},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),timeoutMs:settingsManager.getAgentStreamIdleTimeoutMs(),streamStartTimeoutMs:settingsManager.getAgentStreamStartTimeoutMs(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs,cursorExecHandlers:runSignal=>createSessionCursorExecBridge(sessionRef,()=>agent,runSignal)}),agent.state.thinkingSelection=thinkingSelection,hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection));let sessionStartEvent=initialModelProvenance?{...options.sessionStartEvent??{type:"session_start",reason:"startup"},initialModelProvenance}:options.sessionStartEvent,session=new AgentSession({agent,sessionManager,settingsManager,cwd,agentDir,scopedModels,favoriteModels:favoriteModels2,resourceLoader,customTools:options.customTools,modelRuntime,modelRegistry,initialActiveToolNames,defaultToolNames:sessionDefaultToolNames,allowedToolNames,excludedToolNames,extensionRunnerRef,sessionStartEvent,autoTitleSessions:options.autoTitleSessions}),liveContextTokens=hasExistingSession?existingSession.messages.reduce((total,message)=>total+estimateTokens2(message),0):0;try{session.assertModelUsable(void 0,liveContextTokens,hasExistingSession?{includeSpeculationLead:!1,admission:"resume"}:{admission:"start"})}catch(error2){if(!hasExistingSession||!(error2 instanceof ModelUsabilityBudgetError)||!session.settingsManager.getCompactionEnabled())throw error2;if(error2.projection.liveContextTokens>error2.projection.contextWindow){let plan=planResumeSlice({entries:session.sessionManager.getBranch(),projection:error2.projection});if(!plan)throw error2;session.applyResumeSlice(plan)}else session.admitResumeCompactionRequired(error2.projection)}sessionRef.current=session;let extensionsResult=resourceLoader.getExtensions();return{session,extensionsResult,modelFallbackMessage}}import{join as join75,resolve as resolve38}from"node:path";import{createInterface as createInterface2}from"node:readline";var AuthCommandError=class extends Error{},AUTH_COMMAND_USAGE={check:`${APP_NAME} auth check --provider <provider> [--json] [--credentials] [--no-refresh]`,api_key:`${APP_NAME} auth print-api-key --provider <provider> [--model <model>]`,bearer_token:`${APP_NAME} auth print-bearer-token --provider <provider> [--model <model>] [--min-expiry <duration>]`};function getAuthCommandName(kind){return kind==="check"?"auth check":kind==="api_key"?"auth print-api-key":"auth print-bearer-token"}function getAuthCommandUsage(kind){return AUTH_COMMAND_USAGE[kind]}function isAuthCommandHelp(args){return args[0]==="auth"&&(args[1]===void 0||args[1]==="help"||args.includes("--help")||args.includes("-h"))}function printAuthCommandHelp(){console.log(`Usage:
|
|
2369
|
+
... (${remaining} more lines, ${totalLines} total,`)} ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`)}return text2}var writeRenderers={renderCall(args,theme2,context){let renderArgs=args,rawPath=str2(renderArgs?.file_path??renderArgs?.path),fileContent=str2(renderArgs?.content),component=context.lastComponent??new WriteCallRenderComponent;return fileContent!==null?component.cache=context.argsComplete?rebuildWriteHighlightCacheFull(rawPath,fileContent):updateWriteHighlightCacheIncremental(component.cache,rawPath,fileContent):component.cache=void 0,component.setText(formatWriteCall(renderArgs,{argsComplete:context.argsComplete,expanded:context.expanded,isPartial:context.isPartial},theme2,component.cache,context.cwd)),component},renderResult(result3,_options,theme2,context){let output=formatWriteResult({...result3,isError:context.isError},theme2);if(!output){let component=context.lastComponent??new Container;return component.detachAll(),component}let text2=context.lastComponent??new Text("",0,0);return text2.setText(output),text2}};var writeSchema2=typebox_exports.Object({path:typebox_exports.String({description:"Path to the file to write (relative or absolute)"}),content:typebox_exports.String({description:"Content to write to the file"})}),writeToolSystemPromptContribution={snippet:"Create or overwrite files",guidelines:["Use write only for new files or complete rewrites."]},defaultWriteOperations={writeFile:(path13,content)=>fsWriteFile2(path13,content,"utf-8"),mkdir:dir=>fsMkdir(dir,{recursive:!0}).then(()=>{})};function createWriteToolDefinition(cwd,options){let ops=options?.operations??defaultWriteOperations,readBaseline=options?.operations?void 0:readLocalWriteBaseline,filesystemPolicy=options?.filesystemPolicy;return{name:"write",label:"write",description:"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",promptSnippet:writeToolSystemPromptContribution.snippet,promptGuidelines:[...writeToolSystemPromptContribution.guidelines],parameters:writeSchema2,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_toolCallId,{path:path13,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path13,ctx?.cwd||cwd),dir=dirname39(absolutePath);return withFileMutationQueue2(absolutePath,async()=>{let throwIfAborted2=()=>{if(signal?.aborted)throw new Error("Operation aborted")};if(throwIfAborted2(),filesystemPolicy){let decision=await filesystemPolicy({operation:"write",canonicalPath:await canonicalizeFilesystemPath(absolutePath),toolName:"write"});if(!decision.allow)throw new Error(decision.reason);throwIfAborted2()}let baseline=readBaseline?await readBaseline(absolutePath):{kind:"unavailable"};return throwIfAborted2(),await ops.mkdir(dir),throwIfAborted2(),await ops.writeFile(absolutePath,content),throwIfAborted2(),{content:[{type:"text",text:`Successfully wrote to ${path13}`}],details:createWriteDetails(path13,content,baseline)}})},...writeRenderers}}function createWriteTool2(cwd,options){return wrapToolDefinition(createWriteToolDefinition(cwd,options))}function createAllToolDefinitions(cwd,options){return{read:createReadToolDefinition(cwd,{folder:selectedReadFolder,...options?.read}),bash:createBashToolDefinition(cwd,options?.bash),powershell:createPowerShellToolDefinition(cwd,options?.powershell),edit:createEditToolDefinition(cwd,options?.edit),write:createWriteToolDefinition(cwd,options?.write),grep:createGrepToolDefinition(cwd,options?.grep),find:createFindToolDefinition(cwd,options?.find),ls:createLsToolDefinition(cwd,options?.ls)}}function createCodingTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createBashTool2(cwd,options?.bash),createEditTool2(cwd,options?.edit),createWriteTool2(cwd,options?.write)]}function createReadOnlyTools(cwd,options){return[createReadTool2(cwd,{folder:selectedReadFolder,...options?.read}),createGrepTool(cwd,options?.grep),createFindTool(cwd,options?.find),createLsTool(cwd,options?.ls)]}import{constants as constants9,copyFileSync,existsSync as existsSync32,mkdirSync as mkdirSync16}from"node:fs";import{basename as basename23,join as join65,parse as parse4,resolve as resolve34}from"node:path";import{basename as basename22}from"node:path";var RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.copy","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],buildBuiltinKeybindings=resolvedKeybindings=>{let builtinKeybindings={};for(let[keybinding,keys]of Object.entries(resolvedKeybindings)){if(keys===void 0)continue;let keyList=Array.isArray(keys)?keys:[keys],restrictOverride=RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS.includes(keybinding);for(let key of keyList){let normalizedKey=key.toLowerCase();builtinKeybindings[normalizedKey]?.restrictOverride&&!restrictOverride||(builtinKeybindings[normalizedKey]={keybinding,restrictOverride})}}return builtinKeybindings};function cloneJsonValue(value2){let serialized=JSON.stringify(value2);if(serialized===void 0)throw new Error("Expected JSON-serializable value");return JSON.parse(serialized)}function boundedToolHookStatusMessage(message){return message.length<=79?message:`${message.slice(0,76)}...`}function sanitizedToolHookStatusMessage(message){return boundedToolHookStatusMessage(stripAnsi(message).replace(/[\r\n\t]+/g," ").replace(/[\u0000-\u001f\u007f]+/g,"").replace(/\s+/g," ").trim())}async function emitSessionShutdownEvent(extensionRunner,event){return extensionRunner.hasHandlers("session_shutdown")?(await extensionRunner.emit(event),!0):!1}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let ext of extensionsResult.extensions){let handlers=ext.handlers.get("project_trust");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,ctx);if(handlerResult.trusted==="undecided")continue;return{result:handlerResult,errors}}catch(error2){errors.push({extensionPath:ext.path,event:event.type,error:error2 instanceof Error?error2.message:String(error2),stack:error2 instanceof Error?error2.stack:void 0})}}return{errors}}function createNoOpSessionSettings(){let settings=SettingsManager.inMemory();return{getRetryFallbackSettings:()=>settings.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{settings.setFallbackChain(key,[...entries]),await settings.flush()},removeFallbackChain:async key=>{settings.removeFallbackChain(key),await settings.flush()},setModelFallbackEnabled:async enabled=>{settings.setModelFallbackEnabled(enabled),await settings.flush()},setFallbackRevertPolicy:async policy=>{settings.setFallbackRevertPolicy(policy),await settings.flush()},reload:()=>settings.reload(),getFallbackStatus:()=>{}}}var noOpUIContext={select:async()=>{},confirm:async()=>!1,input:async()=>{},notify:()=>{},onTerminalInput:()=>()=>{},setStatus:()=>{},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>{},pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>{},addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{},get theme(){return theme},getAllThemes:()=>[],getTheme:()=>{},setTheme:_theme=>({success:!1,error:"UI not available"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},ExtensionRunner=class{constructor(extensions,runtime,cwd,sessionManager,modelRegistry,eventBus=createEventBus()){this.mode="print",this.errorListeners=new Set,this.getModel=()=>{},this.getServiceTier=()=>{},this.getEffectiveServiceTier=()=>this.getServiceTier(),this.getScopedModels=()=>[],this.isIdleFn=()=>!0,this.isProjectTrustedFn=()=>!0,this.getSignalFn=()=>{},this.waitForIdleFn=async()=>{},this.abortFn=()=>{},this.hasPendingMessagesFn=()=>!1,this.isCompactingFn=()=>!1,this.getContextUsageFn=()=>{},this.getCompactionSettingsFn=()=>({enabled:!0,reserveTokens:16384,keepRecentTokens:2e4}),this.getPromptCacheSafeWaitSecondsFn=()=>{},this.getPromptCacheGoalBackstopMaxSecondsFn=()=>270,this.getPromptCacheKeepAliveSettingsFn=()=>({enabled:!1,maxRequestsPerSession:3,maxCostUsdPerSession:.05,marginSeconds:60}),this.getLookAtSettingsFn=()=>({enabled:!0,models:void 0}),this.getAskUserSettingsFn=()=>({enabled:!0,timeoutMinutes:30}),this.getImageSettingsFn=()=>({autoResize:!0,blockImages:!1}),this.sessionSettingsFn=createNoOpSessionSettings(),this.compactFn=()=>{},this.beginCompactionFn=void 0,this.updateCompactionFn=void 0,this.endCompactionFn=void 0,this.getMessageRevisionFn=()=>0,this.applyCompactionFn=async()=>({applied:!1,reason:"rejected"}),this.getSystemPromptFn=()=>"",this.getLoadedHookSourcesFn=()=>({agentDir:"",cwd:this.cwd,globalHookSourcePaths:[],globalHooksPath:"",preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:"",runtimeHookSourcePaths:[]}),this.getSystemPromptOptionsFn=()=>({cwd:this.cwd}),this.getPromptCachePrefixRequestFn=void 0,this.getAgentDirFn=()=>getAgentDir(),this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.shutdownHandler=()=>{},this.shortcutDiagnostics=[],this.commandDiagnostics=[],this.nextToolHookRunIndex=0,this.uiPromptDepth=0,this.extensions=extensions,this.runtime=runtime,this.uiContext=noOpUIContext,this.cwd=cwd,this.sessionManager=sessionManager,this.modelRegistry=modelRegistry,this.eventBus=eventBus}bindCore(actions,contextActions,providerActions){this.runtime.sendMessage=actions.sendMessage,this.runtime.sendUserMessage=actions.sendUserMessage,this.runtime.appendEntry=actions.appendEntry,this.runtime.setSessionName=actions.setSessionName,this.runtime.getSessionName=actions.getSessionName,this.runtime.setLabel=actions.setLabel,this.runtime.executeTool=actions.executeTool,this.runtime.getActiveTools=actions.getActiveTools,this.runtime.getAllTools=actions.getAllTools,this.runtime.setActiveTools=actions.setActiveTools,this.runtime.refreshTools=actions.refreshTools,this.runtime.registerRemovedToolHint=actions.registerRemovedToolHint,this.runtime.registerLazyToolActivator=actions.registerLazyToolActivator,this.runtime.getCommands=actions.getCommands,this.runtime.setModel=actions.setModel,this.runtime.getThinkingLevel=actions.getThinkingLevel,this.runtime.setThinkingLevel=actions.setThinkingLevel,this.runtime.setSessionModel=actions.setSessionModel,this.runtime.setSessionThinkingLevel=actions.setSessionThinkingLevel,this.runtime.setSessionFastMode=actions.setSessionFastMode,this.getModel=contextActions.getModel,this.getServiceTier=contextActions.getServiceTier,this.getEffectiveServiceTier=contextActions.getEffectiveServiceTier??contextActions.getServiceTier,this.getScopedModels=contextActions.getScopedModels,this.isIdleFn=contextActions.isIdle,this.isProjectTrustedFn=contextActions.isProjectTrusted,this.getSignalFn=contextActions.getSignal,this.abortFn=contextActions.abort,this.hasPendingMessagesFn=contextActions.hasPendingMessages,this.isCompactingFn=contextActions.isCompacting,this.checkReloadVetoFn=contextActions.checkReloadVeto,this.shutdownHandler=contextActions.shutdown,this.getContextUsageFn=contextActions.getContextUsage,this.getCompactionSettingsFn=contextActions.getCompactionSettings,contextActions.getPromptCacheSafeWaitSeconds&&(this.getPromptCacheSafeWaitSecondsFn=contextActions.getPromptCacheSafeWaitSeconds),contextActions.getPromptCacheGoalBackstopMaxSeconds&&(this.getPromptCacheGoalBackstopMaxSecondsFn=contextActions.getPromptCacheGoalBackstopMaxSeconds),contextActions.getPromptCacheKeepAliveSettings&&(this.getPromptCacheKeepAliveSettingsFn=contextActions.getPromptCacheKeepAliveSettings),this.getLookAtSettingsFn=contextActions.getLookAtSettings,contextActions.getAskUserSettings&&(this.getAskUserSettingsFn=contextActions.getAskUserSettings),this.getImageSettingsFn=contextActions.getImageSettings,this.sessionSettingsFn=contextActions.sessionSettings,this.compactFn=contextActions.compact,this.beginCompactionFn=contextActions.beginCompaction,this.updateCompactionFn=contextActions.updateCompaction,this.endCompactionFn=contextActions.endCompaction,this.getMessageRevisionFn=contextActions.getMessageRevision,this.applyCompactionFn=contextActions.applyCompaction,this.getSystemPromptFn=contextActions.getSystemPrompt,this.getLoadedHookSourcesFn=contextActions.getLoadedHookSources,contextActions.getAgentDir&&(this.getAgentDirFn=contextActions.getAgentDir),this.getSystemPromptOptionsFn=contextActions.getSystemPromptOptions??(()=>({cwd:this.cwd})),this.getPromptCachePrefixRequestFn=contextActions.getPromptCachePrefixRequest;for(let extension of this.extensions){for(let[name,hint]of extension.removedToolHints??[])actions.registerRemovedToolHint(name,hint);for(let activator of extension.lazyToolActivators??[])actions.registerLazyToolActivator(activator)}for(let registration of drainPendingProviderRegistrations(this.runtime))try{registration.kind==="config"?providerActions?.registerProvider?providerActions.registerProvider(registration.name,registration.config):this.modelRegistry.registerProvider(registration.name,registration.config):providerActions?.registerNativeProvider?providerActions.registerNativeProvider(registration.provider):this.modelRegistry.registerProvider(registration.provider)}catch(err2){this.emitError({extensionPath:registration.extensionPath,event:"register_provider",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.registerProvider=(name,config)=>{if(providerActions?.registerProvider){providerActions.registerProvider(name,config);return}this.modelRegistry.registerProvider(name,config)},this.runtime.registerNativeProvider=provider=>{if(providerActions?.registerNativeProvider){providerActions.registerNativeProvider(provider);return}this.modelRegistry.registerProvider(provider)},this.runtime.unregisterProvider=name=>{if(providerActions?.unregisterProvider){providerActions.unregisterProvider(name);return}this.modelRegistry.unregisterProvider(name)}}bindCommandContext(actions){if(actions){this.waitForIdleFn=actions.waitForIdle,this.newSessionHandler=actions.newSession,this.forkHandler=actions.fork,this.navigateTreeHandler=actions.navigateTree,this.editAssistantMessageHandler=actions.editAssistantMessage,this.editUserMessageHandler=actions.editUserMessage,this.switchSessionHandler=actions.switchSession,this.reloadHandler=actions.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.editAssistantMessageHandler=async()=>({cancelled:!1}),this.editUserMessageHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=void 0}requestReload(){return this.reloadHandler?(this.reloadRequestPromise||(this.reloadRequestPromise=this.reloadHandler().finally(()=>{this.reloadRequestPromise=void 0})),this.reloadRequestPromise):Promise.resolve()}setUIContext(uiContext,mode="print"){this.uiContext=uiContext?this.wrapUIPromptContext(uiContext):noOpUIContext,this.mode=mode}setToolHookLifecycleObserver(observer){this.toolHookLifecycleObserver=observer}wrapUIPromptContext(ui){let questionFn=ui.question;return{...ui,select:(title,options,opts)=>this.withUIPrompt("select",title,()=>ui.select(title,options,opts)),confirm:(title,message,opts)=>this.withUIPrompt("confirm",title,()=>ui.confirm(title,message,opts)),input:(title,placeholder,opts)=>this.withUIPrompt("input",title,()=>ui.input(title,placeholder,opts)),editor:(title,prefill)=>this.withUIPrompt("editor",title,()=>ui.editor(title,prefill)),custom:(factory,options)=>this.withUIPrompt("custom",void 0,()=>ui.custom(factory,options)),...questionFn?{question:(request2,opts)=>this.withUIPrompt("question",request2.questions[0]?.header,()=>questionFn(request2,opts))}:{}}}withUIPrompt(kind,title,run){this.uiPromptDepth++===0&&(this.activeUIPrompt={kind,title},this.emitUIPromptEvent({type:"ui_prompt_start",reason:"ui_prompt",kind,...title?{title}:{}}));let finish=()=>{if(--this.uiPromptDepth>0)return;this.uiPromptDepth=0;let prompt=this.activeUIPrompt??{kind,title};this.activeUIPrompt=void 0,this.emitUIPromptEvent({type:"ui_prompt_end",reason:"ui_prompt",kind:prompt.kind,...prompt.title?{title:prompt.title}:{}})};try{return run().finally(finish)}catch(err2){throw finish(),err2}}emitUIPromptEvent(event){queueMicrotask(()=>{this.emit(event)})}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==noOpUIContext}getExtensionPaths(){return this.extensions.map(e=>e.path)}getExtensionIdentities(){return this.extensions.map(({path:path13,resolvedPath})=>({path:path13,resolvedPath}))}getAllRegisteredTools(){let toolsByName=new Map;for(let ext of this.extensions)for(let tool of ext.tools.values()){let existing=toolsByName.get(tool.definition.name);(!existing||existing.sourceInfo.source==="builtin"&&tool.sourceInfo.source!=="builtin")&&toolsByName.set(tool.definition.name,tool)}return Array.from(toolsByName.values())}getFilesystemPolicyDeniedRoots(){return this.extensions.flatMap(extension=>(extension.filesystemPolicies??[]).flatMap(policy=>policy.deniedRoots??[]))}onRpcEvent(handler){return this.eventBus.on(EXTENSION_RPC_EVENT_CHANNEL,data=>{handler(data)})}onBusEvent(channel,handler){return this.eventBus.on(channel,handler)}getRegisteredMcpServers(){let serversByName=new Map;for(let ext of this.extensions)for(let decl of ext.mcpServers.values()){let existing=serversByName.get(decl.name);existing===void 0?serversByName.set(decl.name,decl):console.warn(`MCP server '${decl.name}' declared by both ${existing.extensionPath} and ${ext.path}; keeping first declaration from ${existing.extensionPath}.`)}return Array.from(serversByName.values())}getToolDefinition(toolName){for(let ext of this.extensions){let tool=ext.tools.get(toolName);if(tool)return tool.definition}}getFlags(){let allFlags=new Map;for(let ext of this.extensions)for(let[name,flag]of ext.flags)allFlags.has(name)||allFlags.set(name,flag);return allFlags}setFlagValue(name,value2){this.runtime.flagValues.set(name,value2)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(resolvedKeybindings){this.shortcutDiagnostics=[];let builtinKeybindings=buildBuiltinKeybindings(resolvedKeybindings),extensionShortcuts=new Map,addDiagnostic=(message,extensionPath)=>{this.shortcutDiagnostics.push({type:"warning",message,path:extensionPath}),this.hasUI()||console.warn(message)};for(let ext of this.extensions)for(let[key,shortcut]of ext.shortcuts){let normalizedKey=key.toLowerCase(),builtInKeybinding=builtinKeybindings[normalizedKey];if(builtInKeybinding?.restrictOverride===!0){addDiagnostic(`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,shortcut.extensionPath);continue}builtInKeybinding?.restrictOverride===!1&&addDiagnostic(`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath);let existingExtensionShortcut=extensionShortcuts.get(normalizedKey);existingExtensionShortcut&&addDiagnostic(`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,shortcut.extensionPath),extensionShortcuts.set(normalizedKey,shortcut)}return extensionShortcuts}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(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()."){this.staleMessage||(this.staleMessage=message,this.runtime.invalidate(message))}get isActive(){return this.staleMessage===void 0}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(listener){return this.errorListeners.add(listener),()=>this.errorListeners.delete(listener)}emitError(error2){for(let listener of this.errorListeners)listener(error2)}hasHandlers(eventType){for(let ext of this.extensions){let handlers=ext.handlers.get(eventType);if(handlers&&handlers.length>0)return!0}return!1}getToolHookStatusMessage(extensionPath,hookName){let builtinName=/^<builtin:([^>]+)>$/.exec(extensionPath)?.[1];if(builtinName==="permission-system")return"matching project rules";if(builtinName==="bash-timeout")return"applying bash timeout";if(builtinName==="compaction")return hookName==="PreToolUse"?"checking compaction state":"checking tool result size";if(builtinName==="tool-pair-guard")return"checking tool/result pairs";let extensionName=builtinName??(extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1):basename22(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run){let base={type:"tool_hook_status",hookRunId:`${run.toolCallId}:${run.hookName}:${this.nextToolHookRunIndex++}`,hookName:run.hookName,toolName:run.toolName,toolCallId:run.toolCallId,extensionPath:run.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run.extensionPath,run.hookName),ended=!1;this.emitToolHookLifecycleEvent({...base,phase:"start",statusMessage});let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(baseContext));return context.updateToolHookStatus=update=>{ended||(statusMessage=sanitizedToolHookStatusMessage(update),this.emitToolHookLifecycleEvent({...base,phase:"update",statusMessage}))},{context,end:(status,errorMessage8)=>{ended||(ended=!0,this.emitToolHookLifecycleEvent({...base,phase:"end",statusMessage,completedAt:Date.now(),status,...errorMessage8!==void 0?{errorMessage:errorMessage8}:{}}))}}}getMessageRenderer(customType){for(let ext of this.extensions){let renderer=ext.messageRenderers.get(customType);if(renderer)return renderer}}getMarkdownTransformers(){return this.extensions.flatMap(ext=>ext.markdownTransformer?[ext.markdownTransformer]:[])}getEntryRenderer(customType){for(let ext of this.extensions){let renderer=ext.entryRenderers?.get(customType);if(renderer)return renderer}}getEntryRendererOptions(customType){return this.extensions.find(ext=>ext.entryRenderers?.has(customType))?.entryRendererOptions?.get(customType)}resolveRegisteredCommands(){let commands=[],counts=new Map;for(let ext of this.extensions)for(let command of ext.commands.values())commands.push(command),counts.set(command.name,(counts.get(command.name)??0)+1);let seen=new Map,takenInvocationNames=new Set;return commands.map(command=>{let occurrence=(seen.get(command.name)??0)+1;seen.set(command.name,occurrence);let invocationName=(counts.get(command.name)??0)>1?`${command.name}:${occurrence}`:command.name;if(takenInvocationNames.has(invocationName)){let suffix=occurrence;do suffix++,invocationName=`${command.name}:${suffix}`;while(takenInvocationNames.has(invocationName))}return takenInvocationNames.add(invocationName),{...command,invocationName}})}getModelRegistry(){return this.modelRegistry}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(name){return this.resolveRegisteredCommands().find(command=>command.invocationName===name)}async requestRpc(name,data){this.assertActive();let normalizedName=name.trim();if(normalizedName.length===0)throw new Error("Extension RPC request name must not be empty");let matches=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches[0]?.(data);return this.assertActive(),result3}shutdown(){this.shutdownHandler()}getActiveTools(){return this.assertActive(),this.runtime.getActiveTools()}createContext(excludeBeforeProviderRequestExtensionPath){let runner=this,getModel=this.getModel,getServiceTier=this.getServiceTier,getEffectiveServiceTier=this.getEffectiveServiceTier,getScopedModels=this.getScopedModels,compactionSignal;return{get ui(){return runner.assertActive(),runner.uiContext},get mode(){return runner.assertActive(),runner.mode},get hasUI(){return runner.assertActive(),runner.hasUI()},get cwd(){return runner.assertActive(),runner.cwd},get agentDir(){return runner.assertActive(),runner.getAgentDirFn()},get loadedExtensionPaths(){return runner.assertActive(),runner.extensions.map(extension=>extension.resolvedPath)},get sessionManager(){return runner.assertActive(),runner.sessionManager},get goalStoreFile(){return runner.assertActive(),goalFilePath(goalStoreRef(runner.sessionManager,runner.cwd))},get modelRegistry(){return runner.assertActive(),runner.modelRegistry},get model(){return runner.assertActive(),getModel()},get serviceTier(){return runner.assertActive(),getServiceTier()},get effectiveServiceTier(){return runner.assertActive(),getEffectiveServiceTier()},get scopedModels(){return runner.assertActive(),getScopedModels()},get thinkingLevel(){return runner.assertActive(),runner.runtime.getThinkingLevel()},isIdle:()=>(runner.assertActive(),runner.isIdleFn()),isProjectTrusted:()=>(runner.assertActive(),runner.isProjectTrustedFn()),get signal(){return runner.assertActive(),runner.getSignalFn()},get kernelTools(){return runner.assertActive(),kernelToolsStorage.getStore()},abort:source=>{runner.assertActive(),runner.abortFn(source)},hasPendingMessages:()=>(runner.assertActive(),runner.hasPendingMessagesFn()),get requestReload(){return runner.assertActive(),runner.reloadHandler?()=>runner.requestReload():void 0},get checkReloadVeto(){runner.assertActive();let probe=runner.checkReloadVetoFn;return probe?()=>probe():void 0},isCompacting:()=>(runner.assertActive(),runner.isCompactingFn()),shutdown:()=>{runner.assertActive(),runner.shutdownHandler()},getContextUsage:()=>(runner.assertActive(),runner.getContextUsageFn()),getCompactionSettings:()=>(runner.assertActive(),runner.getCompactionSettingsFn()),getPromptCacheSafeWaitSeconds:()=>(runner.assertActive(),runner.getPromptCacheSafeWaitSecondsFn()),getPromptCacheGoalBackstopMaxSeconds:()=>(runner.assertActive(),runner.getPromptCacheGoalBackstopMaxSecondsFn()),getPromptCacheKeepAliveSettings:()=>(runner.assertActive(),runner.getPromptCacheKeepAliveSettingsFn()),getLookAtSettings:()=>(runner.assertActive(),runner.getLookAtSettingsFn()),getAskUserSettings:()=>(runner.assertActive(),runner.getAskUserSettingsFn()),getImageSettings:()=>(runner.assertActive(),runner.getImageSettingsFn()),get sessionSettings(){return runner.assertActive(),runner.sessionSettingsFn},compact:options=>{runner.assertActive(),runner.compactFn(options)},prepareProviderRequest:async messages=>(runner.assertActive(),runner.prepareProviderRequest(messages,excludeBeforeProviderRequestExtensionPath)),getPromptCachePrefixRequest:async options=>{runner.assertActive();let build=runner.getPromptCachePrefixRequestFn;return build===void 0?{status:"skipped",reason:"the host builds no prompt-cache prefix"}:await build(options)},beginCompaction:options=>(runner.assertActive(),compactionSignal=runner.beginCompactionFn?.(options),compactionSignal),updateCompaction:options=>{runner.assertActive(),runner.updateCompactionFn?.({...options,signal:options.signal??compactionSignal})},endCompaction:options=>{runner.assertActive(),runner.endCompactionFn?.({...options,signal:options.signal??compactionSignal})},getMessageRevision:()=>(runner.assertActive(),runner.getMessageRevisionFn()),applyCompaction:(precomputed,options)=>(runner.assertActive(),runner.applyCompactionFn(precomputed,{...options,signal:options.signal??compactionSignal})),getSystemPrompt:()=>(runner.assertActive(),runner.getSystemPromptFn()),getSystemPromptOptions:()=>(runner.assertActive(),runner.getSystemPromptOptionsFn()),getLoadedHookSources:()=>(runner.assertActive(),runner.getLoadedHookSourcesFn()),getRegisteredMcpServers:()=>(runner.assertActive(),runner.getRegisteredMcpServers())}}createCommandContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return context.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),context.newSession=options=>(this.assertActive(),this.newSessionHandler(options)),context.fork=(entryId,options)=>(this.assertActive(),this.forkHandler(entryId,options)),context.navigateTree=(targetId,options)=>{if(this.assertActive(),typeof targetId=="string")return this.navigateTreeHandler(targetId,options);let{entryId,...navigationOptions}=targetId;return this.navigateTreeHandler(entryId,navigationOptions)},context.editAssistantMessage=(entryId,text2,options)=>(this.assertActive(),this.editAssistantMessageHandler(entryId,text2,options)),context.editUserMessage=(entryId,text2,options)=>(this.assertActive(),this.editUserMessageHandler(entryId,text2,options)),context.switchSession=(sessionPath,options)=>(this.assertActive(),this.switchSessionHandler(sessionPath,options)),context.reload=()=>(this.assertActive(),this.requestReload()),context}isSessionBeforeEvent(event){return event.type==="session_before_switch"||event.type==="session_before_fork"||event.type==="session_before_reload"||event.type==="session_before_compact"||event.type==="session_before_tree"}resolveSessionShutdownBudget(){try{let settings=SettingsManager.create(this.cwd,this.getAgentDirFn(),{projectTrusted:this.isProjectTrustedFn()});return{warnMs:settings.getSessionShutdownHandlerWarnMs(),timeoutMs:settings.getSessionShutdownHandlerTimeoutMs()}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2);return console.warn(`Using the default session_shutdown handler budget (warn ${DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}ms, hard cap ${DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}ms): ${message}`),{warnMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,timeoutMs:DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}}}async runSessionShutdownHandler(extensionPath,event,handler,budget){let controller=new AbortController,startedAt=Date.now(),outcome,settled=Promise.resolve(handler({...event,signal:controller.signal},this.createContext(extensionPath))).then(()=>{outcome={ok:!0}},error2=>{outcome={ok:!1,error:error2}});if(budget.warnMs>0||budget.timeoutMs>0){let warnTimer,capTimer,timedOut=!1;try{timedOut=await new Promise(resolve42=>{budget.warnMs>0&&(warnTimer=setTimeout(()=>{let capNote=budget.timeoutMs>0?` (hard cap ${budget.timeoutMs}ms)`:"";console.warn(`Extension ${extensionPath} is still running its session_shutdown handler after ${Date.now()-startedAt}ms${capNote}.`)},budget.warnMs)),budget.timeoutMs>0&&(capTimer=setTimeout(()=>resolve42(!0),budget.timeoutMs)),settled.then(()=>resolve42(!1))})}finally{clearTimeout(warnTimer),clearTimeout(capTimer)}if(timedOut){controller.abort(new Error(`session_shutdown handler timed out after ${budget.timeoutMs}ms`)),this.emitError({extensionPath,event:"session_shutdown",error:`handler timed out after ${budget.timeoutMs}ms`});return}}else await settled;if(outcome&&!outcome.ok)throw outcome.error}async emit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let ext of this.extensions){let handlers=ext.handlers.get(event.type);if(!(!handlers||handlers.length===0))for(let handler of handlers)try{if(isSessionShutdown){shutdownBudget??=this.resolveSessionShutdownBudget(),await this.runSessionShutdownHandler(ext.path,event,handler,shutdownBudget);continue}let handlerResult=await handler(event,this.createContext(ext.path));if(this.isSessionBeforeEvent(event)&&handlerResult&&(result3=handlerResult,result3.cancel))return result3}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:event.type,error:message,stack})}}return result3}async emitModelSelect(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("model_select");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let liveEvent={...event,systemPromptOptions:this.getSystemPromptOptionsFn()},handlerResult=await handler(liveEvent,this.createContext(ext.path));if(handlerResult){let nextResult=handlerResult;if(nextResult.systemPrompt!==void 0||nextResult.systemPromptName!==void 0){let combinedResult={};nextResult.systemPrompt!==void 0?combinedResult.systemPrompt=nextResult.systemPrompt:result3?.systemPrompt!==void 0&&(combinedResult.systemPrompt=result3.systemPrompt),nextResult.systemPromptName!==void 0?combinedResult.systemPromptName=nextResult.systemPromptName:result3?.systemPromptName!==void 0&&(combinedResult.systemPromptName=result3.systemPromptName),result3=combinedResult}}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"model_select",error:message,stack})}}return result3}async emitMessageEnd(event){let currentMessage=event.message,modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("message_end");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let currentEvent={...event,message:currentMessage},handlerResult=await handler(currentEvent,this.createContext(ext.path));if(!handlerResult?.message)continue;if(handlerResult.message.role!==currentMessage.role){this.emitError({extensionPath:ext.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}currentMessage=handlerResult.message,modified=!0}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"message_end",error:message,stack})}}return modified?currentMessage:void 0}async emitToolResult(event){let currentEvent={...event},modified=!1;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_result");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PostToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(currentEvent,hookRun.context);if(!handlerResult)continue;handlerResult.content!==void 0&&(currentEvent.content=handlerResult.content,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.isError!==void 0&&(currentEvent.isError=handlerResult.isError,modified=!0),handlerResult.usage!==void 0&&(currentEvent.usage=handlerResult.usage,modified=!0)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;endStatus="failed",errorMessage8=message,this.emitError({extensionPath:ext.path,event:"tool_result",error:message,stack})}finally{hookRun.end(endStatus,errorMessage8)}}}if(modified)return{content:currentEvent.content,details:currentEvent.details,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let ext of this.extensions){let handlers=ext.handlers.get("tool_call");if(!(!handlers||handlers.length===0))for(let handler of handlers){let hookRun=this.beginToolHookRun(this.createContext(),{hookName:"PreToolUse",toolName:event.toolName,toolCallId:event.toolCallId,extensionPath:ext.path}),endStatus="completed",errorMessage8;try{let handlerResult=await handler(event,hookRun.context);if(handlerResult&&(result3=handlerResult,result3.block))return endStatus="blocked",result3}catch(err2){throw endStatus="failed",errorMessage8=err2 instanceof Error?err2.message:String(err2),err2}finally{hookRun.end(endStatus,errorMessage8)}}}return result3}async emitUserBash(event){for(let ext of this.extensions){let handlers=ext.handlers.get("user_bash");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult)return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack})}}}async emitContext(messages,excludeExtensionPath){let currentMessages=cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message});for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("context");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let handlerResult=await handler({type:"context",messages:currentMessages},this.createContext(ext.path));handlerResult&&handlerResult.messages&&(currentMessages=handlerResult.messages)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"context",error:message,stack})}}return currentMessages}async prepareProviderRequest(messages,excludeExtensionPath){return{messages:await this.emitContext(messages,excludeExtensionPath),transformPayload:async payload=>await this.emitBeforeProviderRequest(payload,excludeExtensionPath),transformHeaders:async headers=>await this.emitBeforeProviderHeaders(headers)}}async emitBeforeProviderRequest(payload,excludeExtensionPath,request2){let currentPayload=payload;for(let ext of this.extensions){if(ext.path===excludeExtensionPath)continue;let handlers=ext.handlers.get("before_provider_request");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let event={type:"before_provider_request",payload:currentPayload,...request2?{model:request2.model,headers:request2.headers}:{}},handlerResult=await handler(event,this.createContext(ext.path));handlerResult!==void 0&&(currentPayload=handlerResult)}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_request",error:message,stack})}}return currentPayload}async emitBeforeProviderHeaders(headers){for(let ext of this.extensions){let handlers=ext.handlers.get("before_provider_headers");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{await handler({type:"before_provider_headers",headers},this.createContext(ext.path))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_provider_headers",error:message,stack})}}return headers}getPreviewUnsafeBeforeAgentStartPaths(){let paths=[];for(let ext of this.extensions)(ext.handlers.get("before_agent_start")??[]).some(handler=>ext.previewSafeHandlers?.has(handler)!==!0)&&paths.push(ext.path);return paths}async emitBeforeAgentStart(prompt,images,systemPrompt,systemPromptOptions,options={}){let currentSystemPrompt=systemPrompt,messages=[],systemPromptModified=!1;dispatch:for(let ext of this.extensions){let handlers=ext.handlers.get("before_agent_start");if(!(!handlers||handlers.length===0))for(let handler of handlers){if(options.signal?.aborted===!0)break dispatch;if(!(options.preview===!0&&ext.previewSafeHandlers?.has(handler)!==!0))try{let ctx=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext(ext.path)));ctx.getSystemPrompt=()=>(this.assertActive(),currentSystemPrompt);let event={type:"before_agent_start",prompt,trigger:options.trigger??"prompt",images,systemPrompt:currentSystemPrompt,systemPromptOptions,...options.preview===!0?{preview:!0}:{}},handlerResult=await handler(event,ctx);if(handlerResult){let result3=handlerResult;result3.message&&messages.push(result3.message),result3.systemPrompt!==void 0&&(currentSystemPrompt=result3.systemPrompt,systemPromptModified=!0)}}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"before_agent_start",error:message,stack})}}}if(messages.length>0||systemPromptModified)return{messages:messages.length>0?messages:void 0,systemPrompt:systemPromptModified?currentSystemPrompt:void 0}}async emitResourcesDiscover(cwd,reason){let skillPaths=[],promptPaths=[],themePaths=[],hookPaths=[],toEntry=(entry,extensionPath)=>typeof entry=="string"?{path:entry,extensionPath}:entry.scope===void 0?{path:entry.path,extensionPath}:{path:entry.path,extensionPath,scope:entry.scope};for(let ext of this.extensions){let handlers=ext.handlers.get("resources_discover");if(!(!handlers||handlers.length===0))for(let handler of handlers)try{let result3=await handler({type:"resources_discover",cwd,reason,scopedEntries:!0},this.createContext(ext.path));result3?.skillPaths?.length&&skillPaths.push(...result3.skillPaths.map(entry=>toEntry(entry,ext.path))),result3?.promptPaths?.length&&promptPaths.push(...result3.promptPaths.map(entry=>toEntry(entry,ext.path))),result3?.themePaths?.length&&themePaths.push(...result3.themePaths.map(entry=>toEntry(entry,ext.path))),result3?.hookPaths?.length&&hookPaths.push(...result3.hookPaths.map(entry=>toEntry(entry,ext.path)))}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;this.emitError({extensionPath:ext.path,event:"resources_discover",error:message,stack})}}return{skillPaths,promptPaths,themePaths,hookPaths}}async emitInput(text2,images,source,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let ext of this.extensions)for(let handler of ext.handlers.get("input")??[])try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source,streamingBehavior},this.createContext(ext.path));if(result3?.action==="handled")return result3;result3?.action==="transform"&&(currentText=result3.text,currentImages=result3.images??currentImages)}catch(err2){this.emitError({extensionPath:ext.path,event:"input",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}return currentText!==text2||currentImages!==images?{action:"transform",text:currentText,images:currentImages}:{action:"continue"}}};import{join as join64}from"node:path";async function joinStartupBranches(primary,secondary){let[primaryResult,secondaryResult]=await Promise.allSettled([primary,secondary]);if(primaryResult.status==="rejected")throw primaryResult.reason;if(secondaryResult.status==="rejected")throw secondaryResult.reason;return{primary:primaryResult.value,secondary:secondaryResult.value}}function applyExtensionFlagValues(resourceLoader,extensionFlagValues){if(!extensionFlagValues)return[];let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredFlags=new Map;for(let extension of extensionsResult.extensions)for(let[name,flag]of extension.flags)registeredFlags.has(name)||registeredFlags.set(name,{type:flag.type});let unknownFlags=[];for(let[name,value2]of extensionFlagValues){let flag=registeredFlags.get(name);if(!flag){unknownFlags.push(name);continue}if(flag.type==="boolean"){extensionsResult.runtime.flagValues.set(name,!0);continue}if(typeof value2=="string"){extensionsResult.runtime.flagValues.set(name,value2);continue}diagnostics.push({type:"error",message:`Extension flag "--${name}" requires a value`})}return unknownFlags.length>0&&diagnostics.push({type:"error",message:`Unknown option${unknownFlags.length===1?"":"s"}: ${unknownFlags.map(name=>`--${name}`).join(", ")}`}),diagnostics}async function createAgentSessionServices(options){let cwd=resolvePath(options.cwd),agentDir=options.agentDir?resolvePath(options.agentDir):getAgentDir(),authStorage=AuthStorage.create(join64(agentDir,"auth.json")),runtimePromise=options.modelRuntime!==void 0?Promise.resolve(options.modelRuntime):ModelRuntime.create({credentials:authStorage,authPath:join64(agentDir,"auth.json"),agentDir,modelsPath:join64(agentDir,"models.json"),signal:options.modelRuntimeSignal}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),resourceLoader=new DefaultResourceLoader({...options.resourceLoaderOptions??{},cwd,agentDir,settingsManager,mcpRegistry:options.mcpRegistry}),{primary:modelRuntime}=await joinStartupBranches(runtimePromise,resourceLoader.reload(options.resourceLoaderReloadOptions)),modelRegistry=new ModelRegistry(modelRuntime,authStorage);modelRuntime.setSettingsManager(settingsManager);let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredProviders=new Set;for(let registration of drainPendingProviderRegistrations(extensionsResult.runtime))try{registration.kind==="config"?(modelRuntime.registerProvider(registration.name,registration.config,{refresh:!1}),registeredProviders.add(registration.name)):(modelRuntime.registerNativeProvider(registration.provider,{refresh:!1}),registeredProviders.add(registration.provider.id))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${registration.extensionPath}" error: ${message}`})}return options.modelRuntime===void 0?await modelRuntime.refresh({allowNetwork:!1}):registeredProviders.size>0&&await modelRuntime.refresh({allowNetwork:!1,providers:[...registeredProviders]}),diagnostics.push(...applyExtensionFlagValues(resourceLoader,options.extensionFlagValues)),{cwd,agentDir,authStorage,modelRegistry,modelRuntime,settingsManager,resourceLoader,diagnostics}}async function createAgentSessionFromServices(options){return createAgentSession({cwd:options.services.cwd,agentDir:options.services.agentDir,modelRuntime:options.services.modelRuntime,modelRegistry:options.services.modelRegistry,authStorage:options.services.authStorage,settingsManager:options.services.settingsManager,resourceLoader:options.services.resourceLoader,sessionManager:options.sessionManager,model:options.model,thinkingLevel:options.thinkingLevel,thinkingSelection:options.thinkingSelection,scopedModels:options.scopedModels,favoriteModels:options.favoriteModels,tools:options.tools,excludeTools:options.excludeTools,noTools:options.noTools,customTools:options.customTools,sessionStartEvent:options.sessionStartEvent,autoTitleSessions:options.autoTitleSessions})}var SessionImportFileNotFoundError=class extends Error{constructor(filePath){super(`File not found: ${filePath}`),this.name="SessionImportFileNotFoundError",this.filePath=filePath}};function extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text"&&typeof part.text=="string").map(part=>part.text).join("")}var AgentSessionRuntime=class{constructor(_session,_services,createRuntime,_diagnostics=[],_modelFallbackMessage,launchProfile){this._session=_session,this._services=_services,this.createRuntime=createRuntime,this._diagnostics=_diagnostics,this._modelFallbackMessage=_modelFallbackMessage,this._launchProfile=launchProfile}get services(){return this._services}get session(){return this._session}get cwd(){return this._services.cwd}get diagnostics(){return this._diagnostics}get modelFallbackMessage(){return this._modelFallbackMessage}get launchProfile(){return this._launchProfile}setRebindSession(rebindSession){this.rebindSession=rebindSession}setBeforeSessionInvalidate(beforeSessionInvalidate){this.beforeSessionInvalidate=beforeSessionInvalidate}async emitAttachmentEvent(type2){let runner=this.session.extensionRunner;runner.hasHandlers(type2)&&await runner.emit({type:type2})}async emitBeforeSwitch(reason,targetSessionFile){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_switch")?{cancelled:(await runner.emit({type:"session_before_switch",reason,targetSessionFile}))?.cancel===!0}:{cancelled:!1}}async emitBeforeFork(entryId,options){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_fork")?{cancelled:(await runner.emit({type:"session_before_fork",entryId,...options}))?.cancel===!0}:{cancelled:!1}}async teardownCurrent(reason,targetSessionFile){let mark=label3=>{reason==="resume"&&time(label3,"switch")};await this.session.abort(),mark("abort");let oldRunner=this.session.extensionRunner;typeof oldRunner.getExtensionIdentities=="function"&&(this._removedOnReplacement={oldRunner,oldIdentities:oldRunner.getExtensionIdentities(),reason}),await emitSessionShutdownEvent(oldRunner,{type:"session_shutdown",reason,targetSessionFile}),mark("shutdown"),this.beforeSessionInvalidate?.();let replaced=this.session.sessionManager;this.session.dispose(),unregisterSessionWriter(replaced),mark("dispose")}async reportRemovedExtensions(){let pending=this._removedOnReplacement;if(this._removedOnReplacement=void 0,!pending)return;let newRunner=this.session.extensionRunner;if(typeof newRunner.getExtensionIdentities!="function")return;let newResolvedPaths=new Set(newRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=pending.oldIdentities.filter(extension=>!newResolvedPaths.has(extension.resolvedPath));removed.length!==0&&await pending.oldRunner.emit({type:"session_extensions_removed",reason:pending.reason,removed})}async apply(result3){this._session=result3.session,this._services=result3.services,this._diagnostics=result3.diagnostics,this._modelFallbackMessage=result3.modelFallbackMessage,await this.reportRemovedExtensions()}async finishSessionReplacement(withSession){this.rebindSession&&await this.rebindSession(this.session),withSession&&await withSession(this.session.createReplacedSessionContext())}async switchSession(sessionPath,options){resetTimings("switch");let beforeResult=await this.emitBeforeSwitch("resume",sessionPath);if(beforeResult.cancelled)return beforeResult;time("beforeSwitch","switch");let previousSessionFile=this.session.sessionFile,sessionManager=SessionManager.open(sessionPath,void 0,options?.cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),time("open","switch"),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},projectTrustContext:options?.projectTrustContextFactory?.(sessionManager.getCwd()),launchProfile:this._launchProfile})),time("apply","switch"),await this.finishSessionReplacement(options?.withSession),time("rebind","switch"),{cancelled:!1}}async newSession(options){let beforeResult=await this.emitBeforeSwitch("new");if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile,sessionDir=this.session.sessionManager.getSessionDir(),sessionManager=this.session.sessionManager.isPersisted()?SessionManager.create(this.cwd,sessionDir):SessionManager.inMemory(this.cwd);return options?.parentSession&&sessionManager.newSession({parentSession:options.parentSession}),await this.teardownCurrent("new",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"new",previousSessionFile},launchProfile:this._launchProfile})),options?.setup&&(await options.setup(this.session.sessionManager),this.session.agent.state.messages=this.session.sessionManager.buildSessionContext().messages),await this.finishSessionReplacement(options?.withSession),{cancelled:!1}}async fork(entryId,options){let position=options?.position??"before";if((await this.emitBeforeFork(entryId,{position})).cancelled)return{cancelled:!0};let targetLeafId,selectedText,selectedEntry=this.session.sessionManager.getEntry(entryId);if(!selectedEntry)throw new Error("Invalid entry ID for forking");if(position==="at")targetLeafId=selectedEntry.id;else{if(selectedEntry.type!=="message"||selectedEntry.message.role!=="user")throw new Error("Invalid entry ID for forking");targetLeafId=selectedEntry.parentId,selectedText=extractUserMessageText(selectedEntry.message.content)}let previousSessionFile=this.session.sessionFile;if(this.session.sessionManager.isPersisted()){let currentSessionFile=this.session.sessionFile;if(!currentSessionFile)throw new Error("Persisted session is missing a session file");let sessionDir=this.session.sessionManager.getSessionDir();if(!targetLeafId){let sessionManager3=SessionManager.create(this.cwd,sessionDir);return sessionManager3.newSession({parentSession:currentSessionFile}),await this.teardownCurrent("fork",sessionManager3.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager:sessionManager3,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}if(!existsSync32(currentSessionFile))throw new Error("This session has not been saved yet. Wait for the first assistant response before cloning or forking it.");let sessionManager2=SessionManager.open(currentSessionFile,sessionDir);if(!sessionManager2.createBranchedSession(targetLeafId))throw new Error("Failed to create forked session");return await this.teardownCurrent("fork",sessionManager2.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager2.getCwd(),agentDir:this.services.agentDir,sessionManager:sessionManager2,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}let sessionManager=this.session.sessionManager;return await this.teardownCurrent("fork",sessionManager.getSessionFile()),targetLeafId?sessionManager.createBranchedSession(targetLeafId):sessionManager.newSession({parentSession:previousSessionFile}),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}async importFromJsonl(inputPath,cwdOverride){let resolvedPath=resolvePath(inputPath);if(!existsSync32(resolvedPath))throw new SessionImportFileNotFoundError(resolvedPath);let sessionDir=this.session.sessionManager.getSessionDir();existsSync32(sessionDir)||mkdirSync16(sessionDir,{recursive:!0});let destinationPath=join65(sessionDir,basename23(resolvedPath)),sourceAlreadyStored=resolve34(destinationPath)===resolvedPath;if(!sourceAlreadyStored){let{name,ext}=parse4(destinationPath),suffix=1;for(;existsSync32(destinationPath);)destinationPath=join65(sessionDir,`${name}-${suffix++}${ext}`)}let beforeResult=await this.emitBeforeSwitch("resume",destinationPath);if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile;reserveSessionWrite(destinationPath),sourceAlreadyStored||copyFileSync(resolvedPath,destinationPath,constants9.COPYFILE_EXCL);let sessionManager=SessionManager.open(destinationPath,sessionDir,cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(),{cancelled:!1}}async dispose(){await emitSessionShutdownEvent(this.session.extensionRunner,{type:"session_shutdown",reason:"quit"}),this.beforeSessionInvalidate?.(),this.session.dispose()}};async function createAgentSessionRuntime(createRuntime,options){assertSessionCwdExists(options.sessionManager,options.cwd);let result3=await createRuntime(options);return new AgentSessionRuntime(result3.session,result3.services,createRuntime,result3.diagnostics,result3.modelFallbackMessage,options.launchProfile)}setDefaultStreamFn(streamSimple);function clampThinkingLevelToModel(level,model){if(!model?.reasoning)return"off";let requested=level??"off",available=getSupportedThinkingLevels2(model);if(available.includes(requested))return requested;let ordered=["off","minimal","low","medium","high","xhigh","max"],requestedIndex=ordered.indexOf(requested);for(let index=requestedIndex-1;index>=0;index--){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}for(let index=requestedIndex+1;index<ordered.length;index++){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}return available[0]??"off"}function getDefaultAgentDir(){return getAgentDir()}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join66(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join66(agentDir,"models.json"):void 0,authStorage=options.authStorage??options.modelRegistry?.authStorage??AuthStorage.create(authPath),modelRuntime=options.modelRuntime??options.modelRegistry?.modelRuntime??await ModelRuntime.create({credentials:authStorage,modelsPath,agentDir}),modelRegistry=options.modelRegistry??new ModelRegistry(modelRuntime,authStorage),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir);modelRuntime.setSettingsManager(settingsManager);let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),scopedModels=options.scopedModels??await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:settingsManager.getEnabledModels()}),modelRuntime),favoriteModels2=options.favoriteModels??await resolveModelScope(settingsManager.getFavoriteModels()??[],modelRuntime);resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,initialModelProvenance=options.initialModelProvenance,initialResolvedThinkingLevel,initialThinkingSelection=options.thinkingSelection,modelFallbackMessage;if(model){let resolved=resolveStoredModelReference(model.provider,model.id,modelRuntime);resolved?.thinkingSelection&&(model=resolved.model,initialResolvedThinkingLevel=resolved.thinkingLevel,initialThinkingSelection??=resolved.thinkingSelection)}if(!model&&hasExistingSession&&existingSession.model){let restored=resolveStoredModelReference(existingSession.model.provider,existingSession.model.modelId,modelRuntime);restored&&modelRuntime.hasConfiguredAuth(restored.model.provider)&&(model=restored.model,initialResolvedThinkingLevel=restored.thinkingLevel,initialThinkingSelection=restored.thinkingSelection),model||(modelFallbackMessage=`Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`)}if(!model){let result3=await findInitialModel({scopedModels,isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime});model=result3.model,initialModelProvenance=result3.provenance;let selectedModel=model,scopedSelection=selectedModel?scopedModels.find(entry=>entry.model.provider===selectedModel.provider&&entry.model.id===selectedModel.id):void 0;initialResolvedThinkingLevel=scopedSelection?.thinkingLevel??result3.thinkingLevel,initialThinkingSelection=scopedSelection?.thinkingSelection??result3.thinkingSelection,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage()}let thinkingLevel=options.thinkingLevel??initialResolvedThinkingLevel,thinkingSelection=options.thinkingSelection??(options.thinkingLevel!==void 0?{level:options.thinkingLevel,source:"explicit"}:void 0)??initialThinkingSelection;if(thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel,thinkingSelection=existingSession.thinkingSelection),thinkingLevel===void 0&&model){let remembered=settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(thinkingLevel=remembered,thinkingSelection={level:remembered,source:"explicit"})}if(thinkingLevel===void 0){let configuredDefault=settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0?(thinkingLevel=configuredDefault,thinkingSelection={level:configuredDefault,source:"explicit"}):thinkingLevel=DEFAULT_THINKING_LEVEL}model?thinkingLevel=clampThinkingLevelToModel(thinkingLevel,model):thinkingLevel="off",thinkingSelection&&(thinkingSelection={...thinkingSelection,level:thinkingLevel});let defaultActiveToolNames=["read","bash","edit","write","grep"],configuredDefaultToolNames=settingsManager.getDefaultTools(),sessionDefaultToolNames=options.tools===void 0&&options.noTools===void 0?configuredDefaultToolNames:void 0,allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=(options.tools??(options.noTools?[]:configuredDefaultToolNames??defaultActiveToolNames)).filter(name=>!excludedToolNameSet?.has(name)),agent,reasoningBaseline=existingSession.configurationUpdate?sessionManager.getBranch().find(entry=>entry.type==="thinking_level_change")?.thinkingLevel??thinkingLevel:void 0,convertToLlmWithBlockImages=messages=>convertToLlmForTransport(messages,{blockImages:settingsManager.getBlockImages(),budgetBytes:TRANSPORT_IMAGE_BUDGET_BYTES,alwaysKeepNewest:1,maxHistoricalImages:settingsManager.getMaxHistoricalImages()}),extensionRunnerRef={},sessionRef={},resolveRequestServiceTier=requestModel=>{if(!supportsServiceTier(requestModel.api))return;let session2=sessionRef.current,activeModel=session2?.model;return session2&&activeModel&&modelsAreEqual(activeModel,requestModel)?session2.effectiveServiceTier:modelRuntime.getCompatibilityRequestConfig(requestModel).serviceTier};agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,thinkingSelection,reasoningBaseline,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs(),headerRunner=extensionRunnerRef.current,declaredPolicy=model2.provider?modelRuntime.getProvider(model2.provider)?.retryPolicy:void 0,profileMaxRetries=declaredPolicy===void 0?providerRetrySettings.maxRetries:declaredPolicy.providerRequest.enabled?declaredPolicy.providerRequest.maxRetries:0,serviceTier=options2?.serviceTier??resolveRequestServiceTier(model2);return modelRuntime.streamSimple(model2,context,{...options2,...serviceTier!==void 0?{serviceTier}:{},timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??profileMaxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders=>{let headers=mergeProviderAttributionHeaders(model2,settingsManager,options2?.sessionId,requestHeaders);return headerRunner?.isActive&&headerRunner.hasHandlers("before_provider_headers")?headerRunner.emitBeforeProviderHeaders(headers??{}):headers??{}}})},onPayload:async(payload,_model,request2)=>{let runner=extensionRunnerRef.current;return!runner?.isActive||!runner.hasHandlers("before_provider_request")?payload:runner.emitBeforeProviderRequest(payload,void 0,request2)},onResponse:async(response,_model)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("after_provider_response")||await runner.emit({type:"after_provider_response",status:response.status,headers:response.headers})},sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let runner=extensionRunnerRef.current;return runner?.isActive?runner.emitContext(messages):messages},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),timeoutMs:settingsManager.getAgentStreamIdleTimeoutMs(),streamStartTimeoutMs:settingsManager.getAgentStreamStartTimeoutMs(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs,cursorExecHandlers:runSignal=>createSessionCursorExecBridge(sessionRef,()=>agent,runSignal)}),agent.state.thinkingSelection=thinkingSelection,hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection));let sessionStartEvent=initialModelProvenance?{...options.sessionStartEvent??{type:"session_start",reason:"startup"},initialModelProvenance}:options.sessionStartEvent,session=new AgentSession({agent,sessionManager,settingsManager,cwd,agentDir,scopedModels,favoriteModels:favoriteModels2,resourceLoader,customTools:options.customTools,modelRuntime,modelRegistry,initialActiveToolNames,defaultToolNames:sessionDefaultToolNames,allowedToolNames,excludedToolNames,extensionRunnerRef,sessionStartEvent,autoTitleSessions:options.autoTitleSessions}),liveContextTokens=hasExistingSession?existingSession.messages.reduce((total,message)=>total+estimateTokens2(message),0):0;try{session.assertModelUsable(void 0,liveContextTokens,hasExistingSession?{includeSpeculationLead:!1,admission:"resume"}:{admission:"start"})}catch(error2){if(!hasExistingSession||!(error2 instanceof ModelUsabilityBudgetError)||!session.settingsManager.getCompactionEnabled())throw error2;if(error2.projection.liveContextTokens>error2.projection.contextWindow){let plan=planResumeSlice({entries:session.sessionManager.getBranch(),projection:error2.projection});if(!plan)throw error2;session.applyResumeSlice(plan)}else session.admitResumeCompactionRequired(error2.projection)}sessionRef.current=session;let extensionsResult=resourceLoader.getExtensions();return{session,extensionsResult,modelFallbackMessage}}import{join as join75,resolve as resolve38}from"node:path";import{createInterface as createInterface2}from"node:readline";var AuthCommandError=class extends Error{},AUTH_COMMAND_USAGE={check:`${APP_NAME} auth check --provider <provider> [--json] [--credentials] [--no-refresh]`,api_key:`${APP_NAME} auth print-api-key --provider <provider> [--model <model>]`,bearer_token:`${APP_NAME} auth print-bearer-token --provider <provider> [--model <model>] [--min-expiry <duration>]`};function getAuthCommandName(kind){return kind==="check"?"auth check":kind==="api_key"?"auth print-api-key":"auth print-bearer-token"}function getAuthCommandUsage(kind){return AUTH_COMMAND_USAGE[kind]}function isAuthCommandHelp(args){return args[0]==="auth"&&(args[1]===void 0||args[1]==="help"||args.includes("--help")||args.includes("-h"))}function printAuthCommandHelp(){console.log(`Usage:
|
|
2370
2370
|
pi auth print-api-key [--provider <provider>] [--model <model>]
|
|
2371
2371
|
pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
|
|
2372
2372
|
pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
|
|
2373
2373
|
|
|
2374
|
-
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-
|
|
2374
|
+
Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-FZKBCLWV.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-FZKBCLWV.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-7WEJGW7D.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-BMHJ4YUD.js");return await runHostCommand2(args.slice(1))}import{access as access5,readFile as readFile22,stat as stat11}from"node:fs/promises";import{resolve as resolve35}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve35(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile22(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
|
|
2375
2375
|
`;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(`
|
|
2376
2376
|
`)}</file>
|
|
2377
2377
|
`:text2+=`<file name="${absolutePath}"></file>
|
|
@@ -2422,7 +2422,7 @@ Press any key to continue...`)),await new Promise(resolve42=>{process.stdin.setR
|
|
|
2422
2422
|
`))}}return await session.waitForSettledSessionWork(),exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-2GZAGSGW.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 copyFileSync2,existsSync as existsSync37,mkdirSync as mkdirSync21,renameSync as renameSync16,rmSync as rmSync11}from"node:fs";import{basename as basename24,dirname as dirname42,join as join74,relative as relative18,resolve as resolve37,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path13){return toNamespacedPath(resolve37(path13))}function getQuarantineRoot(packageDir){let current=resolve37(packageDir);for(;;){if(basename24(current).toLowerCase()==="node_modules")return join74(current,QUARANTINE_DIR_NAME);let parent=dirname42(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{rmSync11(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=join74(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync37(loadedFile))continue;let quarantinePath=join74(quarantineRunDir,relative18(resolvedPackageDir,loadedFile));mkdirSync21(dirname42(quarantinePath),{recursive:!0}),renameSync16(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve42=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve42(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path13,error:error2})=>({type:"warning",message:`Failed to load extension "${path13}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
|
|
2423
2423
|
`));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}
|
|
2424
2424
|
`),!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}
|
|
2425
|
-
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-BP7THCWF.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle)});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-EBRNBPBM.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-JV3MNWXZ.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join75(agentDir,"auth.json")),authPath:join75(agentDir,"auth.json"),agentDir,modelsPath:join75(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 selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-YI75GFD5.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),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");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-Q2OUJURB.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-ABDNLJSI.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let 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(`
|
|
2425
|
+
`),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve42=>{let rl=createInterface2({input:process.stdin,output:process.stdout});rl.question(`${message} [y/N] `,answer=>{rl.close(),resolve42(answer.toLowerCase()==="y"||answer.toLowerCase()==="yes")}),rl.on("close",()=>resolve42(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path13,sessionDir){try{return SessionManager.open(path13,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return appMode!=="interactive"&&(console.error(source_default.red(`Session found in different project: ${resolved.cwd}`)),console.error(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${parsed.session}' to fork it into the current directory, or re-run interactively from ${resolved.cwd}.`)),process.exit(1)),console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-BP7THCWF.js"),selectedPath=await selectSession(onProgress=>SessionManager.list(cwd,sessionDir,onProgress),onProgress=>SessionManager.listAll(sessionDir,onProgress),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme2=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme2(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);return async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sharedHostEnabled:shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtimeSettingsManager.getExperimentalSharedHost()}),sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors)],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle)});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}}}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args)||await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags),writeHelpFlagsCache({scope,flags,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-EBRNBPBM.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-5IWJEFDF.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join75(agentDir,"auth.json")),authPath:join75(agentDir,"auth.json"),agentDir,modelsPath:join75(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 selectedRuntime=runtime;if(isTruthyEnvFlag2(envValue("DISABLE_SHARED_HOST"))&&console.error(source_default.yellow("DISABLE_SHARED_HOST is obsolete: the shared session host is now off by default. Enable the experimental.sharedHost setting (or set the brand-prefixed ENABLE_SHARED_HOST=1 env flag) to opt in.")),shouldJoinSharedHost(appMode,{enableEnv:isTruthyEnvFlag2(envValue("ENABLE_SHARED_HOST")),settingEnabled:runtime.services.settingsManager.getExperimentalSharedHost()})){let socket=envValue("RPC_SOCKET")??resolve38(agentDir,"rpc","rpc.sock"),{createInteractiveHostRuntime}=await import("./interactive-host-runtime-6WY6424X.js");selectedRuntime=await createInteractiveHostRuntime(runtime,{socket,agentDir,onWarning:warning=>console.error(source_default.yellow(warning.message))})}let{services,session,modelFallbackMessage}=selectedRuntime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),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");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-JSCHAE6O.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-6AHR5TEM.js"),interactiveMode=new InteractiveMode2(selectedRuntime,{migratedProviders,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve42=>setTimeout(resolve42,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve42=>process.stdout.once("drain",resolve42)),process.stderr.writableLength>0&&await new Promise(resolve42=>process.stderr.once("drain",resolve42)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let 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(`
|
|
2426
2426
|
|
|
2427
2427
|
`),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
|
|
2428
2428
|
|
|
@@ -2467,15 +2467,15 @@ ${formatToolProgressLine(progress,Date.now(),state.spinnerFrame)}`),this.content
|
|
|
2467
2467
|
`)+`${theme.fg("muted",`
|
|
2468
2468
|
... (${remaining} more lines,`)} ${keyHint("app.tools.expand","to expand")}${theme.fg("muted",")")}`;return{...result3,content:[{type:"text",text:text2}]}}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.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.lastDisplaySignature=void 0,this.updateSpinnerAnimation(),this.updateTodoStrikeAnimation(),this.updateDisplay(),this.images?.updateResult(result3),this.invalidateRenderCache()}stopAnimation(){this.stopSpinnerAnimation(),this.stopTodoStrikeAnimation()}dispose(){this.stopAnimation(),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()}render(width){if(this.presentation==="grok")return super.render(width);let signature=this.createRenderSignature();if(this.cachedLines&&this.cachedWidth===width&&this.cachedSignature===signature)return[...this.cachedLines];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.cachedWidth=width,this.cachedSignature=signature,this.cachedLines=[...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.spinnerFrame,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(){let isStreamingArgs=!this.argsComplete&&["edit","write","apply_patch"].includes(this.identity.toolName),isPartialTask=this.isPartial&&this.identity.toolName==="task"&&this.result!==void 0,isPartialProgress=this.isPartial&&this.result!==void 0&&readToolProgress(this.result.details)!==void 0;isStreamingArgs||isPartialTask||isPartialProgress?this.startSpinnerAnimation():this.stopSpinnerAnimation()}updateTodoStrikeAnimation(){if(!(this.identity.toolName==="todo"&&this.executionStarted&&!this.isPartial&&this.result!==void 0&&!this.result.isError&&hasCompletedTodoTasks(this.result.details))){this.stopTodoStrikeAnimation();return}this.todoStrikeInterval||(this.spinnerFrame=0,this.todoStrikeInterval=setInterval(()=>{let next=(this.spinnerFrame??0)+1;if(next>14){this.stopTodoStrikeAnimation();return}this.spinnerFrame=next,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender()},65),this.todoStrikeInterval.unref?.())}stopTodoStrikeAnimation(){this.todoStrikeInterval&&(clearInterval(this.todoStrikeInterval),this.todoStrikeInterval=void 0),!this.spinnerInterval&&this.spinnerFrame!==void 0&&(this.spinnerFrame=void 0,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender())}startSpinnerAnimation(){this.spinnerInterval||(this.spinnerInterval=setInterval(()=>{this.spinnerFrame=((this.spinnerFrame??-1)+1)%10,this.invalidateRenderCache(),this.updateDisplay(),this.ui.requestRender()},PENDING_RENDER_FRAME_INTERVAL_MS),this.spinnerInterval.unref?.())}stopSpinnerAnimation(){this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=void 0,this.todoStrikeInterval||(this.spinnerFrame=void 0),this.invalidateRenderCache())}invalidateRenderCache(){this.cachedLines=void 0,this.cachedSignature=void 0,this.cachedWidth=void 0}};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,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==="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"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"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 path13=shortenPath2(String(args.path||args.file_path||"")),offset=args.offset,limit=args.limit,display=path13;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||""),path13=shortenPath2(String(args.path||"."));return`[grep: /${pattern}/ in ${path13}]`}case"find":{let pattern=String(args.pattern||""),path13=shortenPath2(String(args.path||"."));return`[find: ${pattern} in ${path13}]`}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===`
|
|
2469
2469
|
`){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(`
|
|
2470
|
-
`)){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 Box(this.outputPad,1,content=>theme.bg("userMessageBg",content));contentBox.addChild(new Markdown(this.text,0,0,this.markdownTheme,{color:content=>theme.fg("userMessageText",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}));let answer=parseAskUserAnswerFrame(this.text);this.addChild(answer?new AskUserAnswerChip(answer,this.answerHeaders,contentBox):contentBox)}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 spawn10}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve42=>{let proc=spawn10(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),resolve42({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve42({stdout,stderr,code:1,killed})})})}import{statSync as statSync18}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync18(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(create){return generation?generation.importer:(pendingImporter??=create().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(path13,preserveJsx){return typeof path13=="string"&&/^\.\.?\//.test(path13)?path13.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"}):path13};function sessionProfile(options){return{sharedHostEnabled:options?.sharedHostEnabled??!1,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=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path9.extname(fileURLToPath5(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path9.dirname(fileURLToPath5(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path9.resolve(__dirname,"../../.."),packagesRoot=path9.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path9.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs3.existsSync(bundledPath))return bundledPath;let workspacePath=path9.join(packagesRoot,workspaceRelativePath);if(fs3.existsSync(workspacePath))return workspacePath;let sourcePath=path9.join(packagesRoot,sourceRelativePath);return fs3.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath5(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path9.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path9.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,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,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,flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],assertActive:()=>{if(state.staleMessage)throw new Error(state.staleMessage)},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(),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)}};return runtime}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};return{api:{cwd,sharedHostEnabled:session.sharedHostEnabled,sessionKind:session.sessionKind,sessionContext:session.sessionContext,on(event,handler,options){assertActive();let list3=extension.handlers.get(event)??[];list3.push(handler),extension.handlers.set(event,list3),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(handler))},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)},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){assertActive(),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)},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()},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))},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}},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}}},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-H4IJCWWQ.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 source=extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1).split(":")[0]||"temporary":"local",baseDir=extensionPath.startsWith("<")?void 0:path9.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source,baseDir,scope:source==="builtin"?"system":"temporary"}),handlers:new Map,tools:new Map,removedToolHints:new Map,lazyToolActivators:[],filesystemPolicies:[],messageRenderers: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=[],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,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=path9.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=path9.resolve(dir,extPath);fs3.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path9.join(dir,"index.ts"),indexJs=path9.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=path9.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=path9.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path9.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path9.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,invocation?.context??runner.createContext())}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 SENSITIVE_MODEL_ID_PATTERN=/(?:gpt-5(?:\.\d+)?-sol|gpt-6-sol|gpt-6-astra)(?![a-z])/i,ASTRA_MODEL_ID_PATTERN=/gpt-6-astra(?![a-z])/i;function isSensitiveHighReasoningModel(model){return SENSITIVE_MODEL_ID_PATTERN.test(model.id)}function shouldWarnHighReasoning(model,thinkingLevel){return(ASTRA_MODEL_ID_PATTERN.test(model.id)?thinkingLevel==="max":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 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 context=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,options:prepared.options}}}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(resolve42=>{onAbort=()=>resolve42(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)}}var BILLING_ERROR_PATTERN=new RegExp(["credit[- ]balance","insufficient[_ -]quota","\\bbilling\\b","purchase credits","credits[-_ ]required","credits are required","usage_limit_reached","usage_not_included","usage limit has been reached"].join("|"),"i");function isBillingErrorMessage(errorMessage8){return errorMessage8!==void 0&&BILLING_ERROR_PATTERN.test(errorMessage8)}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.deps=deps}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;if(!state||state.pinned||revertPolicy!=="cooldown-expiry"||this.deps.cooldowns.isSuppressed(state.originalSelector))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),current=this.deps.getCurrentSelector();if(!model||!current)return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.deps.switchModel(model,thinking,"fallback-revert");let from=formatSelector(current.model);return this.state=void 0,this.deps.logger.info("fallback_reverted",{from,to:state.originalSelector}),this.deps.emit({type:"retry_fallback_reverted",from,to:state.originalSelector}),!0}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))}async tryFallback(reason,failure2){let current=this.deps.getCurrentSelector(),candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage}));let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);await this.deps.switchModel(candidate.model,thinking,"fallback"),this.triedSelectors.add(baseSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state,pinnedByRefusal=prior?.pinnedByRefusal===!0||reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||reason==="billing";return this.state={chainKey:candidate.chainKey,originalSelector:prior?.originalSelector??from,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling},this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason}),!0}nextCandidate(reserve=!0,logDecision=reserve){let settings=this.deps.getSettings(),current=this.deps.getCurrentSelector();if(!settings.modelFallback||!current)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey,entries=chainKey?chains[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,this.deps.registry);if(!selector){this.skip(raw,"unknown");continue}if(selector.provider===current.model.provider&&selector.id===current.model.id){this.skip(raw,"self");continue}let base=baseSelector(selector);if(this.triedSelectors.has(base)){this.skip(raw,"tried");continue}if(this.deps.cooldowns.isSuppressed(base)){this.skip(raw,"suppressed");continue}if(!this.deps.isAuthAvailable(selector.provider)){this.skip(raw,"unauthenticated");continue}let model=this.deps.registry.find(selector.provider,selector.id);if(!model){this.skip(raw,"unknown");continue}return reserve&&this.triedSelectors.add(base),{chainKey,selector,model}}this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}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=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:/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 chmodSync11,closeSync as closeSync6,mkdirSync as mkdirSync22,openSync as openSync6,renameSync as renameSync17,rmSync as rmSync13,statSync as statSync20,writeSync as writeSync5}from"node:fs";import{dirname as dirname44,join as join78}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=join78(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes4(options.maxBytes),reportedWriteFailure=!1;function log(level,event,data){try{let line=formatLine3(level,event,data);writeLine4(filePath,line,maxBytes)}catch(error2){reportedWriteFailure||(reportedWriteFailure=!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){mkdirSync22(dirname44(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2471
|
-
`;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync13(`${filePath}.1`,{force:!0}),renameSync17(filePath,`${filePath}.1`),chmodSync11(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync5(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync11(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync20(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())}}};var WakeSourceTracker=class{constructor(){this.counts=new Map}observe(data){if(typeof data!="object"||data===null)return;let{source,activeCount}=data;typeof source!="string"||source.length===0||typeof activeCount!="number"||!Number.isFinite(activeCount)||(activeCount>0?this.counts.set(source,activeCount):this.counts.delete(source))}get hasActive(){return this.counts.size>0}get activeSources(){return[...this.counts.keys()]}};function isSessionBusySnapshot(snapshot){return snapshot.isStreaming||snapshot.isBashRunning||snapshot.isCompacting||snapshot.hasSessionWork||snapshot.hasActiveWakeSource}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
|
|
2470
|
+
`)){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 Box(this.outputPad,1,content=>theme.bg("userMessageBg",content));contentBox.addChild(new Markdown(this.text,0,0,this.markdownTheme,{color:content=>theme.fg("userMessageText",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}));let answer=parseAskUserAnswerFrame(this.text);this.addChild(answer?new AskUserAnswerChip(answer,this.answerHeaders,contentBox):contentBox)}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 spawn10}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve42=>{let proc=spawn10(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),resolve42({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve42({stdout,stderr,code:1,killed})})})}import{statSync as statSync18}from"node:fs";var generation,pendingImporter,generationsCreated=0;function fingerprintOf(file){try{let stats=statSync18(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(create){return generation?generation.importer:(pendingImporter??=create().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(path13,preserveJsx){return typeof path13=="string"&&/^\.\.?\//.test(path13)?path13.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"}):path13};function sessionProfile(options){return{sharedHostEnabled:options?.sharedHostEnabled??!1,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=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path9.extname(fileURLToPath5(import.meta.url))===".ts",usesNativeBunImports=isBunBinary||isBunRuntime,_aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname=path9.dirname(fileURLToPath5(import.meta.url)),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),codingAgentPackageRoot=path9.resolve(__dirname,"../../.."),packagesRoot=path9.dirname(codingAgentPackageRoot),resolveWorkspaceOrBundled=(packageName,packageEntryRelativePath,workspaceRelativePath,sourceRelativePath,specifier)=>{let bundledPath=path9.join(codingAgentPackageRoot,"node_modules",packageName,packageEntryRelativePath);if(fs3.existsSync(bundledPath))return bundledPath;let workspacePath=path9.join(packagesRoot,workspaceRelativePath);if(fs3.existsSync(workspacePath))return workspacePath;let sourcePath=path9.join(packagesRoot,sourceRelativePath);return fs3.existsSync(sourcePath)?sourcePath:typeof import.meta.resolve=="function"?fileURLToPath5(import.meta.resolve(specifier)):require3.resolve(specifier)},piCodingAgentDistEntry=path9.join(codingAgentPackageRoot,"dist/index.js"),piCodingAgentSourceEntry=path9.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,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,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,flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],assertActive:()=>{if(state.staleMessage)throw new Error(state.staleMessage)},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(),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)}};return runtime}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};return{api:{cwd,sharedHostEnabled:session.sharedHostEnabled,sessionKind:session.sessionKind,sessionContext:session.sessionContext,on(event,handler,options){assertActive();let list3=extension.handlers.get(event)??[];list3.push(handler),extension.handlers.set(event,list3),event==="before_agent_start"&&options?.previewSafe===!0&&(extension.previewSafeHandlers??=new WeakSet,extension.previewSafeHandlers.add(handler))},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)},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){assertActive(),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)},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()},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))},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}},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}}},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-R4HXF3GD.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 source=extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1).split(":")[0]||"temporary":"local",baseDir=extensionPath.startsWith("<")?void 0:path9.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source,baseDir,scope:source==="builtin"?"system":"temporary"}),handlers:new Map,tools:new Map,removedToolHints:new Map,lazyToolActivators:[],filesystemPolicies:[],messageRenderers: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=[],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,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=path9.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=path9.resolve(dir,extPath);fs3.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path9.join(dir,"index.ts"),indexJs=path9.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=path9.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=path9.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path9.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path9.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,invocation?.context??runner.createContext())}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 SENSITIVE_MODEL_ID_PATTERN=/(?:gpt-5(?:\.\d+)?-sol|gpt-6-sol|gpt-6-astra)(?![a-z])/i,ASTRA_MODEL_ID_PATTERN=/gpt-6-astra(?![a-z])/i;function isSensitiveHighReasoningModel(model){return SENSITIVE_MODEL_ID_PATTERN.test(model.id)}function shouldWarnHighReasoning(model,thinkingLevel){return(ASTRA_MODEL_ID_PATTERN.test(model.id)?thinkingLevel==="max":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 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 context=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,options:prepared.options}}}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(resolve42=>{onAbort=()=>resolve42(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)}}var BILLING_ERROR_PATTERN=new RegExp(["credit[- ]balance","insufficient[_ -]quota","\\bbilling\\b","purchase credits","credits[-_ ]required","credits are required","usage_limit_reached","usage_not_included","usage limit has been reached"].join("|"),"i");function isBillingErrorMessage(errorMessage8){return errorMessage8!==void 0&&BILLING_ERROR_PATTERN.test(errorMessage8)}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.deps=deps}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;if(!state||state.pinned||revertPolicy!=="cooldown-expiry"||this.deps.cooldowns.isSuppressed(state.originalSelector))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),current=this.deps.getCurrentSelector();if(!model||!current)return!1;let thinking=current.thinkingLevel===state.lastAppliedThinkingLevel?state.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.deps.switchModel(model,thinking,"fallback-revert");let from=formatSelector(current.model);return this.state=void 0,this.deps.logger.info("fallback_reverted",{from,to:state.originalSelector}),this.deps.emit({type:"retry_fallback_reverted",from,to:state.originalSelector}),!0}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))}async tryFallback(reason,failure2){let current=this.deps.getCurrentSelector(),candidate=this.nextCandidate(!1,!0);if(!current||!candidate)return!1;let currentBase=formatSelector(current.model);(reason==="transient"||reason==="hard-error"||reason==="billing")&&(this.deps.cooldowns.note(currentBase,failure2),this.deps.logger.info("cooldown_noted",{selector:currentBase,errorMessage:failure2.errorMessage}));let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);await this.deps.switchModel(candidate.model,thinking,"fallback"),this.triedSelectors.add(baseSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state,pinnedByRefusal=prior?.pinnedByRefusal===!0||reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||reason==="billing";return this.state={chainKey:candidate.chainKey,originalSelector:prior?.originalSelector??from,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling},this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason}),!0}nextCandidate(reserve=!0,logDecision=reserve){let settings=this.deps.getSettings(),current=this.deps.getCurrentSelector();if(!settings.modelFallback||!current)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey,entries=chainKey?chains[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,this.deps.registry);if(!selector){this.skip(raw,"unknown");continue}if(selector.provider===current.model.provider&&selector.id===current.model.id){this.skip(raw,"self");continue}let base=baseSelector(selector);if(this.triedSelectors.has(base)){this.skip(raw,"tried");continue}if(this.deps.cooldowns.isSuppressed(base)){this.skip(raw,"suppressed");continue}if(!this.deps.isAuthAvailable(selector.provider)){this.skip(raw,"unauthenticated");continue}let model=this.deps.registry.find(selector.provider,selector.id);if(!model){this.skip(raw,"unknown");continue}return reserve&&this.triedSelectors.add(base),{chainKey,selector,model}}this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}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=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:/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 chmodSync11,closeSync as closeSync6,mkdirSync as mkdirSync22,openSync as openSync6,renameSync as renameSync17,rmSync as rmSync13,statSync as statSync20,writeSync as writeSync5}from"node:fs";import{dirname as dirname44,join as join78}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=join78(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes4(options.maxBytes),reportedWriteFailure=!1;function log(level,event,data){try{let line=formatLine3(level,event,data);writeLine4(filePath,line,maxBytes)}catch(error2){reportedWriteFailure||(reportedWriteFailure=!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){mkdirSync22(dirname44(filePath),{recursive:!0,mode:448});let text2=`${line}
|
|
2471
|
+
`;fileExceedsCap3(filePath,Buffer.byteLength(text2),maxBytes)&&(rmSync13(`${filePath}.1`,{force:!0}),renameSync17(filePath,`${filePath}.1`),chmodSync11(`${filePath}.1`,384));let descriptor=openSync6(filePath,"a",384);try{writeSync5(descriptor,text2)}finally{closeSync6(descriptor)}chmodSync11(filePath,384)}function fileExceedsCap3(filePath,incomingBytes,maxBytes){try{return statSync20(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())}}};var WakeSourceTracker=class{constructor(){this.counts=new Map}observe(data){if(typeof data!="object"||data===null)return;let{source,activeCount}=data;typeof source!="string"||source.length===0||typeof activeCount!="number"||!Number.isFinite(activeCount)||(activeCount>0?this.counts.set(source,activeCount):this.counts.delete(source))}get hasActive(){return this.counts.size>0}get activeSources(){return[...this.counts.keys()]}};function isSessionBusySnapshot(snapshot){return snapshot.isStreaming||snapshot.isBashRunning||snapshot.isCompacting||snapshot.hasSessionWork||snapshot.hasActiveWakeSource}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.
|
|
2472
2472
|
|
|
2473
2473
|
Rules:
|
|
2474
2474
|
- Use 3 to 6 words.
|
|
2475
2475
|
- Prefer concrete nouns and verbs from the user's task.
|
|
2476
2476
|
- Do not include quotes, punctuation at the end, markdown, or explanations.
|
|
2477
2477
|
- If the input is only a greeting, acknowledgement, or too vague to title, return <title>none</title>.
|
|
2478
|
-
- 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"]),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
|
|
2478
|
+
- 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,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(resolve42=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve42()},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(resolve42=>{resolveWork=resolve42}),!resolveWork)throw new Error("Session work resolver was not initialized");this.activeWorkResolve=resolveWork}this.activeWorkDepth++;let finished=!1;return()=>{if(finished||(finished=!0,this.activeWorkDepth=Math.max(0,this.activeWorkDepth-1),this.activeWorkDepth>0))return;let resolveWork=this.activeWorkResolve;this.activeWork=void 0,this.activeWorkResolve=void 0,resolveWork?.()}}async waitForSettled(getEventQueue){for(let round=0;;round++){let eventQueue=getEventQueue(),work=this.activeWork;if(await eventQueue,work&&await work,getEventQueue()===eventQueue&&!this.activeWork)return;round>=16&&await yieldToEventLoop()}}};function formatSkillInvocationPrompt(skills,userRequest){let expandedSkills=skills.map(skill=>`The user explicitly invoked the "${skill.name}" skill. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions.
|
|
2479
2479
|
|
|
2480
2480
|
<skill-instruction name="${skill.name}" location="${skill.filePath}">
|
|
2481
2481
|
References are relative to ${skill.baseDir}.
|
|
@@ -2493,7 +2493,7 @@ The user explicitly invoked the `);){let chained=matchSkillInstruction(remainder
|
|
|
2493
2493
|
`||text2[cursor]==="\r"&&text2[cursor+1]===`
|
|
2494
2494
|
`;){cursor+=text2[cursor]==="\r"?2:1;let lineStart=cursor;for(;text2[cursor]===" "||text2[cursor]===" ";)cursor++;if(text2[cursor]!==`
|
|
2495
2495
|
`&&!(text2[cursor]==="\r"&&text2[cursor+1]===`
|
|
2496
|
-
`))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve42){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve42(requested)}}function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage3){totals.input+=usage3.input,totals.output+=usage3.output,totals.cacheRead+=usage3.cacheRead,totals.cacheWrite+=usage3.cacheWrite,totals.cost+=usage3.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage3;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage3=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage3=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage?(key="Tools/summaries",usage3=entry.usage):(usage3=getPromptCachePrewarmUsage(entry),usage3&&(key="Tools/summaries")),!key||!usage3)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage3)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b)=>b.cost-a.cost)}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:",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._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._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._overflowRecoveryAttempted=!1,this._compactionSkippedTooSmall=!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._baseToolDefinitions=new Map,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._toolRegistry=new Map,this._lazyToolActivators=[],this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)&&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,this._agentEventQueue.catch(()=>{})},this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source=>{this._emit({type:"settings_source_selected",...source})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._selectorCooldowns=new SelectorCooldowns(config.fallbackNow??(()=>Date.now())),this._fallbackNow=config.fallbackNow??(()=>Date.now()),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,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._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,scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model){let result3;try{result3=await this._modelRuntime.getAuth(model)}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(model){if(this.agent.streamFunction===streamSimple)return this._getRequiredRequestAuth(model);try{let storedResult=await this._modelRuntime.getAuth(model),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey}):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}:{model}}catch{return{model}}}_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}}_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()})}_bindToolSearchRemovedHints(){let service3;try{service3=getToolSearchService()}catch{return}service3.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,input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,input:args,content:result3.content,details:result3.details,isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize()});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_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(),messages=compactedBeforeCallback?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()}}}_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})}}_estimateCompactionLogTokens(source){try{let messages=source==="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(resolve42=>{this._resolveIdleWait=resolve42})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve42=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve42()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1;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)})}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.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim){deferredTurnClaim?.resolve("started"),this._isAgentRunActive=!0,this._requiredCompactionAdmissionError=void 0,this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue;let requiredCompactionError=this._requiredCompactionAdmissionError;if(this._requiredCompactionAdmissionError=void 0,requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError}catch(error2){if(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];for(let message of queuedMessages)this.agent.steer(message);let userMessage2=queuedMessages.find(message=>message.role==="user");if(userMessage2?.role==="user"){let text2=this._extractUserMessageText(userMessage2.content);this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer"),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(resolve42=>{this._retryResolve=resolve42}),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._overflowRecoveryAttempted}_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){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),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer"),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp"),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_end"&&(event.message.role==="custom"?(this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision()):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(this._emitEntryAppended(this.sessionManager.appendMessage(event.message)),this._incrementMessageRevision()),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&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),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;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(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"&&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: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?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}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=>{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});return result3.stopReason!=="error"&&result3.stopReason!=="aborted"}catch{return!1}},onCleared:sel=>{this._selectorCooldowns.clear(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})}})}_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"){let extensionEvent={type:"turn_end",turnIndex:this._turnIndex,message:event.message,toolResults:event.toolResults};await this._extensionRunner.emit(extensionEvent),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 source of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source});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.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._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._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 isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}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)}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,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(){try{return getToolSearchService().getCatalog().map(doc=>doc.name)}catch{return[]}}_activateLazyTool(toolName){let definition=this._toolDefinitions.get(toolName)?.definition;if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this._lazyToolActivators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.getActiveToolNames().includes(toolName)&&this.setActiveToolsByName([...this.getActiveToolNames(),toolName]),this.getActiveToolNames().includes(toolName)):!1}_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&&(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);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())}_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)}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,customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
|
|
2496
|
+
`))return text2.slice(lineStart)}return text2.slice(cursor)}function removeSkillInvocationTokens(text2,tokens){let cursor=0,result3="";for(let token of tokens)result3+=text2.slice(cursor,token.start),token.position==="inline"&&(result3+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result3.endsWith(" ")||result3.endsWith(" "))&&(text2[cursor]===" "||text2[cursor]===" ")&&cursor++;return result3+=text2.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result3):result3}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve42){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve42(requested)}}function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage3){totals.input+=usage3.input,totals.output+=usage3.output,totals.cacheRead+=usage3.cacheRead,totals.cacheWrite+=usage3.cacheWrite,totals.cost+=usage3.cost.total}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let entry of entries){let key,usage3;if(entry.type==="message"&&entry.message.role==="assistant"?(key=`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage3=entry.message.usage):entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage?(key="Tools/summaries",usage3=entry.message.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage?(key="Tools/summaries",usage3=entry.usage):(usage3=getPromptCachePrewarmUsage(entry),usage3&&(key="Tools/summaries")),!key||!usage3)continue;let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage3)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b)=>b.cost-a.cost)}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:",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._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._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._overflowRecoveryAttempted=!1,this._compactionSkippedTooSmall=!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._baseToolDefinitions=new Map,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._toolRegistry=new Map,this._lazyToolActivators=[],this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)&&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,this._agentEventQueue.catch(()=>{})},this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source=>{this._emit({type:"settings_source_selected",...source})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._selectorCooldowns=new SelectorCooldowns(config.fallbackNow??(()=>Date.now())),this._fallbackNow=config.fallbackNow??(()=>Date.now()),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,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._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,scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model){let result3;try{result3=await this._modelRuntime.getAuth(model)}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(model){if(this.agent.streamFunction===streamSimple)return this._getRequiredRequestAuth(model);try{let storedResult=await this._modelRuntime.getAuth(model),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey}):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}:{model}}catch{return{model}}}_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}}_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()})}_bindToolSearchRemovedHints(){let service3;try{service3=getToolSearchService()}catch{return}service3.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,input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,input:args,content:result3.content,details:result3.details,isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize()});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_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(),messages=compactedBeforeCallback?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()}}}_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})}}_estimateCompactionLogTokens(source){try{let messages=source==="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(resolve42=>{this._resolveIdleWait=resolve42})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve42=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve42()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1;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)})}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.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim){deferredTurnClaim?.resolve("started"),this._isAgentRunActive=!0,this._requiredCompactionAdmissionError=void 0,this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue;let requiredCompactionError=this._requiredCompactionAdmissionError;if(this._requiredCompactionAdmissionError=void 0,requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError}catch(error2){if(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];for(let message of queuedMessages)this.agent.steer(message);let userMessage2=queuedMessages.find(message=>message.role==="user");if(userMessage2?.role==="user"){let text2=this._extractUserMessageText(userMessage2.content);this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer"),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(resolve42=>{this._retryResolve=resolve42}),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._overflowRecoveryAttempted}_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){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),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryAttempted=!1,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let steeringIndex=this._steeringMessages.indexOf(messageText);if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer"),this._emitQueueUpdate();else{let followUpIndex=this._followUpMessages.indexOf(messageText);followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp"),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_end"&&(event.message.role==="custom"?(this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision()):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(this._emitEntryAppended(this.sessionManager.appendMessage(event.message)),this._incrementMessageRevision()),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&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryAttempted=!1),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;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(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: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?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}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=>{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});return result3.stopReason!=="error"&&result3.stopReason!=="aborted"}catch{return!1}},onCleared:sel=>{this._selectorCooldowns.clear(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})}})}_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"){let extensionEvent={type:"turn_end",turnIndex:this._turnIndex,message:event.message,toolResults:event.toolResults};await this._extensionRunner.emit(extensionEvent),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 source of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source});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.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._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._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 isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}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)}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,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(){try{return getToolSearchService().getCatalog().map(doc=>doc.name)}catch{return[]}}_activateLazyTool(toolName){let definition=this._toolDefinitions.get(toolName)?.definition;if(!definition)return!1;let exposure=normalizeToolExposure(definition);return exposure.allowLazyActivation?this._lazyToolActivators.some(activate=>activate(toolName))?!0:(exposure.exposure==="search"&&!this.getActiveToolNames().includes(toolName)&&this.setActiveToolsByName([...this.getActiveToolNames(),toolName]),this.getActiveToolNames().includes(toolName)):!1}_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&&(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);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())}_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)}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,customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
|
|
2497
2497
|
|
|
2498
2498
|
`):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
|
|
2499
2499
|
|
|
@@ -2503,8 +2503,8 @@ ${loaderAppendSystemPrompt.join(`
|
|
|
2503
2503
|
|
|
2504
2504
|
${sentences.join(`
|
|
2505
2505
|
|
|
2506
|
-
`)}`:prompt}async _runInputHandlers(text2,images,source,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"}),promptDisposition?.("handled"),preflightResult?.(!0);return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(this._flushPendingBashMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let 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()}),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),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(skillBlocks.length>=MAX_SKILL_EXPANSIONS_PER_PROMPT){this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`});break}if(removedTokens.push(token),expandedSkillNames.has(skill.name)){this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}try{let content=readFileSync38(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return;let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options?.enqueueOrder):await this._queueFollowUp(expandedText,processedInput.images,options?.enqueueOrder),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}})}async steer(text2,images,options){await this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){await this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;let message=error2 instanceof Error?error2.message:String(error2);this._extensionRunner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_title_generation",error:message})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,enqueueOrder){this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"steer",count:this._steeringMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredSteeringMessages.push(message);return}this.agent.steer(message)}async _queueFollowUp(text2,images,enqueueOrder){this._followUpMessages.push(text2),this._recordQueuedInput(text2,"followUp",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"followUp",count:this._followUpMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredFollowUpMessages.push(message);return}this.agent.followUp(message)}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:"extension"});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(resolve42=>{resolveBindingPromptReadiness=resolve42});bindingPromptReadiness.add(readiness)}let text2,images;try{if(typeof content=="string")text2=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text2=textParts.join(`
|
|
2507
|
-
`),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,enqueueOrder){let order=enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order})}_removeQueuedInput(text2,mode){let index=this._queuedInputOrder.findIndex(message=>message.mode===mode&&message.text===text2);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy)}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual3(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&&isDeepStrictEqual3(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,this.thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=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",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._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)}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}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==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}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable)throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;if(!settings.enabled||!model||!shouldCompact2(contextTokens,model.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this.model;if(!model)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=this.model?.contextWindow??0,sameModel=this.model&&isSameOverflowSource(assistantMessage,this.model,this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId),compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),recoverableLength=sameModel&&isRecoverableLength(assistantMessage,this.model?.maxTokens??0),isOverflow=isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(this._overflowRecoveryAttempted){let errorMessage8="Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryAttempted=!0;let messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry):await this._runAutoCompaction("overflow",willRetry);if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings)){if(inlineReason)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(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._overflowRecoveryAttempted=!1),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry){if(this._isCompactionDelegated())return!1;let model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID13();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryAttempted=!1),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1);try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model)}catch{return this._ownsCompactionController(autoCompactionController,"auto")?endBeforeExecution():!1}if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(!prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(this._getCompactionSettings(model),model?.provider,reason),reason==="overflow"))return endBeforeExecution();if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(this._emit({type:"compaction_start",reason,requestId}),!(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart})).accepted)return reason==="overflow"&&(this._overflowRecoveryAttempted=!1),!1;if(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry){let messages=this.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision()),this._scheduleContinuationAfterCurrentEvent(),!0}else{if(this.pendingMessageCount>0)return this._scheduleContinuationAfterCurrentEvent(),!0;if(this.agent.hasQueuedMessages())return this._scheduleContinuationAfterCurrentEvent(),!0}return!1}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),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(resolve42=>{settle=resolve42}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivators.push(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled)},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source="user")=>{if(source==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=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)},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||/[\\/]senpi-codemode[\\/]/u.test(path13)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${name}>`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${definition.name}>`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>{let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return exposure==="direct"||exposure==="eval"},nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_buildRuntime(options){this._delegatedCompactionKey=void 0;let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload"),await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}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(){if(!this._extensionRunner.hasHandlers("session_before_reload"))return{cancelled:!1};let result3=await this._extensionRunner.emit({type:"session_before_reload"});return result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,this.model?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==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(){try{return getToolSearchService().takeNativeInjectionFailure()}catch{return null}}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return 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(),finishTurn2=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishTurn2(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishTurn2(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
2506
|
+
`)}`:prompt}async _runInputHandlers(text2,images,source,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"}),promptDisposition?.("handled"),preflightResult?.(!0);return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages):await this._queueSteer(expandedText,currentImages),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(this._flushPendingBashMessages(),!this.model)throw new Error(formatNoModelSelectedMessage());if(!(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0))throw this._modelRuntime.isUsingOAuth(this.model.provider)?new Error(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(this.model.provider));await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let 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()}),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),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(skillBlocks.length>=MAX_SKILL_EXPANSIONS_PER_PROMPT){this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`});break}if(removedTokens.push(token),expandedSkillNames.has(skill.name)){this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}try{let content=readFileSync38(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return;let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options?.enqueueOrder):await this._queueFollowUp(expandedText,processedInput.images,options?.enqueueOrder),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}})}async steer(text2,images,options){await this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){await this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;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,enqueueOrder){this._steeringMessages.push(text2),this._recordQueuedInput(text2,"steer",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"steer",count:this._steeringMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredSteeringMessages.push(message);return}this.agent.steer(message)}async _queueFollowUp(text2,images,enqueueOrder){this._followUpMessages.push(text2),this._recordQueuedInput(text2,"followUp",enqueueOrder),this._sessionLogger.debug("queue_enqueue",{mode:"followUp",count:this._followUpMessages.length}),this._emitQueueUpdate();let content=[{type:"text",text:text2}];images&&content.push(...images);let message={role:"user",content,timestamp:Date.now()};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){this._postCompactionDeferredFollowUpMessages.push(message);return}this.agent.followUp(message)}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:"extension"});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(resolve42=>{resolveBindingPromptReadiness=resolve42});bindingPromptReadiness.add(readiness)}let text2,images;try{if(typeof content=="string")text2=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text2=textParts.join(`
|
|
2507
|
+
`),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,enqueueOrder){let order=enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order})}_removeQueuedInput(text2,mode){let index=this._queuedInputOrder.findIndex(message=>message.mode===mode&&message.text===text2);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy)}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual3(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&&isDeepStrictEqual3(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,this.thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=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",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._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)}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}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==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}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable)throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;if(!settings.enabled||!model||!shouldCompact2(contextTokens,model.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this.model;if(!model)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let contextWindow=this.model?.contextWindow??0,sameModel=this.model&&isSameOverflowSource(assistantMessage,this.model,this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId),compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),recoverableLength=sameModel&&isRecoverableLength(assistantMessage,this.model?.maxTokens??0),isOverflow=isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(this._overflowRecoveryAttempted){let errorMessage8="Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryAttempted=!0;let messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry):await this._runAutoCompaction("overflow",willRetry);if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings)){if(inlineReason)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(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._overflowRecoveryAttempted=!1),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry){if(this._isCompactionDelegated())return!1;let model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID13();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryAttempted=!1),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1);try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model)}catch{return this._ownsCompactionController(autoCompactionController,"auto")?endBeforeExecution():!1}if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(!prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(this._getCompactionSettings(model),model?.provider,reason),reason==="overflow"))return endBeforeExecution();if(!this._ownsCompactionController(autoCompactionController,"auto"))return!1;if(this._emit({type:"compaction_start",reason,requestId}),!(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart})).accepted)return reason==="overflow"&&(this._overflowRecoveryAttempted=!1),!1;if(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry){let messages=this.agent.state.messages,lastMsg=messages[messages.length-1];return lastMsg?.role==="assistant"&&(lastMsg.stopReason==="error"||lastMsg.stopReason==="length")&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision()),this._scheduleContinuationAfterCurrentEvent(),!0}else{if(this.pendingMessageCount>0)return this._scheduleContinuationAfterCurrentEvent(),!0;if(this.agent.hasQueuedMessages())return this._scheduleContinuationAfterCurrentEvent(),!0}return!1}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryAttempted=!1);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),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(resolve42=>{settle=resolve42}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivators.push(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled)},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source="user")=>{if(source==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=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)},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path13){return path13.startsWith("<builtin:")||/[\\/]senpi-codemode[\\/]/u.test(path13)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${name}>`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<builtin:${definition.name}>`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>{let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return exposure==="direct"||exposure==="eval"},nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_buildRuntime(options){this._delegatedCompactionKey=void 0;let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload"),await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}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(){if(!this._extensionRunner.hasHandlers("session_before_reload"))return{cancelled:!1};let result3=await this._extensionRunner.emit({type:"session_before_reload"});return result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,this.model?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==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(){try{return getToolSearchService().takeNativeInjectionFailure()}catch{return null}}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return 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(),finishTurn2=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishTurn2(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishTurn2(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve42=>{this._retryResolve=resolve42}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
2508
2508
|
${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??createLocalBashOperations({shellPath}),{onChunk:delta=>{let callbackResult=onChunk?.(delta);return this._emit({type:"bash_execution_update",id:options?.id,delta}),callbackResult},signal:abortController.signal});return this.recordBashResult(command,result3,options),result3}finally{this._bashAbortControllers.delete(abortController)}}recordBashResult(command,result3,options){let bashMessage={role:"bashExecution",command,output:result3.output,exitCode:result3.exitCode,cancelled:result3.cancelled,truncated:result3.truncated,fullOutputPath:result3.fullOutputPath,timestamp:Date.now(),excludeFromContext:options?.excludeFromContext};this.isStreaming?this._pendingBashMessages.push(bashMessage):(this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision())}abortBash(){for(let abortController of[...this._bashAbortControllers])abortController.abort()}async cleanupBashOutput(path13){await rm10(path13,{force:!0})}get isBashRunning(){return this._bashAbortControllers.size>0}get hasPendingBashMessages(){return this._pendingBashMessages.length>0}_flushPendingBashMessages(){if(this._pendingBashMessages.length!==0){for(let bashMessage of this._pendingBashMessages)this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision();this._pendingBashMessages=[]}}setSessionName(name){this.sessionManager.appendSessionInfo(name);let event={type:"session_info_changed",name:this.sessionManager.getSessionName()};this._emit(event),this._extensionRunner.emit(event)}async navigateTree(targetId,options={}){return this._navigateTree(targetId,options)}async editAssistantMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,text2);return assistantTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async editUserMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,text2);return userTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async _navigateTree(targetId,options,replacement){if(this.isStreaming)throw new SessionStreamingError;if(this.isCompacting)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=this.sessionManager.getLeafId();if(assertExpectedLeaf(options.expectedLeafId,oldLeafId),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label3=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label3};this._branchSummaryAbortController=new AbortController;try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label3=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model),branchSummarySettings=this.settingsManager.getBranchSummarySettings(),result3=await generateBranchSummary2(entriesToSummarize,{model:requestModel,apiKey,headers,extraBody,env,signal:this._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,streamFn:this.agent.streamFunction,retry:this.settingsManager.getRetrySettings(),callbacks:this._summarizationRetryCallbacks({source:"branchSummary"})});if(result3.aborted)return{cancelled:!0,aborted:!0};if(result3.error)throw new Error(result3.error);summaryText=result3.summary,summaryUsage=result3.usage,summaryDetails={readFiles:result3.readFiles||[],modifiedFiles:result3.modifiedFiles||[]}}else extensionSummary&&(summaryText=extensionSummary.summary,summaryDetails=extensionSummary.details,summaryUsage=extensionSummary.usage);let resume=options.intent==="resume"&&!replacement,newLeafId,editorText;replacement?newLeafId=targetEntry.parentId:resume?newLeafId=targetId:targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=this.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,fromExtension,summaryUsage);summaryEntry=this.sessionManager.getEntry(summaryId),label3&&this.sessionManager.appendLabelChange(summaryId,label3)}else newLeafId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(newLeafId);let editedEntryId=replacement?this.sessionManager.appendMessage(replacement):void 0;return label3&&!summaryText&&this.sessionManager.appendLabelChange(editedEntryId??targetId,label3),resume&&(summaryText||label3)&&this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision(),await this._extensionRunner.emit({type:"session_tree",newLeafId:this.sessionManager.getLeafId(),oldLeafId,summaryEntry,fromExtension:summaryText?fromExtension:void 0}),resume&&this.sessionManager.getLeafId()!==targetId&&(this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),{editorText,cancelled:!1,summaryEntry,entryId:editedEntryId}}finally{this._branchSummaryAbortController=void 0}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text2=contentText(entry.message.content,"");text2&&result3.push({entryId:entry.id,text:text2})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){(entry.type==="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()}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project=this.settingsManager.getProjectSettings().promptCache,merged=global||project?{...global,...project}:void 0;return resolvePromptCacheSafeWaitSeconds(this.model,merged,process.env)}syncPromptCacheSafeWaitEnv(){let budget=this.resolvePromptCacheSafeWaitSeconds();budget===void 0?delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV]:process.env[PROMPT_CACHE_SAFE_WAIT_ENV]=String(budget)}getContextUsage(){let model=this.model;if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let messages=this.messages,branchEntries=this.sessionManager.getBranch(),latestCompaction2=getLatestCompactionEntry(branchEntries);if(latestCompaction2){let compactionIndex=branchEntries.lastIndexOf(latestCompaction2),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens2(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=estimateContextTokens3(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){let themeName=[options.themeName,this.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>this.getToolDefinition(name),theme,cwd:this.sessionManager.getCwd()});return await exportSessionToHtml(this.sessionManager,this.state,{outputPath,themeName,toolRenderer})}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname45(filePath);existsSync39(dir)||mkdirSync23(dir,{recursive:!0});let header2={type:"session",version:CURRENT_SESSION_VERSION,id:this.sessionManager.getSessionId(),timestamp:new Date().toISOString(),cwd:this.sessionManager.getCwd()},branchEntries=this.sessionManager.getBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync20(filePath,`${lines.join(`
|
|
2509
2509
|
`)}
|
|
2510
2510
|
`),filePath}getLastAssistantText(){let lastAssistant=this.messages.slice().reverse().find(m=>{if(m.role!=="assistant")return!1;let msg=m;return!(msg.stopReason==="aborted"&&msg.content.length===0)});if(!lastAssistant)return;let text2="";for(let content of lastAssistant.content)content.type==="text"&&(text2+=content.text);return text2.trim()||void 0}createReplacedSessionContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()));return context.sendMessage=(message,options)=>this.sendCustomMessage(message,options),context.sendUserMessage=(content,options)=>this.sendUserMessage(content,options),context}hasExtensionHandlers(eventType){return this._extensionRunner.hasHandlers(eventType)}get extensionRunner(){return this._extensionRunner}};function detectMiss(prev,message,models){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!prev||promptTokens<=0||usage3.cacheRead+usage3.cacheWrite===0&&!prev.reportedCache)return;let missedTokens=Math.min(prev.promptTokens,promptTokens)-usage3.cacheRead;if(missedTokens<=1024)return;let paidTokens=usage3.input+usage3.cacheWrite,paidPerToken=paidTokens>0?(usage3.cost.input+usage3.cost.cacheWrite)/paidTokens:0,readPerToken=usage3.cacheRead>0?usage3.cost.cacheRead/usage3.cacheRead:(models.getModel(message.provider,message.model)?.cost.cacheRead??0)/1e6;return{missedTokens,missedCost:missedTokens*Math.max(0,paidPerToken-readPerToken),idleMs:Math.max(0,message.timestamp-prev.timestamp),modelChanged:`${message.provider}/${message.model}`!==prev.modelKey}}function asPreviousRequest(message,reportedCache){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!(promptTokens<=0))return{promptTokens,modelKey:`${message.provider}/${message.model}`,timestamp:message.timestamp,reportedCache:reportedCache||usage3.cacheRead+usage3.cacheWrite>0}}function scan(entries,models){let prev,totals={missedTokens:0,missedCost:0,missCount:0},misses=new Map;for(let entry of entries){if(entry.type==="compaction"||entry.type==="branch_summary"){prev=void 0;continue}if(entry.type==="message"&&entry.message.role==="assistant"){let miss=detectMiss(prev,entry.message,models);miss&&(totals.missedTokens+=miss.missedTokens,totals.missedCost+=miss.missedCost,totals.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}function createAllToolRenderers(){return{read:readRenderers,bash:createShellRenderers("$"),powershell:createShellRenderers("PS>"),edit:editRenderers,write:writeRenderers,grep:grepRenderers,find:findRenderers,ls:lsRenderers}}function withBuiltInRenderers(toolName,definition){let builtIn=createAllToolRenderers()[toolName];return definition?builtIn?{...definition,renderCall:definition.renderCall??builtIn.renderCall,renderResult:definition.renderResult??builtIn.renderResult}:definition:builtIn}var import_semver=__toESM(require_semver(),1);import path10 from"node:path";import{existsSync as existsSync40,readFileSync as readFileSync39}from"fs";var GITHUB_REPO="earendil-works/pi",CHANGELOG_LINK_BASE_PATH="packages/coding-agent",LEGACY_REPO_RE=/^https:\/\/github\.com\/(?:badlogic|earendil-works)\/pi-mono(?=\/|$)/,URL_SCHEME_RE=/^[a-z][a-z0-9+.-]*:/i,INLINE_MARKDOWN_LINK_RE=/(!?\[[^\]\n]+\]\()([^\s)]+)((?:\s+[^)]*)?\))/g;function entryVersion(entry){return entry.version??`${entry.major}.${entry.minor}.${entry.patch}${entry.suffix?`-${entry.suffix}`:""}`}var VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/,CALVER_RE=/^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:-([2-9]\d*))?$/;function isValidDate(value2){let match=/^(\d{4})-(\d{2})-(\d{2})$/.exec(value2);if(!match)return!1;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]),date=new Date(Date.UTC(year,month-1,day));return date.getUTCFullYear()===year&&date.getUTCMonth()===month-1&&date.getUTCDate()===day}function isForeignVersion(version){return version.startsWith("0.0.0-omob.")||/^\d+\.\d+\.\d+-0\.beta\./.test(version)}function compareVersionStrings(left,right){let leftCalver=CALVER_RE.exec(left),rightCalver=CALVER_RE.exec(right);if(leftCalver&&rightCalver){let leftParts=[Number(leftCalver[1]),Number(leftCalver[2]),Number(leftCalver[3]),Number(leftCalver[4]??1)],rightParts=[Number(rightCalver[1]),Number(rightCalver[2]),Number(rightCalver[3]),Number(rightCalver[4]??1)];for(let index=0;index<leftParts.length;index+=1)if(leftParts[index]!==rightParts[index])return leftParts[index]<rightParts[index]?-1:1;return 0}let leftValid=(0,import_semver.valid)(left),rightValid=(0,import_semver.valid)(right);if(!(!leftValid||!rightValid||isForeignVersion(left)!==isForeignVersion(right)))return Math.sign((0,import_semver.compare)(leftValid,rightValid))}function normalizeTag(version){let versionString=typeof version=="string"?version:entryVersion(version);return versionString.startsWith("v")?versionString:`v${versionString}`}function splitLocalTarget(target){let hashIndex=target.indexOf("#"),beforeHash=hashIndex===-1?target:target.slice(0,hashIndex),fragment=hashIndex===-1?"":target.slice(hashIndex),queryIndex=beforeHash.indexOf("?");return queryIndex===-1?{fragment,pathPart:beforeHash,query:""}:{fragment,pathPart:beforeHash.slice(0,queryIndex),query:beforeHash.slice(queryIndex)}}function normalizePathPart(value2){return value2.replaceAll("\\","/")}function resolveRepositoryPath(targetPath){let normalizedTarget=normalizePathPart(targetPath),joined=normalizedTarget.startsWith("/")?path10.posix.normalize(normalizedTarget.replace(/^\/+/,"")):path10.posix.normalize(path10.posix.join(CHANGELOG_LINK_BASE_PATH,normalizedTarget));if(!(joined==="."||joined.startsWith("../")||joined===".."))return joined}function isDirectoryTarget(originalPath,repositoryPath){return originalPath.endsWith("/")?!0:!path10.posix.basename(repositoryPath).includes(".")}function normalizeChangelogLinkTarget(target,tag){let canonicalTarget=target.replace(LEGACY_REPO_RE,`https://github.com/${GITHUB_REPO}`),repoUrl=`https://github.com/${GITHUB_REPO}`;for(let route2 of["blob","tree"])for(let branch of["main","master"]){let floatingRefPrefix=`${repoUrl}/${route2}/${branch}/`;canonicalTarget.startsWith(floatingRefPrefix)&&(canonicalTarget=`${repoUrl}/${route2}/${tag}/${canonicalTarget.slice(floatingRefPrefix.length)}`)}if(canonicalTarget.startsWith("#")||canonicalTarget.startsWith("//")||URL_SCHEME_RE.test(canonicalTarget))return canonicalTarget;let{fragment,pathPart,query}=splitLocalTarget(canonicalTarget);if(!pathPart)return canonicalTarget;let repositoryPath=resolveRepositoryPath(pathPart);if(!repositoryPath)return canonicalTarget;let route=isDirectoryTarget(pathPart,repositoryPath)?"tree":"blob";return`https://github.com/${GITHUB_REPO}/${route}/${tag}/${encodeURI(repositoryPath)}${query}${fragment}`}function normalizeChangelogLinks(markdown,version){let tag=normalizeTag(version);return markdown.replace(INLINE_MARKDOWN_LINK_RE,(_match,prefix,target,suffix)=>`${prefix}${normalizeChangelogLinkTarget(target,tag)}${suffix}`)}function parseChangelog(changelogPath){if(!existsSync40(changelogPath))return[];try{let lines=readFileSync39(changelogPath,"utf-8").split(`
|
|
@@ -2527,7 +2527,8 @@ ${codeSpan(styledWarning)}
|
|
|
2527
2527
|
`;fs5.mkdirSync(path11.dirname(debugLogPath),{recursive:!0}),fs5.appendFileSync(debugLogPath,`${prefix}${redactedText}${suffix}`,{mode:384}),fs5.chmodSync(debugLogPath,384)}function replaceConsoleMethod(level,method){Object.defineProperty(console,level,{configurable:!0,value:method,writable:!0})}function takeOverInteractiveConsole(){if(interactiveConsoleState)return;interactiveConsoleState={error:console.error,info:console.info,warn:console.warn};let writeHiddenConsoleDiagnostic=(...data)=>{process.stderr.write(`${format(...data)}
|
|
2528
2528
|
`)};for(let level of consoleLevels)replaceConsoleMethod(level,writeHiddenConsoleDiagnostic)}function restoreInteractiveConsole(){if(interactiveConsoleState){for(let level of consoleLevels)replaceConsoleMethod(level,interactiveConsoleState[level]);interactiveConsoleState=void 0}}function takeOverInteractiveStderr(){takeOverStderr(appendHiddenInteractiveStderr,redactSensitiveOutput),takeOverInteractiveConsole()}function restoreInteractiveStderr(){restoreInteractiveConsole(),restoreStderr()}import{closeSync as closeSync7,openSync as openSync7,readFileSync as readFileSync42,writeSync as writeSync6}from"node:fs";function seedKeybindingsFile(configPath,keybindings){let fd;try{fd=openSync7(configPath,"wx")}catch(error2){if(error2.code==="EEXIST")return!1;throw error2}try{writeSync6(fd,`${JSON.stringify(keybindings.getEffectiveConfig(),null,2)}
|
|
2529
2529
|
`)}finally{closeSync7(fd)}return!0}function applyKeybindingsFileEdit(configPath,keybindings){let raw;try{raw=readFileSync42(configPath,"utf-8")}catch(error2){return{status:"invalid",message:error2 instanceof Error?error2.message:String(error2)}}try{JSON.parse(raw)}catch(error2){return{status:"invalid",message:error2 instanceof Error?error2.message:String(error2)}}return keybindings.reload(),{status:"reloaded"}}var GROUP_ORDER=["project","user","path","system"];function isSystemResource(sourceInfo){return sourceInfo?.scope==="system"}function isPackageSourceInfo(sourceInfo){let source=sourceInfo?.source??"";return source.startsWith("npm:")||source.startsWith("git:")}function getResourceScopeGroup(sourceInfo){let source=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";if(scope==="system")return"system";if(source==="cli")return"path";switch(scope){case"temporary":return"path";case"user":return"user";case"project":return"project";default:return assertNever5(scope)}}function buildResourceScopeGroups(items){let groups=new Map(GROUP_ORDER.map(scope=>[scope,{scope,paths:[],packages:new Map}]));for(let item of items){let group=groups.get(getResourceScopeGroup(item.sourceInfo));if(group!==void 0)if(isPackageSourceInfo(item.sourceInfo)){let source=item.sourceInfo?.source??"local",list3=group.packages.get(source)??[];list3.push(item),group.packages.set(source,list3)}else group.paths.push(item)}return GROUP_ORDER.map(scope=>groups.get(scope)).filter(group=>group!==void 0&&(group.paths.length>0||group.packages.size>0))}function formatResourceScopeGroups(groups,options){let lines=[];for(let group of groups){lines.push(` ${theme.fg("accent",group.scope)}`);let sortedPaths=[...group.paths].sort((a,b)=>a.path.localeCompare(b.path));for(let item of sortedPaths)lines.push(theme.fg("dim",` ${options.formatPath(item)}`));let sortedPackages=Array.from(group.packages.entries()).sort(([a],[b])=>a.localeCompare(b));for(let[source,items]of sortedPackages){lines.push(` ${theme.fg("mdLink",source)}`);let sortedPackagePaths=[...items].sort((a,b)=>a.path.localeCompare(b.path));for(let item of sortedPackagePaths)lines.push(theme.fg("dim",` ${options.formatPackagePath(item,source)}`))}}return lines.join(`
|
|
2530
|
-
`)}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 source=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source,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 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.chat=chat}record(raw,expanded=!1){this.pending=!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.notice?.setSummary(void 0)}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!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)}}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))}function countGraphemesFrom(text2,start){let count=0,tailStart=start;for(let segment2 of getGraphemeSegmenter().segment(start===0?text2:text2.slice(start)))count+=1,tailStart=start+segment2.index;return{count,tailStart}}function segmentFrom(text2,start,clusters){let count=0,end=start,lastStart=start;for(let segment2 of getGraphemeSegmenter().segment(start===0?text2:text2.slice(start)))if(count+=1,lastStart=start+segment2.index,end=lastStart+segment2.segment.length,count>=clusters)break;return{count,end,lastStart}}var BlockUnitCounter=class{#entries=new Map;#sliceEntries=new Map;count(index,text2){let entry=this.#entries.get(index);if(entry!==void 0){if(entry.text===text2)return entry.count;if(entry.count>0&&text2.length>entry.text.length&&text2.startsWith(entry.text)){let tail=countGraphemesFrom(text2,entry.tailStart),next={text:text2,count:entry.count-1+tail.count,tailStart:tail.tailStart};return this.#entries.set(index,next),next.count}}let full=countGraphemesFrom(text2,0);return this.#entries.set(index,{text:text2,count:full.count,tailStart:full.tailStart}),full.count}slice(index,text2,units){let wholeUnits=Math.floor(units);if(wholeUnits<=0||text2.length===0)return"";let entry=this.#sliceEntries.get(index);if(entry?.text===text2&&entry.units===wholeUnits)return entry.end>=text2.length?text2:text2.slice(0,entry.end);if(entry!==void 0&&(entry.text===text2||text2.startsWith(entry.text))&&wholeUnits>=entry.units){let segment3=segmentFrom(text2,entry.lastStart,wholeUnits-entry.units+1);return this.#sliceEntries.set(index,{text:text2,units:entry.units-1+segment3.count,end:segment3.end,lastStart:segment3.lastStart}),segment3.end>=text2.length?text2:text2.slice(0,segment3.end)}let segment2=segmentFrom(text2,0,wholeUnits);return this.#sliceEntries.set(index,{text:text2,units:segment2.count,end:segment2.end,lastStart:segment2.lastStart}),segment2.end>=text2.length?text2:text2.slice(0,segment2.end)}reset(){this.#entries.clear(),this.#sliceEntries.clear()}};function countGraphemes(text2){return countGraphemesFrom(text2,0).count}function sliceGraphemes(text2,units){if(units<=0||text2.length===0)return"";let segment2=segmentFrom(text2,0,units);return segment2.end>=text2.length?text2:text2.slice(0,segment2.end)}function countVisibleUnits(message,hideThinking,countOf){let total=0;for(let index=0;index<message.content.length;index++){let block=message.content[index];block?.type==="text"?total+=countOf(index,block.text):block?.type==="thinking"&&!hideThinking&&(total+=countOf(index,block.thinking))}return total}function buildDisplayMessage(target,revealed,hideThinking,countOf=(_index,text2)=>countGraphemes(text2),sliceOf=(_index,text2,units)=>sliceGraphemes(text2,units)){let remaining=Math.max(0,Math.floor(revealed)),content=[];for(let index=0;index<target.content.length;index++){let block=target.content[index];if(block)if(block.type==="text"){let units=countOf(index,block.text);content.push(remaining<=0?block.text.length===0?block:{...block,text:""}:remaining>=units?block:{...block,text:sliceOf(index,block.text,remaining)}),remaining=Math.max(0,remaining-units)}else if(block.type==="thinking"&&!hideThinking){let units=countOf(index,block.thinking);content.push(remaining<=0?block.thinking.length===0?block:{...block,thinking:""}:remaining>=units?block:{...block,thinking:sliceOf(index,block.thinking,remaining)}),remaining=Math.max(0,remaining-units)}else content.push(block)}return{...target,content}}function updateArrivalRate(currentRate,appendedUnits,elapsedMs){if(appendedUnits<=0||elapsedMs<=0)return currentRate;let sampleRate=appendedUnits*1e3/elapsedMs,maximumSample=Math.max(45,currentRate*4),boundedSample=Math.min(maximumSample,Math.max(45,sampleRate));return currentRate+.25*(boundedSample-currentRate)}function nextStep(backlog,dtMs,arrivalRate=90){if(backlog<=0)return 0;let dt=Math.min(Math.max(dtMs,1),100),baseArrivalRate=Math.max(45,arrivalRate),targetBacklog=baseArrivalRate*140/1e3,backlogError=backlog-targetBacklog,correctionRate=Math.min(600,Math.max(-baseArrivalRate,backlogError*(1e3/267))),revealRate=Math.max(0,baseArrivalRate+correctionRate);return Math.min(backlog,revealRate*dt/1e3)}var StreamingRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#getHideThinkingBlock;#requestRender;#unitCounter=new BlockUnitCounter;#countOf=(index,text2)=>this.#unitCounter.count(index,text2);#sliceOf=(index,text2,units)=>this.#unitCounter.slice(index,text2,units);#target;#component;#timer;#timerFps;#revealed=0;#lastTickAt=0;#firstBufferedAt;#lastTargetAt;#arrivalRate=90;#stepCarry=0;#hideThinkingBlock=!1;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#getHideThinkingBlock=options.getHideThinkingBlock,this.#requestRender=options.requestRender}begin(component,message){if(this.stop(),this.#component=component,this.#target=message,this.#hideThinkingBlock=this.#getHideThinkingBlock(),this.#visibleUnits(message)>0){let now2=performance.now();this.#firstBufferedAt=now2,this.#lastTargetAt=now2}this.#applyTarget()}setTarget(message){let now2=performance.now(),previousUnits=this.#target?this.#visibleUnits(this.#target):0;this.#target=message,this.#hideThinkingBlock=this.#getHideThinkingBlock();let total=this.#visibleUnits(message),appended=Math.max(0,total-previousUnits);appended>0&&(this.#firstBufferedAt===void 0&&(this.#firstBufferedAt=now2),this.#lastTargetAt!==void 0&&now2>this.#lastTargetAt&&(this.#arrivalRate=updateArrivalRate(this.#arrivalRate,appended,now2-this.#lastTargetAt)),this.#lastTargetAt=now2),this.#component&&this.#applyTarget()}resyncVisibility(){!this.#target||!this.#component||(this.#hideThinkingBlock=this.#getHideThinkingBlock(),this.#revealed=Math.min(this.#revealed,this.#visibleUnits(this.#target)),this.#applyTarget())}isPacingHead(message){return!this.#target||!this.#component?!1:this.#getSmoothStreaming()&&!message.content.some(block=>block.type==="toolCall")}stop(){this.#stopTimer(),this.#target=void 0,this.#component=void 0,this.#revealed=0,this.#lastTickAt=0,this.#unitCounter.reset(),this.#firstBufferedAt=void 0,this.#lastTargetAt=void 0,this.#arrivalRate=90,this.#stepCarry=0}#applyTarget(){let target=this.#target,component=this.#component;if(!target||!component)return;let total=this.#visibleUnits(target);if(!this.#getSmoothStreaming()||target.content.some(block=>block.type==="toolCall")){this.#revealed=total,this.#stepCarry=0,this.#stopTimer(),component.updateContent(target);return}this.#revealed=Math.min(this.#revealed,total),this.#renderCurrent(),this.#syncTimer(total)}#visibleUnits(message){return countVisibleUnits(message,this.#hideThinkingBlock,this.#countOf)}#renderCurrent(){!this.#target||!this.#component||this.#component.updateContent(buildDisplayMessage(this.#target,this.#revealed,this.#hideThinkingBlock,this.#countOf,this.#sliceOf))}#syncTimer(total){if(this.#revealed>=total){this.#stepCarry=0,this.#stopTimer();return}this.#startTimer()}#startTimer(){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(this.#timer&&this.#timerFps===fps)return;this.#stopTimer(),this.#lastTickAt=performance.now();let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){let target=this.#target;if(!target||!this.#component){this.stop();return}let total=this.#visibleUnits(target);if(this.#revealed>=total){this.#stepCarry=0,this.#stopTimer();return}let now2=performance.now(),dt=now2-this.#lastTickAt;if(this.#lastTickAt=now2,this.#firstBufferedAt!==void 0&&now2-this.#firstBufferedAt<80)return;this.#stepCarry+=nextStep(total-this.#revealed,dt,this.#arrivalRate);let wholeStep=Math.floor(this.#stepCarry);wholeStep<=0||(this.#stepCarry-=wholeStep,this.#revealed=Math.min(total,this.#revealed+wholeStep),this.#renderCurrent(),this.#requestRender(),this.#revealed>=total&&(this.#stepCarry=0,this.#stopTimer()))}};import{mkdirSync as mkdirSync25,readFileSync as readFileSync43,renameSync as renameSync18,writeFileSync as writeFileSync21}from"node:fs";import{dirname as dirname47,join as join80}from"node:path";function hintPath(agentDir=getAgentDir()){return join80(agentDir,"cache","terminal-theme.json")}function readTerminalThemeHint(agentDir){try{let parsed=JSON.parse(readFileSync43(hintPath(agentDir),"utf8"));if(typeof parsed!="object"||parsed===null)return;let value2=parsed.terminalTheme;return value2==="light"||value2==="dark"?value2:void 0}catch{return}}function writeTerminalThemeHint(terminalTheme,agentDir){try{let path13=hintPath(agentDir);mkdirSync25(dirname47(path13),{recursive:!0});let temporary=`${path13}.${process.pid}.tmp`;writeFileSync21(temporary,`${JSON.stringify({terminalTheme})}
|
|
2530
|
+
`)}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 source=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source,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 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.chat=chat}record(raw,expanded=!1){this.pending=!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.notice?.setSummary(void 0)}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!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)}}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 existsSync41,mkdirSync as mkdirSync25,readFileSync as readFileSync43,realpathSync as realpathSync10,writeFileSync as writeFileSync21}from"node:fs";import{join as join80}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(platform4){return platform4==="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(readFileSync43(join80(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{mkdirSync25(agentDir,{recursive:!0}),writeFileSync21(join80(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2531
|
+
`)}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(existsSync41,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}function countGraphemesFrom(text2,start){let count=0,tailStart=start;for(let segment2 of getGraphemeSegmenter().segment(start===0?text2:text2.slice(start)))count+=1,tailStart=start+segment2.index;return{count,tailStart}}function segmentFrom(text2,start,clusters){let count=0,end=start,lastStart=start;for(let segment2 of getGraphemeSegmenter().segment(start===0?text2:text2.slice(start)))if(count+=1,lastStart=start+segment2.index,end=lastStart+segment2.segment.length,count>=clusters)break;return{count,end,lastStart}}var BlockUnitCounter=class{#entries=new Map;#sliceEntries=new Map;count(index,text2){let entry=this.#entries.get(index);if(entry!==void 0){if(entry.text===text2)return entry.count;if(entry.count>0&&text2.length>entry.text.length&&text2.startsWith(entry.text)){let tail=countGraphemesFrom(text2,entry.tailStart),next={text:text2,count:entry.count-1+tail.count,tailStart:tail.tailStart};return this.#entries.set(index,next),next.count}}let full=countGraphemesFrom(text2,0);return this.#entries.set(index,{text:text2,count:full.count,tailStart:full.tailStart}),full.count}slice(index,text2,units){let wholeUnits=Math.floor(units);if(wholeUnits<=0||text2.length===0)return"";let entry=this.#sliceEntries.get(index);if(entry?.text===text2&&entry.units===wholeUnits)return entry.end>=text2.length?text2:text2.slice(0,entry.end);if(entry!==void 0&&(entry.text===text2||text2.startsWith(entry.text))&&wholeUnits>=entry.units){let segment3=segmentFrom(text2,entry.lastStart,wholeUnits-entry.units+1);return this.#sliceEntries.set(index,{text:text2,units:entry.units-1+segment3.count,end:segment3.end,lastStart:segment3.lastStart}),segment3.end>=text2.length?text2:text2.slice(0,segment3.end)}let segment2=segmentFrom(text2,0,wholeUnits);return this.#sliceEntries.set(index,{text:text2,units:segment2.count,end:segment2.end,lastStart:segment2.lastStart}),segment2.end>=text2.length?text2:text2.slice(0,segment2.end)}reset(){this.#entries.clear(),this.#sliceEntries.clear()}};function countGraphemes(text2){return countGraphemesFrom(text2,0).count}function sliceGraphemes(text2,units){if(units<=0||text2.length===0)return"";let segment2=segmentFrom(text2,0,units);return segment2.end>=text2.length?text2:text2.slice(0,segment2.end)}function countVisibleUnits(message,hideThinking,countOf){let total=0;for(let index=0;index<message.content.length;index++){let block=message.content[index];block?.type==="text"?total+=countOf(index,block.text):block?.type==="thinking"&&!hideThinking&&(total+=countOf(index,block.thinking))}return total}function buildDisplayMessage(target,revealed,hideThinking,countOf=(_index,text2)=>countGraphemes(text2),sliceOf=(_index,text2,units)=>sliceGraphemes(text2,units)){let remaining=Math.max(0,Math.floor(revealed)),content=[];for(let index=0;index<target.content.length;index++){let block=target.content[index];if(block)if(block.type==="text"){let units=countOf(index,block.text);content.push(remaining<=0?block.text.length===0?block:{...block,text:""}:remaining>=units?block:{...block,text:sliceOf(index,block.text,remaining)}),remaining=Math.max(0,remaining-units)}else if(block.type==="thinking"&&!hideThinking){let units=countOf(index,block.thinking);content.push(remaining<=0?block.thinking.length===0?block:{...block,thinking:""}:remaining>=units?block:{...block,thinking:sliceOf(index,block.thinking,remaining)}),remaining=Math.max(0,remaining-units)}else content.push(block)}return{...target,content}}function updateArrivalRate(currentRate,appendedUnits,elapsedMs){if(appendedUnits<=0||elapsedMs<=0)return currentRate;let sampleRate=appendedUnits*1e3/elapsedMs,maximumSample=Math.max(45,currentRate*4),boundedSample=Math.min(maximumSample,Math.max(45,sampleRate));return currentRate+.25*(boundedSample-currentRate)}function nextStep(backlog,dtMs,arrivalRate=90){if(backlog<=0)return 0;let dt=Math.min(Math.max(dtMs,1),100),baseArrivalRate=Math.max(45,arrivalRate),targetBacklog=baseArrivalRate*140/1e3,backlogError=backlog-targetBacklog,correctionRate=Math.min(600,Math.max(-baseArrivalRate,backlogError*(1e3/267))),revealRate=Math.max(0,baseArrivalRate+correctionRate);return Math.min(backlog,revealRate*dt/1e3)}var StreamingRevealController=class{#getSmoothStreaming;#getSmoothStreamingFps;#getHideThinkingBlock;#requestRender;#unitCounter=new BlockUnitCounter;#countOf=(index,text2)=>this.#unitCounter.count(index,text2);#sliceOf=(index,text2,units)=>this.#unitCounter.slice(index,text2,units);#target;#component;#timer;#timerFps;#revealed=0;#lastTickAt=0;#firstBufferedAt;#lastTargetAt;#arrivalRate=90;#stepCarry=0;#hideThinkingBlock=!1;constructor(options){this.#getSmoothStreaming=options.getSmoothStreaming,this.#getSmoothStreamingFps=options.getSmoothStreamingFps,this.#getHideThinkingBlock=options.getHideThinkingBlock,this.#requestRender=options.requestRender}begin(component,message){if(this.stop(),this.#component=component,this.#target=message,this.#hideThinkingBlock=this.#getHideThinkingBlock(),this.#visibleUnits(message)>0){let now2=performance.now();this.#firstBufferedAt=now2,this.#lastTargetAt=now2}this.#applyTarget()}setTarget(message){let now2=performance.now(),previousUnits=this.#target?this.#visibleUnits(this.#target):0;this.#target=message,this.#hideThinkingBlock=this.#getHideThinkingBlock();let total=this.#visibleUnits(message),appended=Math.max(0,total-previousUnits);appended>0&&(this.#firstBufferedAt===void 0&&(this.#firstBufferedAt=now2),this.#lastTargetAt!==void 0&&now2>this.#lastTargetAt&&(this.#arrivalRate=updateArrivalRate(this.#arrivalRate,appended,now2-this.#lastTargetAt)),this.#lastTargetAt=now2),this.#component&&this.#applyTarget()}resyncVisibility(){!this.#target||!this.#component||(this.#hideThinkingBlock=this.#getHideThinkingBlock(),this.#revealed=Math.min(this.#revealed,this.#visibleUnits(this.#target)),this.#applyTarget())}isPacingHead(message){return!this.#target||!this.#component?!1:this.#getSmoothStreaming()&&!message.content.some(block=>block.type==="toolCall")}stop(){this.#stopTimer(),this.#target=void 0,this.#component=void 0,this.#revealed=0,this.#lastTickAt=0,this.#unitCounter.reset(),this.#firstBufferedAt=void 0,this.#lastTargetAt=void 0,this.#arrivalRate=90,this.#stepCarry=0}#applyTarget(){let target=this.#target,component=this.#component;if(!target||!component)return;let total=this.#visibleUnits(target);if(!this.#getSmoothStreaming()||target.content.some(block=>block.type==="toolCall")){this.#revealed=total,this.#stepCarry=0,this.#stopTimer(),component.updateContent(target);return}this.#revealed=Math.min(this.#revealed,total),this.#renderCurrent(),this.#syncTimer(total)}#visibleUnits(message){return countVisibleUnits(message,this.#hideThinkingBlock,this.#countOf)}#renderCurrent(){!this.#target||!this.#component||this.#component.updateContent(buildDisplayMessage(this.#target,this.#revealed,this.#hideThinkingBlock,this.#countOf,this.#sliceOf))}#syncTimer(total){if(this.#revealed>=total){this.#stepCarry=0,this.#stopTimer();return}this.#startTimer()}#startTimer(){let configuredFps=this.#getSmoothStreamingFps(),fps=Number.isFinite(configuredFps)?Math.min(120,Math.max(30,configuredFps)):60;if(this.#timer&&this.#timerFps===fps)return;this.#stopTimer(),this.#lastTickAt=performance.now();let timer=setInterval(()=>this.#tick(),1e3/fps);timer.unref(),this.#timer=timer,this.#timerFps=fps}#stopTimer(){this.#timer&&clearInterval(this.#timer),this.#timer=void 0,this.#timerFps=void 0}#tick(){let target=this.#target;if(!target||!this.#component){this.stop();return}let total=this.#visibleUnits(target);if(this.#revealed>=total){this.#stepCarry=0,this.#stopTimer();return}let now2=performance.now(),dt=now2-this.#lastTickAt;if(this.#lastTickAt=now2,this.#firstBufferedAt!==void 0&&now2-this.#firstBufferedAt<80)return;this.#stepCarry+=nextStep(total-this.#revealed,dt,this.#arrivalRate);let wholeStep=Math.floor(this.#stepCarry);wholeStep<=0||(this.#stepCarry-=wholeStep,this.#revealed=Math.min(total,this.#revealed+wholeStep),this.#renderCurrent(),this.#requestRender(),this.#revealed>=total&&(this.#stepCarry=0,this.#stopTimer()))}};import{mkdirSync as mkdirSync26,readFileSync as readFileSync44,renameSync as renameSync18,writeFileSync as writeFileSync22}from"node:fs";import{dirname as dirname47,join as join81}from"node:path";function hintPath(agentDir=getAgentDir()){return join81(agentDir,"cache","terminal-theme.json")}function readTerminalThemeHint(agentDir){try{let parsed=JSON.parse(readFileSync44(hintPath(agentDir),"utf8"));if(typeof parsed!="object"||parsed===null)return;let value2=parsed.terminalTheme;return value2==="light"||value2==="dark"?value2:void 0}catch{return}}function writeTerminalThemeHint(terminalTheme,agentDir){try{let path13=hintPath(agentDir);mkdirSync26(dirname47(path13),{recursive:!0});let temporary=`${path13}.${process.pid}.tmp`;writeFileSync22(temporary,`${JSON.stringify({terminalTheme})}
|
|
2531
2532
|
`),renameSync18(temporary,path13)}catch{}}var InteractiveThemeController=class{constructor(ui,options){this.terminalTheme=readTerminalThemeHint()??detectTerminalBackgroundFromEnv().theme,this.autoSyncEnabled=!1,this.detectionGeneration=0,this.detectionTask=Promise.resolve(),this.ui=ui,this.getSettingsManager=options.getSettingsManager,this.showError=options.showError,this.onChanged=options.onChanged,this.currentThemeSetting=options.initialThemeSetting,this.activeThemeName=resolveThemeSetting(this.currentThemeSetting??this.getSettingsManager().getThemeSetting(),this.terminalTheme),initTheme(this.activeThemeName,!0),this.bindTerminalColorSchemeListener()}rebindTui(){this.terminalColorSchemeUnsubscribe?.(),this.bindTerminalColorSchemeListener(),this.ui.setTerminalColorSchemeNotifications(this.autoSyncEnabled)}async applyFromSettings(){let settingsManager=this.getSettingsManager(),themeSetting=this.currentThemeSetting??settingsManager.getThemeSetting(),autoTheme=parseAutoThemeSetting(themeSetting),generation2=++this.detectionGeneration;if(autoTheme){this.setAutoSync(!0),this.applyThemeName(this.terminalTheme==="light"?autoTheme.lightTheme:autoTheme.darkTheme,!0),this.detectionTask=this.resolveAutoTheme(generation2,autoTheme);return}if(this.setAutoSync(!1),themeSetting!==void 0){this.applyThemeName(themeSetting,!0),this.detectionTask=Promise.resolve();return}this.applyThemeName(this.terminalTheme),this.detectionTask=this.resolveBackgroundTheme(generation2,settingsManager)}settleBackgroundDetection(){return this.detectionTask}getThemeSelection(){return this.currentThemeSetting??this.getSettingsManager().getThemeSetting()??this.activeThemeName}setThemeName(themeName,showError=!1){this.detectionGeneration+=1,this.detectionTask=Promise.resolve(),this.setAutoSync(!1);let result3=this.applyThemeName(themeName,showError);return result3.success&&(this.currentThemeSetting=themeName),result3}async setThemeSetting(themeSetting){this.currentThemeSetting=themeSetting,await this.applyFromSettings()}setThemeInstance(themeInstance){return this.detectionGeneration+=1,this.detectionTask=Promise.resolve(),this.setAutoSync(!1),setThemeInstance(themeInstance),this.activeThemeName="<in-memory>",this.notifyChanged(),{success:!0}}preview(themeSettingOrName){let themeName=resolveThemeSetting(themeSettingOrName,this.terminalTheme)??this.activeThemeName;themeName&&setTheme(themeName,!0).success&&(this.ui.invalidate(),this.ui.requestRender())}disableAutoSync(){this.setAutoSync(!1)}dispose(){this.detectionGeneration+=1,this.detectionTask=Promise.resolve(),this.setAutoSync(!1),this.terminalColorSchemeUnsubscribe?.(),this.terminalColorSchemeUnsubscribe=void 0}getTerminalTheme(){return this.terminalTheme}async resolveAutoTheme(generation2,autoTheme){try{let detected=await detectTerminalThemeForAuto({ui:this.ui,timeoutMs:100});if(generation2!==this.detectionGeneration)return;this.terminalTheme=detected,writeTerminalThemeHint(detected),this.applyThemeName(detected==="light"?autoTheme.lightTheme:autoTheme.darkTheme,!0)}catch{}}async resolveBackgroundTheme(generation2,settingsManager){try{let detection=await detectTerminalBackgroundTheme({ui:this.ui,timeoutMs:100});if(generation2!==this.detectionGeneration||(this.terminalTheme=detection.theme,writeTerminalThemeHint(detection.theme),!this.applyThemeName(detection.theme).success))return;detection.confidence==="high"&&(settingsManager.setTheme(detection.theme),await settingsManager.flush())}catch{}}applyThemeName(themeName,showError=!1){let result3=setTheme(themeName,!0);return this.activeThemeName=result3.success?themeName:"dark",this.notifyChanged(),!result3.success&&showError&&this.showError(`Failed to load theme "${themeName}": ${result3.error}
|
|
2532
2533
|
Fell back to dark theme.`),result3}notifyChanged(){this.ui.invalidate(),this.onChanged()}setAutoSync(enabled){this.autoSyncEnabled!==enabled&&(this.autoSyncEnabled=enabled,this.ui.setTerminalColorSchemeNotifications(enabled))}bindTerminalColorSchemeListener(){this.terminalColorSchemeUnsubscribe=this.ui.onTerminalColorSchemeChange(terminalTheme=>this.applyTerminalTheme(terminalTheme))}applyTerminalTheme(terminalTheme){if(!this.autoSyncEnabled)return;this.terminalTheme=terminalTheme;let autoTheme=parseAutoThemeSetting(this.currentThemeSetting??this.getSettingsManager().getThemeSetting());if(!autoTheme){this.setAutoSync(!1);return}let themeName=terminalTheme==="light"?autoTheme.lightTheme:autoTheme.darkTheme;themeName!==this.activeThemeName&&this.applyThemeName(themeName)}};function buildFavoriteCycleStatusMessage(kind){let openSelector=keyText("app.model.select"),toggleFavorite=keyText("app.models.toggleFavorite"),setupHint=`Press ${openSelector} then ${toggleFavorite} to favorite models, or run /favorite-models.`;return kind==="single"?`Only one favorite model available. ${setupHint}`:`No favorite models configured. ${setupHint} See /help for the full reference.`}function recordTipShown(history,tipId,now2){return{...history,[tipId]:now2}}function appendTipLine(container,tipLine){container.addChild(new Spacer(1));let tip=new Text(tipLine,1,0);return container.addChild(tip),tip}function appendStartupHeader(container,header2,tipLine){container.addChild(new Spacer(1)),container.addChild(header2);let tipComponent=tipLine?appendTipLine(container,tipLine):void 0;return container.addChild(new Spacer(1)),tipComponent}function selectTip(definitions,history,now2,options={}){let keys=options.keys,hasCommand=options.hasCommand,oldestTip,oldestTimestamp=Number.POSITIVE_INFINITY;for(let tip of definitions){if(options.exclude?.has(tip.id)||keys&&tip.bindings.length>0&&tip.bindings.every(binding=>keys(binding)==="")||hasCommand&&tip.requiresCommand!==void 0&&!hasCommand(tip.requiresCommand))continue;if(!Object.hasOwn(history,tip.id))return tip;let lastShown=history[tip.id];(oldestTip===void 0||lastShown<oldestTimestamp)&&(oldestTip=tip,oldestTimestamp=lastShown)}return oldestTip}function resolveStartupTipLine(options){if(!options.tipsEnabled||options.quietStartup)return;let selectOptions={keys:options.keys,...options.hasCommand?{hasCommand:options.hasCommand}:{},...options.exclude?{exclude:options.exclude}:{}},tip=selectTip(options.definitions,options.history,options.now,selectOptions);return tip?{line:`Tip: ${tip.render(options.keys).replace(/\s*\n\s*/g," ").trim()}
|
|
2533
2534
|
\u21B3 Want the full story on any tip? Ask about it \u2014 the give-me-tips skill has the tour.`,tipId:tip.id}:void 0}var WorkingTipCache=class{resetForNewTurn(){this.cached=void 0}resolve(compute,onFirstResolve){if(this.cached!==void 0)return this.cached.value;let value2=compute();return this.cached={value:value2},value2&&onFirstResolve?.(value2),value2}};function resolveWorkingTipLine(options){if(!options.tipsEnabled)return;let tip=selectTip(options.definitions,options.history,options.now,{keys:options.keys,...options.hasCommand?{hasCommand:options.hasCommand}:{},exclude:options.sessionShownTipIds});return tip?{line:`Tip: ${tip.render(options.keys).replace(/\s*\n\s*/g," ").trim()}
|
|
@@ -2542,7 +2543,7 @@ ${compactOnboarding}
|
|
|
2542
2543
|
${onboarding}`,()=>`${logo}
|
|
2543
2544
|
${expandedInstructions}
|
|
2544
2545
|
|
|
2545
|
-
${onboarding}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.headerContainer,this.builtInHeader,tipLine)}else this.builtInHeader=new Text("",0,0),this.headerContainer.addChild(this.builtInHeader);this.ui.requestRender();let[fdPath]=await Promise.all([ensureTool("fd",status=>this.showManagedToolStatus(status)),ensureTool("rg",status=>this.showManagedToolStatus(status))]);this.fdPath=fdPath,time("ensureTools","tui"),this.setupKeyHandlers(),this.setupEditorSubmitHandler(),this.ui.requestRender(),time("keyHandlers","tui"),await this.rebindCurrentSession(),time("rebindSession","tui"),this.renderInitialMessages(),time("renderInitial","tui"),onThemeChange(()=>{this.ui.invalidate(),this.updateEditorBorderColor(),this.ui.requestRender()}),this.footerDataProvider.onBranchChange(()=>{this.ui.requestRender()}),this.updateAvailableProviderCount()}getNormalTerminalTitle(){let cwdBasename=path12.basename(this.sessionManager.getCwd()),sessionName2=this.sessionManager.getSessionName();return sessionName2?`${APP_TITLE} - ${sessionName2} - ${cwdBasename}`:`${APP_TITLE} - ${cwdBasename}`}applyTerminalTitle(){let questionHeader=this.shownQuestion?.request.questions[0]?.header??this.blockingQuestionHeader;this.ui.terminal.setTitle(this.activeToolTerminalTitle??this.activeToolExecutionTerminalTitle??(questionHeader===void 0?void 0:`? ${questionHeader}`)??this.extensionTerminalTitle??this.getNormalTerminalTitle())}updateTerminalTitle(){this.applyTerminalTitle()}async run(){if(await this.init(),!envValue("OFFLINE")){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);refreshModelCatalogs(this.session.modelRuntime,controller.signal).then(()=>{this.updateAvailableProviderCount(),this.ui.requestRender()}).catch(()=>{}).finally(()=>clearTimeout(timeout))}checkForNewPiVersion(this.version).then(newVersion=>{newVersion&&this.showNewVersionNotification(newVersion.version)}),this.checkForPackageUpdates().then(updates=>{updates.length>0&&this.showPackageUpdateNotification(updates)}).finally(()=>{process.platform==="win32"&&this.isInitialized&&this.updateTerminalTitle()}),this.checkTmuxSetup().then(warning=>{warning&&this.showWarning(warning)});let{migratedProviders,startupDiagnostics,modelFallbackMessage,initialMessage,initialImages,initialMessages,initialTitlePrompt}=this.options;migratedProviders&&migratedProviders.length>0&&this.showWarning(`Migrated credentials to auth.json: ${migratedProviders.join(", ")}`);for(let diagnostic2 of startupDiagnostics??[])diagnostic2.type==="warning"?this.showWarning(diagnostic2.message):diagnostic2.type==="error"&&this.showError(diagnostic2.message);let modelsJsonError=this.session.modelRuntime.getError();modelsJsonError&&this.showError(`models.json error: ${modelsJsonError}`);for(let warning of this.session.modelRuntime.getWarnings())this.showWarning(warning);modelFallbackMessage&&this.showWarning(modelFallbackMessage);for(let warning of this.session.fallbackValidationWarnings)this.showWarning(warning);if(this.showRiskyMainModelWarning(this.session.model),this.maybeWarnAboutAnthropicSubscriptionAuth(),initialMessage)try{await this.session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:initialTitlePrompt??!1})}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}if(initialMessages)for(let message of initialMessages)try{await this.session.prompt(message)}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}for(;;){let userInput=await this.getUserInput();try{await this.session.prompt(userInput.text,this.buildMainLoopPromptOptions(userInput))}catch(error2){this.optimisticUserEchoes.reject(userInput.pendingEchoId),this.clearStatusIndicator("working");let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}}}async checkForPackageUpdates(){return[]}async checkTmuxSetup(){return this.checkTmuxKeyboardSetup()}async checkTmuxKeyboardSetup(){if(!process.env.TMUX)return;let runTmux=args=>new Promise(resolve42=>{let proc=spawn11("tmux",args,{stdio:["ignore","pipe","ignore"]}),stdout="",timer=setTimeout(()=>{proc.kill(),resolve42(void 0)},2e3);proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.on("error",()=>{clearTimeout(timer),resolve42(void 0)}),proc.on("close",code=>{clearTimeout(timer),resolve42(code===0?stdout.trim():void 0)})}),[extendedKeys,extendedKeysFormat,clientTermname,allowPassthrough,focusEvents,version]=await Promise.all([runTmux(["show","-gv","extended-keys"]),runTmux(["show","-gv","extended-keys-format"]),runTmux(["display-message","-p","#{client_termname}"]),runTmux(["show","-gv","allow-passthrough"]),runTmux(["show","-gv","focus-events"]),runTmux(["display-message","-p","#{version}"])]);if(extendedKeys!==void 0)return buildTmuxSetupWarning({extendedKeys,extendedKeysFormat,imagesEnabled:getCapabilities().tmuxPassthrough===!0,outerKittyCapable:outerKittyGraphicsMode(clientTermname??"")!==null,allowPassthrough,focusEvents,version})}getChangelogForDisplay(){if(this.session.state.messages.length>0)return;let source=resolveChangelogSource();if(!source.version)return;let lastVersion=this.settingsManager.getChangelogSeen(source.id),changelogPath=source.path,entries=parseChangelog(changelogPath);if(!lastVersion){this.settingsManager.setChangelogSeen(source.id,source.version),this.reportInstallTelemetry(source.version);return}let newEntries=getNewEntries(entries,lastVersion,source.version);if(newEntries.length>0)return this.settingsManager.setChangelogSeen(source.id,source.version),this.reportInstallTelemetry(source.version),newEntries.map(e=>source.rewriteLinks?normalizeChangelogLinks(e.content,e):e.content).join(`
|
|
2546
|
+
${onboarding}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.headerContainer,this.builtInHeader,tipLine)}else this.builtInHeader=new Text("",0,0),this.headerContainer.addChild(this.builtInHeader);this.ui.requestRender();let[fdPath]=await Promise.all([ensureTool("fd",status=>this.showManagedToolStatus(status)),ensureTool("rg",status=>this.showManagedToolStatus(status))]);this.fdPath=fdPath,time("ensureTools","tui"),this.setupKeyHandlers(),this.setupEditorSubmitHandler(),this.ui.requestRender(),time("keyHandlers","tui"),await this.rebindCurrentSession(),time("rebindSession","tui"),this.renderInitialMessages(),time("renderInitial","tui"),onThemeChange(()=>{this.ui.invalidate(),this.updateEditorBorderColor(),this.ui.requestRender()}),this.footerDataProvider.onBranchChange(()=>{this.ui.requestRender()}),this.updateAvailableProviderCount()}getNormalTerminalTitle(){let cwdBasename=path12.basename(this.sessionManager.getCwd()),sessionName2=this.sessionManager.getSessionName();return sessionName2?`${APP_TITLE} - ${sessionName2} - ${cwdBasename}`:`${APP_TITLE} - ${cwdBasename}`}applyTerminalTitle(){let questionHeader=this.shownQuestion?.request.questions[0]?.header??this.blockingQuestionHeader;this.ui.terminal.setTitle(this.activeToolTerminalTitle??this.activeToolExecutionTerminalTitle??(questionHeader===void 0?void 0:`? ${questionHeader}`)??this.extensionTerminalTitle??this.getNormalTerminalTitle())}updateTerminalTitle(){this.applyTerminalTitle()}async run(){if(await this.init(),!envValue("OFFLINE")){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);refreshModelCatalogs(this.session.modelRuntime,controller.signal).then(()=>{this.updateAvailableProviderCount(),this.ui.requestRender()}).catch(()=>{}).finally(()=>clearTimeout(timeout))}checkForNewPiVersion(this.version).then(newVersion=>{newVersion&&this.showNewVersionNotification(newVersion.version)}),this.checkForPackageUpdates().then(updates=>{updates.length>0&&this.showPackageUpdateNotification(updates)}).finally(()=>{process.platform==="win32"&&this.isInitialized&&this.updateTerminalTitle()}),this.checkTmuxSetup().then(warning=>{warning&&this.showWarning(warning)});let{migratedProviders,startupDiagnostics,modelFallbackMessage,initialMessage,initialImages,initialMessages,initialTitlePrompt}=this.options;migratedProviders&&migratedProviders.length>0&&this.showWarning(`Migrated credentials to auth.json: ${migratedProviders.join(", ")}`);for(let diagnostic2 of startupDiagnostics??[])diagnostic2.type==="warning"?this.showWarning(diagnostic2.message):diagnostic2.type==="error"&&this.showError(diagnostic2.message);let modelsJsonError=this.session.modelRuntime.getError();modelsJsonError&&this.showError(`models.json error: ${modelsJsonError}`);for(let warning of this.session.modelRuntime.getWarnings())this.showWarning(warning);modelFallbackMessage&&this.showWarning(modelFallbackMessage);for(let warning of this.session.fallbackValidationWarnings)this.showWarning(warning);if(this.showRiskyMainModelWarning(this.session.model),this.maybeWarnAboutAnthropicSubscriptionAuth(),maybeShowRuntimeNotice(spec=>this.showNoticeBox(spec)),initialMessage)try{await this.session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:initialTitlePrompt??!1})}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}if(initialMessages)for(let message of initialMessages)try{await this.session.prompt(message)}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}for(;;){let userInput=await this.getUserInput();try{await this.session.prompt(userInput.text,this.buildMainLoopPromptOptions(userInput))}catch(error2){this.optimisticUserEchoes.reject(userInput.pendingEchoId),this.clearStatusIndicator("working");let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}}}async checkForPackageUpdates(){return[]}async checkTmuxSetup(){return this.checkTmuxKeyboardSetup()}async checkTmuxKeyboardSetup(){if(!process.env.TMUX)return;let runTmux=args=>new Promise(resolve42=>{let proc=spawn11("tmux",args,{stdio:["ignore","pipe","ignore"]}),stdout="",timer=setTimeout(()=>{proc.kill(),resolve42(void 0)},2e3);proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.on("error",()=>{clearTimeout(timer),resolve42(void 0)}),proc.on("close",code=>{clearTimeout(timer),resolve42(code===0?stdout.trim():void 0)})}),[extendedKeys,extendedKeysFormat,clientTermname,allowPassthrough,focusEvents,version]=await Promise.all([runTmux(["show","-gv","extended-keys"]),runTmux(["show","-gv","extended-keys-format"]),runTmux(["display-message","-p","#{client_termname}"]),runTmux(["show","-gv","allow-passthrough"]),runTmux(["show","-gv","focus-events"]),runTmux(["display-message","-p","#{version}"])]);if(extendedKeys!==void 0)return buildTmuxSetupWarning({extendedKeys,extendedKeysFormat,imagesEnabled:getCapabilities().tmuxPassthrough===!0,outerKittyCapable:outerKittyGraphicsMode(clientTermname??"")!==null,allowPassthrough,focusEvents,version})}getChangelogForDisplay(){if(this.session.state.messages.length>0)return;let source=resolveChangelogSource();if(!source.version)return;let lastVersion=this.settingsManager.getChangelogSeen(source.id),changelogPath=source.path,entries=parseChangelog(changelogPath);if(!lastVersion){this.settingsManager.setChangelogSeen(source.id,source.version),this.reportInstallTelemetry(source.version);return}let newEntries=getNewEntries(entries,lastVersion,source.version);if(newEntries.length>0)return this.settingsManager.setChangelogSeen(source.id,source.version),this.reportInstallTelemetry(source.version),newEntries.map(e=>source.rewriteLinks?normalizeChangelogLinks(e.content,e):e.content).join(`
|
|
2546
2547
|
|
|
2547
2548
|
`)}reportInstallTelemetry(version){BRAND||envValue("OFFLINE")||isInstallTelemetryEnabled(this.settingsManager)&&fetch(`https://pi.dev/api/report-install?version=${encodeURIComponent(version)}`,{headers:{"User-Agent":getPiUserAgent(version)},signal:AbortSignal.timeout(5e3)}).then(()=>{}).catch(()=>{})}getMarkdownThemeWithSettings(){return{...getMarkdownTheme(),codeBlockIndent:this.settingsManager.getCodeBlockIndent()}}getBuiltinExtensionDisplayName(extensionId){return extensionId==="todowrite"?"todo":extensionId}getBuiltinExtensionNameFromPath(p){let builtinMatch=p.match(/^<builtin:([^>]+)>$/);if(builtinMatch)return this.getBuiltinExtensionDisplayName(builtinMatch[1])}formatDisplayPath(p){let builtinName=this.getBuiltinExtensionNameFromPath(p);if(builtinName)return`builtin/${builtinName}`;let home=os6.homedir(),result3=p;return result3.startsWith(home)&&(result3=`~${result3.slice(home.length)}`),result3}formatExtensionDisplayPath(path13){let result3=this.formatDisplayPath(path13);return result3=result3.replace(/\/index\.ts$/,"").replace(/\/index\.js$/,""),result3}formatContextPath(p){let cwd=path12.resolve(this.sessionManager.getCwd()),absolutePath=path12.isAbsolute(p)?path12.resolve(p):path12.resolve(cwd,p),relativePath=getCwdRelativePath(absolutePath,cwd);return relativePath!==void 0?relativePath:this.formatDisplayPath(absolutePath)}getStartupExpansionState(){return this.options.verbose||this.toolOutputExpanded}async handleKeybindingsCommand(){let configPath=path12.join(getAgentDir(),"keybindings.json"),editorCommand=process.env.VISUAL||process.env.EDITOR;if(!editorCommand){this.showError(`Set $EDITOR or $VISUAL to edit ${configPath}.`);return}let seeded=seedKeybindingsFile(configPath,this.keybindings),edit=await editFileInExternalEditor({command:editorCommand,path:configPath});if(edit.status==="launch-failed"){seeded&&fs6.rmSync(configPath,{force:!0}),this.showError(`Could not open ${configPath} with "${editorCommand}".`);return}if(edit.status==="exited"){this.showError(`"${editorCommand}" exited with code ${edit.code}; keybindings were not reloaded.`);return}let applied=applyKeybindingsFileEdit(configPath,this.keybindings);if(applied.status==="invalid"){this.showError(`Keybindings not reloaded - ${configPath} is not valid JSON: ${applied.message}`);return}this.showStatus("Keybindings reloaded")}updateShortcutOverlay(nextText){let previousText=this.lastEditorText;this.lastEditorText=nextText;let inputKind=classifyEditorInput(previousText,nextText,this.lastInputWasPaste);if(this.lastInputWasPaste=!1,shouldShowShortcutOverlay(previousText,nextText,inputKind)){this.shortcutOverlay||(this.shortcutOverlay=new ShortcutOverlay,this.headerContainer.addChild(this.shortcutOverlay),this.ui.requestRender());return}this.hideShortcutOverlay()}hideShortcutOverlay(){this.shortcutOverlay&&(this.headerContainer.removeChild(this.shortcutOverlay),this.shortcutOverlay=void 0,this.ui.requestRender())}recordShownTip(tipId){this.sessionShownTipIds.add(tipId);let next=recordTipShown(this.settingsManager.getTipsHistory(),tipId,Date.now());this.settingsManager.setTipShown(tipId,next[tipId]??Date.now())}getShortPath(fullPath,sourceInfo){let normalizedFullPath=fullPath.replace(/\\/g,"/"),baseDir=sourceInfo?.baseDir;if(baseDir&&this.isPackageSource(sourceInfo)){let normalizedBaseDir=baseDir.replace(/\\/g,"/"),npmRootMatch=normalizedBaseDir.match(/^(.*\/node_modules)\/(@?[^/]+(?:\/[^/]+)?)$/);if(npmRootMatch?.[1]&&normalizedFullPath.startsWith(`${npmRootMatch[1]}/`))return path12.posix.relative(normalizedBaseDir,normalizedFullPath);let relativePath=path12.relative(path12.resolve(baseDir),path12.resolve(fullPath));if(relativePath&&relativePath!=="."&&!relativePath.startsWith("..")&&!relativePath.startsWith(`..${path12.sep}`)&&!path12.isAbsolute(relativePath))return relativePath.replace(/\\/g,"/")}let source=sourceInfo?.source??"",npmMatch=normalizedFullPath.match(/node_modules\/(@?[^/]+(?:\/[^/]+)?)\/(.*)/);if(npmMatch&&source.startsWith("npm:"))return npmMatch[2];let gitMatch=normalizedFullPath.match(/git\/[^/]+\/[^/]+\/(.*)/);return gitMatch&&source.startsWith("git:")?gitMatch[1]:this.formatDisplayPath(fullPath)}getCompactPathLabel(resourcePath,sourceInfo){let shortPath=this.getShortPath(resourcePath,sourceInfo),segments=shortPath.replace(/\\/g,"/").split("/").filter(segment2=>segment2.length>0&&segment2!=="~");return segments.length>0?segments[segments.length-1]:shortPath}getCompactPackageSourceLabel(sourceInfo){let source=sourceInfo?.source??"";if(source.startsWith("npm:"))return source.slice(4)||source;let gitSource=parseGitUrl(source);return gitSource&&gitSource.path||source}getCompactExtensionLabel(resourcePath,sourceInfo){if(!this.isPackageSource(sourceInfo))return this.getCompactPathLabel(resourcePath,sourceInfo);let sourceLabel2=this.getCompactPackageSourceLabel(sourceInfo);if(!sourceLabel2)return this.getCompactPathLabel(resourcePath,sourceInfo);let shortPath=this.getShortPath(resourcePath,sourceInfo).replace(/\\/g,"/"),packagePath=shortPath.startsWith("extensions/")?shortPath.slice(11):shortPath,parsedPath=path12.posix.parse(packagePath);return parsedPath.name==="index"?!parsedPath.dir||parsedPath.dir==="."?sourceLabel2:`${sourceLabel2}:${parsedPath.dir}`:`${sourceLabel2}:${packagePath}`}getCompactDisplayPathSegments(resourcePath){return this.formatDisplayPath(resourcePath).replace(/\\/g,"/").split("/").filter(segment2=>segment2.length>0&&segment2!=="~")}getCompactNonPackageExtensionLabel(resourcePath,index,allPaths){let segments=allPaths[index]?.segments;if(!segments||segments.length===0)return this.getCompactPathLabel(resourcePath);for(let segmentCount=1;segmentCount<=segments.length;segmentCount+=1){let candidate=segments.slice(-segmentCount).join("/");if(allPaths.every((item,itemIndex)=>itemIndex===index?!0:item.segments.slice(-segmentCount).join("/")!==candidate))return candidate}return segments.join("/")}getCompactExtensionLabels(extensions){let nonPackageExtensions=extensions.map(extension=>{let segments=this.getCompactDisplayPathSegments(extension.path),lastSegment=segments[segments.length-1];return segments.length>1&&(lastSegment==="index.ts"||lastSegment==="index.js")&&segments.pop(),{path:extension.path,sourceInfo:extension.sourceInfo,segments}}).filter(extension=>!this.isPackageSource(extension.sourceInfo));return extensions.map(extension=>{if(this.isPackageSource(extension.sourceInfo))return this.getCompactExtensionLabel(extension.path,extension.sourceInfo);let nonPackageIndex=nonPackageExtensions.findIndex(item=>item.path===extension.path);return nonPackageIndex===-1?this.getCompactPathLabel(extension.path,extension.sourceInfo):this.getCompactNonPackageExtensionLabel(extension.path,nonPackageIndex,nonPackageExtensions)})}getDisplaySourceInfo(sourceInfo){return getDisplaySourceInfo(sourceInfo)}isPackageSource(sourceInfo){return isPackageSourceInfo(sourceInfo)}buildScopeGroups(items){return buildResourceScopeGroups(items)}formatScopeGroups(groups,options){return formatResourceScopeGroups(groups,options)}findSourceInfoForPath(p,sourceInfos){let exact=sourceInfos.get(p);if(exact)return exact;let current=p;for(;current.includes("/");){current=current.substring(0,current.lastIndexOf("/"));let parent=sourceInfos.get(current);if(parent)return parent}}formatPathWithSource(p,sourceInfo){if(sourceInfo){let shortPath=this.getShortPath(p,sourceInfo),{label:label3,scopeLabel}=this.getDisplaySourceInfo(sourceInfo);return`${scopeLabel?`${label3} (${scopeLabel})`:label3} ${shortPath}`}return this.formatDisplayPath(p)}formatDiagnostics(diagnostics,sourceInfos){let lines=[],collisions=new Map,otherDiagnostics=[];for(let d of diagnostics)if(d.type==="collision"&&d.collision){let list3=collisions.get(d.collision.name)??[];list3.push(d),collisions.set(d.collision.name,list3)}else otherDiagnostics.push(d);for(let[name,collisionList]of collisions){let first=collisionList[0]?.collision;if(first){lines.push({text:` "${name}" collision:`,tone:"warning"}),lines.push({text:` \u2713 ${this.formatPathWithSource(first.winnerPath,this.findSourceInfoForPath(first.winnerPath,sourceInfos))}`,tone:"warning"});for(let d of collisionList)d.collision&&lines.push({text:` \u2717 ${this.formatPathWithSource(d.collision.loserPath,this.findSourceInfoForPath(d.collision.loserPath,sourceInfos))} (skipped)`,tone:"warning"})}}for(let d of otherDiagnostics){let tone=d.type==="error"?"error":"warning";if(d.path){let formattedPath=this.formatPathWithSource(d.path,this.findSourceInfoForPath(d.path,sourceInfos));lines.push({text:` ${formattedPath}`,tone}),lines.push({text:` ${d.message}`,tone})}else lines.push({text:` ${d.message}`,tone})}return lines}showLoadedResources(options){this.loadedResourcesContainer.clear();let showListing=options?.force||this.options.verbose||!this.settingsManager.getQuietStartup(),showDiagnostics=showListing||options?.showDiagnosticsWhenQuiet===!0;if(!showListing&&!showDiagnostics)return;let sectionHeader=(name,color="mdHeading")=>theme.fg(color,`[${name}]`),formatCompactList=(items,options2)=>{let labels=items.map(item=>item.trim()).filter(item=>item.length>0);return labels.length===0?"":(options2?.sort!==!1&&labels.sort((a,b)=>a.localeCompare(b)),theme.fg("dim",` ${labels.join(", ")}`))},addLoadedSection=(name,collapsedBody,expandedBody=collapsedBody,color="mdHeading")=>{let section=new LoadedResourceSection(collapsedBody.length===0?"":`${sectionHeader(name,color)}
|
|
2548
2549
|
${collapsedBody}`,`${sectionHeader(name,color)}
|