@code-yeongyu/senpi 2026.10.10-8 → 2026.10.10-9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/bundle/chunks/{anthropic-messages-6EZ2RZQI.js → anthropic-messages-2B35OVB7.js} +2 -2
  3. package/dist/bundle/chunks/{app-server-command-WVQZIVCM.js → app-server-command-2ZXLBILW.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-KKJJVAVT.js → chunk-4WZF7G6N.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-TUGQPBQG.js → chunk-NTH33AXY.js} +15 -4
  6. package/dist/bundle/chunks/{chunk-56NFYCQ3.js → chunk-QMUL36OS.js} +19 -24
  7. package/dist/bundle/chunks/{chunk-TLK72OXY.js → chunk-QQZREV6B.js} +1 -1
  8. package/dist/bundle/chunks/chunk-Z72GD25U.js +9 -0
  9. package/dist/bundle/chunks/{chunk-QYKYTDMI.js → chunk-ZCYTYHDN.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-DOMETRRO.js → chunk-ZPJHS64R.js} +1 -1
  11. package/dist/bundle/chunks/{cli-main-CED4CUJM.js → cli-main-VTGNVET5.js} +1 -1
  12. package/dist/bundle/chunks/{help-fast-path-PSP2GJSG.js → help-fast-path-5P73752B.js} +1 -1
  13. package/dist/bundle/chunks/{host-command-5ILDFZVI.js → host-command-MWQNTWFA.js} +1 -1
  14. package/dist/bundle/chunks/{interactive-mode-ZKESRBOA.js → interactive-mode-ERBFHQQJ.js} +1 -1
  15. package/dist/bundle/chunks/{multi-session-host-AL2DTLN2.js → multi-session-host-S37LFCMH.js} +1 -1
  16. package/dist/bundle/chunks/{package-manager-cli-U4UWVUUX.js → package-manager-cli-FVEIJBD5.js} +1 -1
  17. package/dist/bundle/chunks/{rotation-stream-TAARAJGY.js → rotation-stream-FQH63DMY.js} +1 -1
  18. package/dist/bundle/chunks/{rpc-mode-MXEWGXIB.js → rpc-mode-KJFVBWIP.js} +1 -1
  19. package/dist/bundle/chunks/{session-control-endpoint-EQXHX4WI.js → session-control-endpoint-OH7XV2FN.js} +1 -1
  20. package/dist/bundle/chunks/{session-picker-LIZG5P3Q.js → session-picker-UUSW6YSU.js} +1 -1
  21. package/dist/bundle/chunks/session-worker.js +31 -30
  22. package/dist/bundle/cli.js +1 -1
  23. package/dist/bundle/index.js +1 -1
  24. package/dist/bundle/rpc-entry.js +1 -1
  25. package/dist/bundle/runtime-manifest.json +1 -1
  26. package/dist/core/agent-session.d.ts +16 -0
  27. package/dist/core/agent-session.js +61 -0
  28. package/dist/core/engine-turn-limit.d.ts +36 -0
  29. package/dist/core/engine-turn-limit.js +74 -0
  30. package/dist/core/extensions/builtin/ask-user/format.d.ts +9 -4
  31. package/dist/core/extensions/builtin/ask-user/format.js +37 -9
  32. package/dist/core/extensions/builtin/ask-user/params.d.ts +2 -0
  33. package/dist/core/extensions/builtin/ask-user/params.js +6 -0
  34. package/dist/core/extensions/builtin/ask-user/resume.js +8 -1
  35. package/dist/core/extensions/builtin/ask-user/schema.js +4 -0
  36. package/dist/core/extensions/builtin/ask-user/tool.js +18 -7
  37. package/dist/core/extensions/builtin/hooks/index.js +1 -1
  38. package/dist/core/extensions/builtin/ttsr/follow-up-limit.d.ts +11 -0
  39. package/dist/core/extensions/builtin/ttsr/follow-up-limit.js +30 -0
  40. package/dist/core/extensions/builtin/ttsr/index.js +9 -1
  41. package/dist/core/extensions/runner.d.ts +2 -0
  42. package/dist/core/extensions/runner.js +4 -0
  43. package/dist/core/extensions/types.d.ts +2 -0
  44. package/dist/core/settings-manager.d.ts +9 -0
  45. package/dist/core/settings-manager.js +9 -0
  46. package/dist/modes/interactive/interactive-mode.js +1 -1
  47. package/docs/settings.md +9 -0
  48. package/package.json +6 -6
  49. package/dist/bundle/chunks/chunk-V43EN5GQ.js +0 -14
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,authGrantDigest,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsServiceTier,toJsonEvent,trackTurnAdmission,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-V43EN5GQ.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,currentPathPlatform,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,knownMove,knownPrefixKeys,listScheduledJobs,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,publishExclusive,publishReplace,readJsonFileAsync,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-XMHO4QQN.js";import{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,inheritSessionContextEntryId,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-KKJJVAVT.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-TUGQPBQG.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-4GPJOGXZ.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-KCVSSFOV.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clampThinkingSelection,classifyReasoningCapability,clientMessageIdentity,createFsWatchEventSource,formatThinkingClampWarning,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,readClientMessageIdentity,supportsMax,supportsXhigh}from"./chunk-TLK72OXY.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-HKRW6HT5.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-TJPMB4VH.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-MYVBK47X.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-QYKYTDMI.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-JMYO34RK.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-5AKP2VFB.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-LR5EN45D.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-G2XAU4BX.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-RRU5LXMS.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-VE3D74HN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-DOMETRRO.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-2JKDZXIY.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,exitAfterOutput,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,printThenExit,processBunRuntimeOptions}from"./chunk-5PB3SNZ7.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{Check,build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-I5HLTDT4.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-VYKBN4MR.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isOAuthRefreshUnavailableError,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-L4HVJWIF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path15,{windows}={})=>{let segs=path15.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse7=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open9=tokens[token.tokensIndex];open9.type="text",open9.value=literal,open9.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+open9.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse7(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open9={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open9),push(open9);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 after2=input[state.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse7.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse7(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync47,mkdirSync as mkdirSync28,readFileSync as readFileSync47,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm12}from"node:fs/promises";import{dirname as dirname50}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:reason==="error"&&isOAuthRefreshUnavailableError(error2)?[...partialMessage?.diagnostics??[],{type:OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,timestamp:Date.now(),details:{provider:model.provider}}]:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal2=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal2),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await result3(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await result3();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve47=>{let abortHandler=()=>resolve47(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((resolve47,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(()=>resolve47(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve47=>{signal.addEventListener("abort",()=>resolve47(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve47=>{resolvePromise=resolve47});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve47,reject)=>{resolveCompletion=resolve47,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
2
+ import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,authGrantDigest,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsServiceTier,toJsonEvent,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-Z72GD25U.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,currentPathPlatform,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,knownMove,knownPrefixKeys,listScheduledJobs,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,publishExclusive,publishReplace,readJsonFileAsync,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-XMHO4QQN.js";import{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,inheritSessionContextEntryId,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-4WZF7G6N.js";import{CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,ENGINE_TURN_LIMIT_ENTRY_TYPE,ENGINE_TURN_LIMIT_EVENT,ENGINE_TURN_START_ENTRY_TYPE,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,trackTurnAdmission,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-NTH33AXY.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-4GPJOGXZ.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-KCVSSFOV.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clampThinkingSelection,classifyReasoningCapability,clientMessageIdentity,createFsWatchEventSource,formatThinkingClampWarning,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,readClientMessageIdentity,supportsMax,supportsXhigh}from"./chunk-QQZREV6B.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-HKRW6HT5.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-TJPMB4VH.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-MYVBK47X.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-ZCYTYHDN.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-JMYO34RK.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-5AKP2VFB.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-LR5EN45D.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-G2XAU4BX.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-RRU5LXMS.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-VE3D74HN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-ZPJHS64R.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-2JKDZXIY.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,exitAfterOutput,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,printThenExit,processBunRuntimeOptions}from"./chunk-5PB3SNZ7.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{Check,build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-I5HLTDT4.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-VYKBN4MR.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isOAuthRefreshUnavailableError,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-L4HVJWIF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path15,{windows}={})=>{let segs=path15.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse7=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open9=tokens[token.tokensIndex];open9.type="text",open9.value=literal,open9.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+open9.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse7(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open9={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open9),push(open9);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 after2=input[state.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse7.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse7(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync47,mkdirSync as mkdirSync28,readFileSync as readFileSync47,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm12}from"node:fs/promises";import{dirname as dirname50}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:reason==="error"&&isOAuthRefreshUnavailableError(error2)?[...partialMessage?.diagnostics??[],{type:OAUTH_REFRESH_UNAVAILABLE_DIAGNOSTIC,timestamp:Date.now(),details:{provider:model.provider}}]:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal2=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal2),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await result3(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await result3();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve47=>{let abortHandler=()=>resolve47(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((resolve47,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(()=>resolve47(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve47=>{signal.addEventListener("abort",()=>resolve47(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve47=>{resolvePromise=resolve47});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve47,reject)=>{resolveCompletion=resolve47,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=`
@@ -682,11 +682,12 @@ ${lines.join(`
682
682
  ${instruction}`}var PROMPT_SURFACE_ENV_VAR="SENPI_PROMPT_SURFACE";function resolvePromptSurface(env){let value2=env[PROMPT_SURFACE_ENV_VAR];return value2==="app"||value2==="chat"?value2:"terminal"}function buildContextFilesSection(contextFiles){if(contextFiles.length===0)return"";let lines=["## Project Context","","Project instruction files (below, and in [Directory Context: ...] blocks injected during reads) bind files under their directory; deeper files win on conflict; explicit user instructions override.",""];for(let contextFile of contextFiles)lines.push(`### ${contextFile.path}`,"",contextFile.content.trimEnd(),"");return lines.join(`
683
683
  `).trimEnd()}function buildDynamicSystemPrompt(options){let tools=categorizeTools(options.selectedTools),toolSection=buildToolSection({tools,toolSnippets:options.toolSnippets,promptGuidelines:options.promptGuidelines}),surface=options.surface??"terminal",sections=options.corePrompt?[options.corePrompt({tools,toolSection,surface})]:[buildIdentitySection(),"",buildIntentGate({tools,surface}),"",buildWorkingTaskSection(),"",buildVerificationSection({surface}),"",toolSection,"",buildPoliciesSection(),"",buildHandoffSection({surface}),"",buildStyleSection({surface})],tuning=options.tuningSection?.trim();tuning&&sections.push("",tuning);let contextFilesSection=buildContextFilesSection(options.contextFiles);contextFilesSection&&sections.push("",contextFilesSection);let skillsSection=formatSkillsForPrompt(options.skills);return skillsSection&&sections.push(skillsSection),sections.push("",buildWorkstationSection({selectedTools:options.selectedTools,dialect:options.workstationDialect??"default"})),sections.join(`
684
684
  `)}import{existsSync as existsSync2,readFileSync as readFileSync4,writeFileSync as writeFileSync2}from"fs";import{basename as basename3,join as join5}from"path";function parseColor(color){let hexMatch=color.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(hexMatch)return{r:Number.parseInt(hexMatch[1],16),g:Number.parseInt(hexMatch[2],16),b:Number.parseInt(hexMatch[3],16)};let rgbMatch=color.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);if(rgbMatch)return{r:Number.parseInt(rgbMatch[1],10),g:Number.parseInt(rgbMatch[2],10),b:Number.parseInt(rgbMatch[3],10)}}function getLuminance(r,g,b){let toLinear=c=>{let s=c/255;return s<=.03928?s/12.92:((s+.055)/1.055)**2.4};return .2126*toLinear(r)+.7152*toLinear(g)+.0722*toLinear(b)}function adjustBrightness(color,factor){let parsed=parseColor(color);if(!parsed)return color;let adjust=c=>Math.min(255,Math.max(0,Math.round(c*factor)));return`rgb(${adjust(parsed.r)}, ${adjust(parsed.g)}, ${adjust(parsed.b)})`}function deriveExportColors(baseColor){let parsed=parseColor(baseColor);return parsed?getLuminance(parsed.r,parsed.g,parsed.b)>.5?{pageBg:adjustBrightness(baseColor,.96),cardBg:baseColor,infoBg:`rgb(${Math.min(255,parsed.r+10)}, ${Math.min(255,parsed.g+5)}, ${Math.max(0,parsed.b-20)})`}:{pageBg:adjustBrightness(baseColor,.7),cardBg:adjustBrightness(baseColor,.85),infoBg:`rgb(${Math.min(255,parsed.r+20)}, ${Math.min(255,parsed.g+15)}, ${parsed.b})`}:{pageBg:"rgb(24, 24, 30)",cardBg:"rgb(30, 30, 36)",infoBg:"rgb(60, 55, 40)"}}function generateThemeVars(themeName){let colors=getResolvedThemeColors(themeName),lines=[];for(let[key,value2]of Object.entries(colors))lines.push(`--${key}: ${value2};`);let themeExport=getThemeExportColors(themeName),userMessageBg=colors.userMessageBg||"#343541",derivedColors=deriveExportColors(userMessageBg);return lines.push(`--exportPageBg: ${themeExport.pageBg??derivedColors.pageBg};`),lines.push(`--exportCardBg: ${themeExport.cardBg??derivedColors.cardBg};`),lines.push(`--exportInfoBg: ${themeExport.infoBg??derivedColors.infoBg};`),lines.join(`
685
- `)}function generateHtml(sessionData,themeName){let templateDir=getExportTemplateDir(),template=readFileSync4(join5(templateDir,"template.html"),"utf-8"),templateCss=readFileSync4(join5(templateDir,"template.css"),"utf-8"),templateJs=readFileSync4(join5(templateDir,"template.js"),"utf-8"),markedJs=readFileSync4(join5(templateDir,"vendor","marked.min.js"),"utf-8"),hljsJs=readFileSync4(join5(templateDir,"vendor","highlight.min.js"),"utf-8"),themeVars=generateThemeVars(themeName),colors=getResolvedThemeColors(themeName),themeExport=getThemeExportColors(themeName),derivedExportColors=deriveExportColors(colors.userMessageBg||"#343541"),bodyBg=themeExport.pageBg??derivedExportColors.pageBg,containerBg=themeExport.cardBg??derivedExportColors.cardBg,infoBg=themeExport.infoBg??derivedExportColors.infoBg,sessionDataBase64=Buffer.from(JSON.stringify(sessionData)).toString("base64"),css=templateCss.replace("{{THEME_VARS}}",themeVars).replace("{{BODY_BG}}",bodyBg).replace("{{CONTAINER_BG}}",containerBg).replace("{{INFO_BG}}",infoBg);return template.replace("{{CSS}}",css).replace("{{JS}}",templateJs).replace("{{SESSION_DATA}}",sessionDataBase64).replace("{{MARKED_JS}}",markedJs).replace("{{HIGHLIGHT_JS}}",hljsJs)}var TEMPLATE_RENDERED_TOOLS=new Set(["bash","read","write","edit","ls"]);function preRenderCustomTools(entries,toolRenderer){let renderedTools={};for(let entry of entries){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="assistant"&&Array.isArray(msg.content)){for(let block of msg.content)if(block.type==="toolCall"&&!TEMPLATE_RENDERED_TOOLS.has(block.name)){let callHtml=toolRenderer.renderCall(block.id,block.name,block.arguments);callHtml&&(renderedTools[block.id]={callHtml})}}if(msg.role==="toolResult"&&msg.toolCallId){let toolName=msg.toolName||"",existing=renderedTools[msg.toolCallId];if(existing||!TEMPLATE_RENDERED_TOOLS.has(toolName)){let rendered=toolRenderer.renderResult(msg.toolCallId,toolName,msg.content,msg.details,msg.isError||!1);rendered&&(renderedTools[msg.toolCallId]={...existing,resultHtmlCollapsed:rendered.collapsed,resultHtmlExpanded:rendered.expanded})}}}return renderedTools}async function exportSessionToHtml(sm,state,options){let opts=typeof options=="string"?{outputPath:options}:options||{},sessionFile=sm.getSessionFile();if(!sessionFile)throw new Error("Cannot export in-memory session to HTML");if(!existsSync2(sessionFile))throw new Error("Nothing to export yet - start a conversation first");let entries=sm.getEntries(),renderedTools;opts.toolRenderer&&(renderedTools=preRenderCustomTools(entries,opts.toolRenderer),Object.keys(renderedTools).length===0&&(renderedTools=void 0));let sessionData={header:sm.getHeader(),entries,leafId:sm.getLeafId(),systemPrompt:state?.systemPrompt,tools:state?.tools?.map(t=>({name:t.name,description:t.description,parameters:t.parameters})),renderedTools},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(outputPath)outputPath=expandTildePath(outputPath);else{let sessionBasename=basename3(sessionFile,".jsonl");outputPath=`${APP_NAME}-session-${sessionBasename}.html`}return writeFileSync2(outputPath,html,"utf8"),outputPath}async function exportFromFile(inputPath,options){let opts=typeof options=="string"?{outputPath:options}:options||{},resolvedInputPath=resolvePath(inputPath);if(!existsSync2(resolvedInputPath))throw new Error(`File not found: ${resolvedInputPath}`);let sm=SessionManager.open(resolvedInputPath),sessionData={header:sm.getHeader(),entries:sm.getEntries(),leafId:sm.getLeafId(),systemPrompt:void 0,tools:void 0},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(outputPath)outputPath=expandTildePath(outputPath);else{let inputBasename=basename3(resolvedInputPath,".jsonl");outputPath=`${APP_NAME}-session-${inputBasename}.html`}return writeFileSync2(outputPath,html,"utf8"),outputPath}var ANSI_COLORS=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];function color256ToHex(index){if(index<16)return ANSI_COLORS[index];if(index<232){let cubeIndex=index-16,r=Math.floor(cubeIndex/36),g=Math.floor(cubeIndex%36/6),b=cubeIndex%6,toComponent=n=>n===0?0:55+n*40,toHex=n=>toComponent(n).toString(16).padStart(2,"0");return`#${toHex(r)}${toHex(g)}${toHex(b)}`}let grayHex=(8+(index-232)*10).toString(16).padStart(2,"0");return`#${grayHex}${grayHex}${grayHex}`}function escapeHtml(text2){return text2.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function createEmptyStyle(){return{fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1}}function styleToInlineCSS(style){let parts=[];return style.fg&&parts.push(`color:${style.fg}`),style.bg&&parts.push(`background-color:${style.bg}`),style.bold&&parts.push("font-weight:bold"),style.dim&&parts.push("opacity:0.6"),style.italic&&parts.push("font-style:italic"),style.underline&&parts.push("text-decoration:underline"),parts.join(";")}function hasStyle(style){return style.fg!==null||style.bg!==null||style.bold||style.dim||style.italic||style.underline}function applySgrCode(params,style){let i=0;for(;i<params.length;){let code=params[i];if(code===0)style.fg=null,style.bg=null,style.bold=!1,style.dim=!1,style.italic=!1,style.underline=!1;else if(code===1)style.bold=!0;else if(code===2)style.dim=!0;else if(code===3)style.italic=!0;else if(code===4)style.underline=!0;else if(code===22)style.bold=!1,style.dim=!1;else if(code===23)style.italic=!1;else if(code===24)style.underline=!1;else if(code>=30&&code<=37)style.fg=ANSI_COLORS[code-30];else if(code===38){if(params[i+1]===5&&params.length>i+2)style.fg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g=params[i+3],b=params[i+4];style.fg=`rgb(${r},${g},${b})`,i+=4}}else if(code===39)style.fg=null;else if(code>=40&&code<=47)style.bg=ANSI_COLORS[code-40];else if(code===48){if(params[i+1]===5&&params.length>i+2)style.bg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g=params[i+3],b=params[i+4];style.bg=`rgb(${r},${g},${b})`,i+=4}}else code===49?style.bg=null:code>=90&&code<=97?style.fg=ANSI_COLORS[code-90+8]:code>=100&&code<=107&&(style.bg=ANSI_COLORS[code-100+8]);i++}}var ANSI_REGEX=/\x1b\[([\d;]*)m/g;function ansiToHtml(text2){let style=createEmptyStyle(),result3="",lastIndex=0,inSpan=!1;ANSI_REGEX.lastIndex=0;let match=ANSI_REGEX.exec(text2);for(;match!==null;){let beforeText=text2.slice(lastIndex,match.index);beforeText&&(result3+=escapeHtml(beforeText));let paramStr=match[1],params=paramStr?paramStr.split(";").map(p=>parseInt(p,10)||0):[0];inSpan&&(result3+="</span>",inSpan=!1),applySgrCode(params,style),hasStyle(style)&&(result3+=`<span style="${styleToInlineCSS(style)}">`,inSpan=!0),lastIndex=match.index+match[0].length,match=ANSI_REGEX.exec(text2)}let remainingText=text2.slice(lastIndex);return remainingText&&(result3+=escapeHtml(remainingText)),inSpan&&(result3+="</span>"),result3}function ansiLinesToHtml(lines){return lines.map(line=>`<div class="ansi-line">${ansiToHtml(line)||"&nbsp;"}</div>`).join("")}var ANSI_ESCAPE_REGEX=/\x1b\[[\d;]*m/g;function isBlankRenderedLine(line){return line.replace(ANSI_ESCAPE_REGEX,"").trim().length===0}function trimRenderedResultLines(lines){let start=0,end=lines.length;for(;start<end&&isBlankRenderedLine(lines[start]);)start++;for(;end>start&&isBlankRenderedLine(lines[end-1]);)end--;return lines.slice(start,end)}function createToolHtmlRenderer(deps){let{getToolDefinition,theme:theme2,cwd,width=100}=deps,renderedCallComponents=new Map,renderedResultComponents=new Map,renderedStates=new Map,renderedArgs=new Map,getState2=toolCallId=>{let state=renderedStates.get(toolCallId);return state||(state={},renderedStates.set(toolCallId,state)),state},createRenderContext=(toolCallId,lastComponent,expanded,isPartial,isError)=>({args:renderedArgs.get(toolCallId),toolCallId,invalidate:()=>{},lastComponent,state:getState2(toolCallId),cwd,executionStarted:!0,argsComplete:!0,isPartial,expanded,showImages:!1,isError});return{renderCall(toolCallId,toolName,args){try{renderedArgs.set(toolCallId,args);let toolDef=getToolDefinition(toolName);if(!toolDef?.renderCall)return;let component=toolDef.renderCall(args,theme2,createRenderContext(toolCallId,renderedCallComponents.get(toolCallId),!1,!0,!1));renderedCallComponents.set(toolCallId,component);let lines=component.render(width);return ansiLinesToHtml(lines)}catch{return}},renderResult(toolCallId,toolName,result3,details,isError){try{let toolDef=getToolDefinition(toolName);if(!toolDef?.renderResult)return;let agentToolResult={content:result3,details,isError},collapsedComponent=toolDef.renderResult(agentToolResult,{expanded:!1,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!1,!1,isError));renderedResultComponents.set(toolCallId,collapsedComponent);let collapsed=ansiLinesToHtml(trimRenderedResultLines(collapsedComponent.render(width))),expandedComponent=toolDef.renderResult(agentToolResult,{expanded:!0,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!0,!1,isError));renderedResultComponents.set(toolCallId,expandedComponent);let expanded=ansiLinesToHtml(trimRenderedResultLines(expandedComponent.render(width)));return{...collapsed&&collapsed!==expanded?{collapsed}:{},expanded}}catch{return}}}}var CODEX_OPTION=typebox_exports.Object({label:typebox_exports.String({description:"User-facing label (1-5 words)."}),description:typebox_exports.String({description:"One short sentence explaining impact/tradeoff if selected."})},{additionalProperties:!1}),CODEX_QUESTION=typebox_exports.Object({id:typebox_exports.String({pattern:"^[a-z][a-z0-9]*(_[a-z0-9]+)*$",description:"Stable identifier for mapping answers (snake_case)."}),header:typebox_exports.String({minLength:1,maxLength:12,description:"Short header label shown in the UI (12 or fewer chars)."}),question:typebox_exports.String({minLength:1,description:"Single-sentence prompt shown to the user."}),options:typebox_exports.Array(CODEX_OPTION,{minItems:2,maxItems:3,description:'Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with "(Recommended)". Do not include an "Other" option in this list; the client will add a free-form "Other" option automatically.'}),multiSelect:typebox_exports.Optional(typebox_exports.Boolean({description:"Set to true to allow the user to select multiple options instead of just one."}))},{additionalProperties:!1}),CODEX_PARAMS=typebox_exports.Object({questions:typebox_exports.Array(CODEX_QUESTION,{minItems:1,maxItems:3,description:"Questions to show the user. Prefer 1 and do not exceed 3"}),wait_for_answer:typebox_exports.Boolean({description:"Set true to pause here until the user answers; set false to keep working and receive the answer later as a user message."})},{additionalProperties:!1}),CLAUDE_OPTION=typebox_exports.Object({label:typebox_exports.String({description:"The display text for this option that the user will see and select. Should be concise (1-5 words) and clearly describe the choice."}),description:typebox_exports.Optional(typebox_exports.String({description:"Explanation of what this option means or what will happen if chosen. Useful for providing context about trade-offs or implications."}))}),CLAUDE_QUESTION=typebox_exports.Object({question:typebox_exports.String({minLength:1,description:'The complete question to ask the user. Should be clear, specific, and end with a question mark. Example: "Which library should we use for date formatting?" If multiSelect is true, phrase it accordingly, e.g. "Which features do you want to enable?"'}),header:typebox_exports.String({minLength:1,maxLength:12,description:'Very short label displayed as a chip/tag (max 12 chars). Examples: "Auth method", "Library", "Approach".'}),options:typebox_exports.Optional(typebox_exports.Array(CLAUDE_OPTION,{minItems:2,maxItems:4,description:"The available choices for this question. Must have 2-4 options. Each option should be a distinct, mutually exclusive choice (unless multiSelect is enabled). There should be no Other option, that will be provided automatically."})),multiSelect:typebox_exports.Boolean({description:"Set to true to allow the user to select multiple options instead of just one. Use when choices are not mutually exclusive."})}),CLAUDE_PARAMS=typebox_exports.Object({questions:typebox_exports.Array(CLAUDE_QUESTION,{minItems:1,maxItems:4,description:"Questions to ask the user (1-4 questions)"}),waitForAnswer:typebox_exports.Boolean({description:"Set true to pause here until the user answers; set false to keep working and receive the answer later as a user message."})});var WAIT_FLAG_STEER_TEXT="This call omitted wait_for_answer (or waitForAnswer). Set true to pause here until the user answers, false to keep working and receive the answer later as a user message.",DEFAULT_ASK_USER_TIMEOUT_MS=1800*1e3,HEADER_MAX=12,SNAKE_CASE=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,LIMITS={codex:{maxQuestions:3,minOptions:2,maxOptions:3,optionsRequired:!0},claude:{maxQuestions:4,minOptions:2,maxOptions:4,optionsRequired:!1}},AskUserSchemaError=class extends Error{constructor(message){super(message),this.name="AskUserSchemaError"}};function isRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function readWaitFlag(variant,args){let value2=args[variant==="codex"?"wait_for_answer":"waitForAnswer"];if(typeof value2!="boolean")throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);return value2}function parseOptions(raw,min,max,required,requireDescription){if(raw===void 0){if(required)throw new AskUserSchemaError(`options must contain ${min} to ${max} items`);return[]}if(!Array.isArray(raw))throw new AskUserSchemaError("options must be an array");if(raw.length<min||raw.length>max)throw new AskUserSchemaError(required?`options must contain ${min} to ${max} items`:`options must contain ${min} to ${max} items when present`);let options=[];for(let item of raw){if(!isRecord3(item))throw new AskUserSchemaError("each option must be an object");let label3=typeof item.label=="string"?item.label.trim():"";if(label3.length===0)throw new AskUserSchemaError("option label must be non-empty");let description=typeof item.description=="string"?item.description.trim():void 0;if(requireDescription&&(description===void 0||description.length===0))throw new AskUserSchemaError("option description is required");options.push(description===void 0||description.length===0?{label:label3}:{label:label3,description})}return options}function parseQuestion(variant,raw,index){if(!isRecord3(raw))throw new AskUserSchemaError("each question must be an object");let limits=LIMITS[variant],header2=typeof raw.header=="string"?raw.header.trim():"";if(header2.length===0)throw new AskUserSchemaError("header must be non-empty");if(header2.length>HEADER_MAX)throw new AskUserSchemaError("header must be 12 or fewer characters");let question=typeof raw.question=="string"?raw.question.trim():"";if(question.length===0)throw new AskUserSchemaError("question must be non-empty");let options=parseOptions(raw.options,limits.minOptions,limits.maxOptions,limits.optionsRequired,variant==="codex"),id;if(variant==="claude")id=`q${index+1}`;else if(id=typeof raw.id=="string"?raw.id.trim():"",!SNAKE_CASE.test(id))throw new AskUserSchemaError("id must be snake_case");let multiSelect;if(variant==="claude"){if(typeof raw.multiSelect!="boolean")throw new AskUserSchemaError("multiSelect is required");multiSelect=raw.multiSelect}else multiSelect=raw.multiSelect===!0;return{id,header:header2,question,options,multiSelect}}function toCanonical(variant,args,options){if(!isRecord3(args))throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);let waitForAnswer=readWaitFlag(variant,args),limits=LIMITS[variant];if(!Array.isArray(args.questions)||args.questions.length<1||args.questions.length>limits.maxQuestions)throw new AskUserSchemaError(`questions must contain 1 to ${limits.maxQuestions} items`);return{requestId:options?.requestId??crypto.randomUUID(),questions:args.questions.map((question,index)=>parseQuestion(variant,question,index)),waitForAnswer,timeoutMs:options?.timeoutMs??DEFAULT_ASK_USER_TIMEOUT_MS}}var INLINE_WORDS={comment:text2=>text2,typed:(_header,text2)=>text2},reference=label3=>`(see [${label3}] below)`;function separatedWords(requestId){let words4=[],place=(base,text2)=>{let taken=words4.filter(word=>word.label===base||word.label.startsWith(`${base} (`)).length,label3=taken===0?base:`${base} (${taken+1})`;return words4.push({label:label3,text:text2}),reference(label3)};return{words:words4,comment:text2=>place(`The user's comment for question ${requestId}`,text2),typed:(header2,text2)=>place(`The user's answer to ${header2} for question ${requestId}`,text2)}}function resolveUserWordReferences(text2,words4){return words4.reduce((resolved,word)=>resolved.split(reference(word.label)).join(word.text),text2)}function readUserWordBlocks(content){let texts=content.flatMap(block=>block.type==="text"?[block.text]:[]);if(texts.length%2!==0)return;let words4=[];for(let index=0;index<texts.length;index+=2){let label3=/^\[(.+)\]$/s.exec(texts[index]??"")?.[1],text2=texts[index+1];if(label3===void 0||text2===void 0)return;words4.push({label:label3,text:text2})}return words4}function headerFor(id,questions){return questions.find(question=>question.id===id)?.header??id}function questionTextFor(id,questions){return questions.find(question=>question.id===id)?.question??id}function typedText(answer2){if(answer2.selected.length>0)return;let text2=answer2.text?.trim();return text2===void 0||text2.length===0?void 0:text2}function answerBody(answer2,header2,words4=INLINE_WORDS,offered=[]){if(!answer2)return;if(answer2.selected.length>0)return answer2.selected.join(", ");let text2=typedText(answer2);if(text2!==void 0)return offered.some(option=>option.label===text2)?text2:words4.typed(header2,text2)}function answeredLines(response,questions,words4){let lines=[],seen=new Set;for(let question of questions){let body=answerBody(response.answers[question.id],question.header,words4,question.options);body!==void 0&&(lines.push(`${question.header}: ${body}`),seen.add(question.id))}for(let[id,answer2]of Object.entries(response.answers)){if(seen.has(id))continue;let header2=headerFor(id,questions),body=answerBody(answer2,header2,words4);body!==void 0&&lines.push(`${header2}: ${body}`)}return lines}function formatBody(response,questions,words4){switch(response.status){case"answered":{let lines=answeredLines(response,questions,words4),unanswered=response.unanswered.map(id=>headerFor(id,questions));return unanswered.length>0&&lines.push(`Unanswered: ${unanswered.join(", ")}`),lines.join(`
685
+ `)}function generateHtml(sessionData,themeName){let templateDir=getExportTemplateDir(),template=readFileSync4(join5(templateDir,"template.html"),"utf-8"),templateCss=readFileSync4(join5(templateDir,"template.css"),"utf-8"),templateJs=readFileSync4(join5(templateDir,"template.js"),"utf-8"),markedJs=readFileSync4(join5(templateDir,"vendor","marked.min.js"),"utf-8"),hljsJs=readFileSync4(join5(templateDir,"vendor","highlight.min.js"),"utf-8"),themeVars=generateThemeVars(themeName),colors=getResolvedThemeColors(themeName),themeExport=getThemeExportColors(themeName),derivedExportColors=deriveExportColors(colors.userMessageBg||"#343541"),bodyBg=themeExport.pageBg??derivedExportColors.pageBg,containerBg=themeExport.cardBg??derivedExportColors.cardBg,infoBg=themeExport.infoBg??derivedExportColors.infoBg,sessionDataBase64=Buffer.from(JSON.stringify(sessionData)).toString("base64"),css=templateCss.replace("{{THEME_VARS}}",themeVars).replace("{{BODY_BG}}",bodyBg).replace("{{CONTAINER_BG}}",containerBg).replace("{{INFO_BG}}",infoBg);return template.replace("{{CSS}}",css).replace("{{JS}}",templateJs).replace("{{SESSION_DATA}}",sessionDataBase64).replace("{{MARKED_JS}}",markedJs).replace("{{HIGHLIGHT_JS}}",hljsJs)}var TEMPLATE_RENDERED_TOOLS=new Set(["bash","read","write","edit","ls"]);function preRenderCustomTools(entries,toolRenderer){let renderedTools={};for(let entry of entries){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="assistant"&&Array.isArray(msg.content)){for(let block of msg.content)if(block.type==="toolCall"&&!TEMPLATE_RENDERED_TOOLS.has(block.name)){let callHtml=toolRenderer.renderCall(block.id,block.name,block.arguments);callHtml&&(renderedTools[block.id]={callHtml})}}if(msg.role==="toolResult"&&msg.toolCallId){let toolName=msg.toolName||"",existing=renderedTools[msg.toolCallId];if(existing||!TEMPLATE_RENDERED_TOOLS.has(toolName)){let rendered=toolRenderer.renderResult(msg.toolCallId,toolName,msg.content,msg.details,msg.isError||!1);rendered&&(renderedTools[msg.toolCallId]={...existing,resultHtmlCollapsed:rendered.collapsed,resultHtmlExpanded:rendered.expanded})}}}return renderedTools}async function exportSessionToHtml(sm,state,options){let opts=typeof options=="string"?{outputPath:options}:options||{},sessionFile=sm.getSessionFile();if(!sessionFile)throw new Error("Cannot export in-memory session to HTML");if(!existsSync2(sessionFile))throw new Error("Nothing to export yet - start a conversation first");let entries=sm.getEntries(),renderedTools;opts.toolRenderer&&(renderedTools=preRenderCustomTools(entries,opts.toolRenderer),Object.keys(renderedTools).length===0&&(renderedTools=void 0));let sessionData={header:sm.getHeader(),entries,leafId:sm.getLeafId(),systemPrompt:state?.systemPrompt,tools:state?.tools?.map(t=>({name:t.name,description:t.description,parameters:t.parameters})),renderedTools},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(outputPath)outputPath=expandTildePath(outputPath);else{let sessionBasename=basename3(sessionFile,".jsonl");outputPath=`${APP_NAME}-session-${sessionBasename}.html`}return writeFileSync2(outputPath,html,"utf8"),outputPath}async function exportFromFile(inputPath,options){let opts=typeof options=="string"?{outputPath:options}:options||{},resolvedInputPath=resolvePath(inputPath);if(!existsSync2(resolvedInputPath))throw new Error(`File not found: ${resolvedInputPath}`);let sm=SessionManager.open(resolvedInputPath),sessionData={header:sm.getHeader(),entries:sm.getEntries(),leafId:sm.getLeafId(),systemPrompt:void 0,tools:void 0},html=generateHtml(sessionData,opts.themeName),outputPath=opts.outputPath?normalizePath(opts.outputPath):void 0;if(outputPath)outputPath=expandTildePath(outputPath);else{let inputBasename=basename3(resolvedInputPath,".jsonl");outputPath=`${APP_NAME}-session-${inputBasename}.html`}return writeFileSync2(outputPath,html,"utf8"),outputPath}var ANSI_COLORS=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"];function color256ToHex(index){if(index<16)return ANSI_COLORS[index];if(index<232){let cubeIndex=index-16,r=Math.floor(cubeIndex/36),g=Math.floor(cubeIndex%36/6),b=cubeIndex%6,toComponent=n=>n===0?0:55+n*40,toHex=n=>toComponent(n).toString(16).padStart(2,"0");return`#${toHex(r)}${toHex(g)}${toHex(b)}`}let grayHex=(8+(index-232)*10).toString(16).padStart(2,"0");return`#${grayHex}${grayHex}${grayHex}`}function escapeHtml(text2){return text2.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function createEmptyStyle(){return{fg:null,bg:null,bold:!1,dim:!1,italic:!1,underline:!1}}function styleToInlineCSS(style){let parts=[];return style.fg&&parts.push(`color:${style.fg}`),style.bg&&parts.push(`background-color:${style.bg}`),style.bold&&parts.push("font-weight:bold"),style.dim&&parts.push("opacity:0.6"),style.italic&&parts.push("font-style:italic"),style.underline&&parts.push("text-decoration:underline"),parts.join(";")}function hasStyle(style){return style.fg!==null||style.bg!==null||style.bold||style.dim||style.italic||style.underline}function applySgrCode(params,style){let i=0;for(;i<params.length;){let code=params[i];if(code===0)style.fg=null,style.bg=null,style.bold=!1,style.dim=!1,style.italic=!1,style.underline=!1;else if(code===1)style.bold=!0;else if(code===2)style.dim=!0;else if(code===3)style.italic=!0;else if(code===4)style.underline=!0;else if(code===22)style.bold=!1,style.dim=!1;else if(code===23)style.italic=!1;else if(code===24)style.underline=!1;else if(code>=30&&code<=37)style.fg=ANSI_COLORS[code-30];else if(code===38){if(params[i+1]===5&&params.length>i+2)style.fg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g=params[i+3],b=params[i+4];style.fg=`rgb(${r},${g},${b})`,i+=4}}else if(code===39)style.fg=null;else if(code>=40&&code<=47)style.bg=ANSI_COLORS[code-40];else if(code===48){if(params[i+1]===5&&params.length>i+2)style.bg=color256ToHex(params[i+2]),i+=2;else if(params[i+1]===2&&params.length>i+4){let r=params[i+2],g=params[i+3],b=params[i+4];style.bg=`rgb(${r},${g},${b})`,i+=4}}else code===49?style.bg=null:code>=90&&code<=97?style.fg=ANSI_COLORS[code-90+8]:code>=100&&code<=107&&(style.bg=ANSI_COLORS[code-100+8]);i++}}var ANSI_REGEX=/\x1b\[([\d;]*)m/g;function ansiToHtml(text2){let style=createEmptyStyle(),result3="",lastIndex=0,inSpan=!1;ANSI_REGEX.lastIndex=0;let match=ANSI_REGEX.exec(text2);for(;match!==null;){let beforeText=text2.slice(lastIndex,match.index);beforeText&&(result3+=escapeHtml(beforeText));let paramStr=match[1],params=paramStr?paramStr.split(";").map(p=>parseInt(p,10)||0):[0];inSpan&&(result3+="</span>",inSpan=!1),applySgrCode(params,style),hasStyle(style)&&(result3+=`<span style="${styleToInlineCSS(style)}">`,inSpan=!0),lastIndex=match.index+match[0].length,match=ANSI_REGEX.exec(text2)}let remainingText=text2.slice(lastIndex);return remainingText&&(result3+=escapeHtml(remainingText)),inSpan&&(result3+="</span>"),result3}function ansiLinesToHtml(lines){return lines.map(line=>`<div class="ansi-line">${ansiToHtml(line)||"&nbsp;"}</div>`).join("")}var ANSI_ESCAPE_REGEX=/\x1b\[[\d;]*m/g;function isBlankRenderedLine(line){return line.replace(ANSI_ESCAPE_REGEX,"").trim().length===0}function trimRenderedResultLines(lines){let start=0,end=lines.length;for(;start<end&&isBlankRenderedLine(lines[start]);)start++;for(;end>start&&isBlankRenderedLine(lines[end-1]);)end--;return lines.slice(start,end)}function createToolHtmlRenderer(deps){let{getToolDefinition,theme:theme2,cwd,width=100}=deps,renderedCallComponents=new Map,renderedResultComponents=new Map,renderedStates=new Map,renderedArgs=new Map,getState2=toolCallId=>{let state=renderedStates.get(toolCallId);return state||(state={},renderedStates.set(toolCallId,state)),state},createRenderContext=(toolCallId,lastComponent,expanded,isPartial,isError)=>({args:renderedArgs.get(toolCallId),toolCallId,invalidate:()=>{},lastComponent,state:getState2(toolCallId),cwd,executionStarted:!0,argsComplete:!0,isPartial,expanded,showImages:!1,isError});return{renderCall(toolCallId,toolName,args){try{renderedArgs.set(toolCallId,args);let toolDef=getToolDefinition(toolName);if(!toolDef?.renderCall)return;let component=toolDef.renderCall(args,theme2,createRenderContext(toolCallId,renderedCallComponents.get(toolCallId),!1,!0,!1));renderedCallComponents.set(toolCallId,component);let lines=component.render(width);return ansiLinesToHtml(lines)}catch{return}},renderResult(toolCallId,toolName,result3,details,isError){try{let toolDef=getToolDefinition(toolName);if(!toolDef?.renderResult)return;let agentToolResult={content:result3,details,isError},collapsedComponent=toolDef.renderResult(agentToolResult,{expanded:!1,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!1,!1,isError));renderedResultComponents.set(toolCallId,collapsedComponent);let collapsed=ansiLinesToHtml(trimRenderedResultLines(collapsedComponent.render(width))),expandedComponent=toolDef.renderResult(agentToolResult,{expanded:!0,isPartial:!1},theme2,createRenderContext(toolCallId,renderedResultComponents.get(toolCallId),!0,!1,isError));renderedResultComponents.set(toolCallId,expandedComponent);let expanded=ansiLinesToHtml(trimRenderedResultLines(expandedComponent.render(width)));return{...collapsed&&collapsed!==expanded?{collapsed}:{},expanded}}catch{return}}}}var CODEX_OPTION=typebox_exports.Object({label:typebox_exports.String({description:"User-facing label (1-5 words)."}),description:typebox_exports.String({description:"One short sentence explaining impact/tradeoff if selected."})},{additionalProperties:!1}),CODEX_QUESTION=typebox_exports.Object({id:typebox_exports.String({pattern:"^[a-z][a-z0-9]*(_[a-z0-9]+)*$",description:"Stable identifier for mapping answers (snake_case)."}),header:typebox_exports.String({minLength:1,maxLength:12,description:"Short header label shown in the UI (12 or fewer chars)."}),question:typebox_exports.String({minLength:1,description:"Single-sentence prompt shown to the user."}),options:typebox_exports.Array(CODEX_OPTION,{minItems:2,maxItems:3,description:'Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with "(Recommended)". Do not include an "Other" option in this list; the client will add a free-form "Other" option automatically.'}),multiSelect:typebox_exports.Optional(typebox_exports.Boolean({description:"Set to true to allow the user to select multiple options instead of just one."}))},{additionalProperties:!1}),CODEX_PARAMS=typebox_exports.Object({questions:typebox_exports.Array(CODEX_QUESTION,{minItems:1,maxItems:3,description:"Questions to show the user. Prefer 1 and do not exceed 3"}),wait_for_answer:typebox_exports.Boolean({description:"Set true to pause here until the user answers; set false to keep working and receive the answer later as a user message."}),required:typebox_exports.Optional(typebox_exports.Boolean({description:"Set true when the answer decides whether you take an action (for example, which of two irreversible paths to take, or whether to proceed): with no answer, that action is not taken."}))},{additionalProperties:!1}),CLAUDE_OPTION=typebox_exports.Object({label:typebox_exports.String({description:"The display text for this option that the user will see and select. Should be concise (1-5 words) and clearly describe the choice."}),description:typebox_exports.Optional(typebox_exports.String({description:"Explanation of what this option means or what will happen if chosen. Useful for providing context about trade-offs or implications."}))}),CLAUDE_QUESTION=typebox_exports.Object({question:typebox_exports.String({minLength:1,description:'The complete question to ask the user. Should be clear, specific, and end with a question mark. Example: "Which library should we use for date formatting?" If multiSelect is true, phrase it accordingly, e.g. "Which features do you want to enable?"'}),header:typebox_exports.String({minLength:1,maxLength:12,description:'Very short label displayed as a chip/tag (max 12 chars). Examples: "Auth method", "Library", "Approach".'}),options:typebox_exports.Optional(typebox_exports.Array(CLAUDE_OPTION,{minItems:2,maxItems:4,description:"The available choices for this question. Must have 2-4 options. Each option should be a distinct, mutually exclusive choice (unless multiSelect is enabled). There should be no Other option, that will be provided automatically."})),multiSelect:typebox_exports.Boolean({description:"Set to true to allow the user to select multiple options instead of just one. Use when choices are not mutually exclusive."})}),CLAUDE_PARAMS=typebox_exports.Object({questions:typebox_exports.Array(CLAUDE_QUESTION,{minItems:1,maxItems:4,description:"Questions to ask the user (1-4 questions)"}),waitForAnswer:typebox_exports.Boolean({description:"Set true to pause here until the user answers; set false to keep working and receive the answer later as a user message."}),required:typebox_exports.Optional(typebox_exports.Boolean({description:"Set true when the answer decides whether you take an action (for example, which of two irreversible paths to take, or whether to proceed): with no answer, that action is not taken."}))});var WAIT_FLAG_STEER_TEXT="This call omitted wait_for_answer (or waitForAnswer). Set true to pause here until the user answers, false to keep working and receive the answer later as a user message.",DEFAULT_ASK_USER_TIMEOUT_MS=1800*1e3,HEADER_MAX=12,SNAKE_CASE=/^[a-z][a-z0-9]*(_[a-z0-9]+)*$/,LIMITS={codex:{maxQuestions:3,minOptions:2,maxOptions:3,optionsRequired:!0},claude:{maxQuestions:4,minOptions:2,maxOptions:4,optionsRequired:!1}},AskUserSchemaError=class extends Error{constructor(message){super(message),this.name="AskUserSchemaError"}};function isRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function readWaitFlag(variant,args){let value2=args[variant==="codex"?"wait_for_answer":"waitForAnswer"];if(typeof value2!="boolean")throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);return value2}function parseOptions(raw,min,max,required,requireDescription){if(raw===void 0){if(required)throw new AskUserSchemaError(`options must contain ${min} to ${max} items`);return[]}if(!Array.isArray(raw))throw new AskUserSchemaError("options must be an array");if(raw.length<min||raw.length>max)throw new AskUserSchemaError(required?`options must contain ${min} to ${max} items`:`options must contain ${min} to ${max} items when present`);let options=[];for(let item of raw){if(!isRecord3(item))throw new AskUserSchemaError("each option must be an object");let label3=typeof item.label=="string"?item.label.trim():"";if(label3.length===0)throw new AskUserSchemaError("option label must be non-empty");let description=typeof item.description=="string"?item.description.trim():void 0;if(requireDescription&&(description===void 0||description.length===0))throw new AskUserSchemaError("option description is required");options.push(description===void 0||description.length===0?{label:label3}:{label:label3,description})}return options}function parseQuestion(variant,raw,index){if(!isRecord3(raw))throw new AskUserSchemaError("each question must be an object");let limits=LIMITS[variant],header2=typeof raw.header=="string"?raw.header.trim():"";if(header2.length===0)throw new AskUserSchemaError("header must be non-empty");if(header2.length>HEADER_MAX)throw new AskUserSchemaError("header must be 12 or fewer characters");let question=typeof raw.question=="string"?raw.question.trim():"";if(question.length===0)throw new AskUserSchemaError("question must be non-empty");let options=parseOptions(raw.options,limits.minOptions,limits.maxOptions,limits.optionsRequired,variant==="codex"),id;if(variant==="claude")id=`q${index+1}`;else if(id=typeof raw.id=="string"?raw.id.trim():"",!SNAKE_CASE.test(id))throw new AskUserSchemaError("id must be snake_case");let multiSelect;if(variant==="claude"){if(typeof raw.multiSelect!="boolean")throw new AskUserSchemaError("multiSelect is required");multiSelect=raw.multiSelect}else multiSelect=raw.multiSelect===!0;return{id,header:header2,question,options,multiSelect}}function toCanonical(variant,args,options){if(!isRecord3(args))throw new AskUserSchemaError(WAIT_FLAG_STEER_TEXT);let waitForAnswer=readWaitFlag(variant,args);if(args.required!==void 0&&typeof args.required!="boolean")throw new AskUserSchemaError("required must be a boolean when present");let limits=LIMITS[variant];if(!Array.isArray(args.questions)||args.questions.length<1||args.questions.length>limits.maxQuestions)throw new AskUserSchemaError(`questions must contain 1 to ${limits.maxQuestions} items`);return{requestId:options?.requestId??crypto.randomUUID(),questions:args.questions.map((question,index)=>parseQuestion(variant,question,index)),waitForAnswer,timeoutMs:options?.timeoutMs??DEFAULT_ASK_USER_TIMEOUT_MS,...args.required===!0?{required:!0}:{}}}var INLINE_WORDS={comment:text2=>text2,typed:(_header,text2)=>text2},reference=label3=>`(see [${label3}] below)`;function separatedWords(requestId){let words4=[],place=(base,text2)=>{let taken=words4.filter(word=>word.label===base||word.label.startsWith(`${base} (`)).length,label3=taken===0?base:`${base} (${taken+1})`;return words4.push({label:label3,text:text2}),reference(label3)};return{words:words4,comment:text2=>place(`The user's comment for question ${requestId}`,text2),typed:(header2,text2)=>place(`The user's answer to ${header2} for question ${requestId}`,text2)}}function resolveUserWordReferences(text2,words4){return words4.reduce((resolved,word)=>resolved.split(reference(word.label)).join(word.text),text2)}function readUserWordBlocks(content){let texts=content.flatMap(block=>block.type==="text"?[block.text]:[]);if(texts.length%2!==0)return;let words4=[];for(let index=0;index<texts.length;index+=2){let label3=/^\[(.+)\]$/s.exec(texts[index]??"")?.[1],text2=texts[index+1];if(label3===void 0||text2===void 0)return;words4.push({label:label3,text:text2})}return words4}function headerFor(id,questions){return questions.find(question=>question.id===id)?.header??id}function questionTextFor(id,questions){return questions.find(question=>question.id===id)?.question??id}function typedText(answer2){if(answer2.selected.length>0)return;let text2=answer2.text?.trim();return text2===void 0||text2.length===0?void 0:text2}function answerBody(answer2,header2,words4=INLINE_WORDS,offered=[]){if(!answer2)return;if(answer2.selected.length>0)return answer2.selected.join(", ");let text2=typedText(answer2);if(text2!==void 0)return offered.some(option=>option.label===text2)?text2:words4.typed(header2,text2)}function answeredLines(response,questions,words4){let lines=[],seen=new Set;for(let question of questions){let body=answerBody(response.answers[question.id],question.header,words4,question.options);body!==void 0&&(lines.push(`${question.header}: ${body}`),seen.add(question.id))}for(let[id,answer2]of Object.entries(response.answers)){if(seen.has(id))continue;let header2=headerFor(id,questions),body=answerBody(answer2,header2,words4);body!==void 0&&lines.push(`${header2}: ${body}`)}return lines}var GATED_NO_ANSWER="No answer: do not take the action it gates. Keep that action pending and end the turn.";function formatGatedNoAnswer(response,questions,words4,cancellationReason){let lines=[cancellationReason??(response.status==="timed_out"?`The user did not answer within ${Math.round((response.autoResolvedAfterMs??DEFAULT_ASK_USER_TIMEOUT_MS)/6e4)} minutes. (\uC0AC\uC6A9\uC790\uAC00 \uB2F5\uBCC0\uC744 \uC548\uD558\uACE0 timeout \uC73C\uB85C \uC885\uB8CC\uB428)`:response.status==="cancelled"?"The user dismissed the question.":response.status==="orphaned-after-restart"?"The pending question could not be resumed after a restart.":"This session has no user attached (subagent or headless).")],selected=answeredLines(response,questions,words4);return selected.length>0&&lines.push(`Before going idle the user had selected (not an answer): ${selected.join("; ")}`),lines.push(GATED_NO_ANSWER),lines.join(`
686
+ `)}function formatGatedCancellation(reason,response,requestId,questions){return formatGatedNoAnswer(response,questions,separatedWords(requestId),reason)}function formatBody(response,questions,words4,required=!1){if(required&&response.status!=="answered"&&response.status!=="comment-submitted")return formatGatedNoAnswer(response,questions,words4);switch(response.status){case"answered":{let lines=answeredLines(response,questions,words4),unanswered=response.unanswered.map(id=>headerFor(id,questions));return unanswered.length>0&&lines.push(`Unanswered: ${unanswered.join(", ")}`),lines.join(`
686
687
  `)}case"comment-submitted":{let comment=response.comment?.trim()??"",lines=[`The user responded: ${comment.length>0?words4.comment(comment):""}`,...answeredLines(response,questions,words4)],unanswered=response.unanswered.map(id=>headerFor(id,questions));return unanswered.length>0&&lines.push(`Unanswered: ${unanswered.join(", ")}`),lines.join(`
687
688
  `)}case"timed_out":{let lines=[`The user did not answer within ${Math.round((response.autoResolvedAfterMs??DEFAULT_ASK_USER_TIMEOUT_MS)/6e4)} minutes. (\uC0AC\uC6A9\uC790\uAC00 \uB2F5\uBCC0\uC744 \uC548\uD558\uACE0 timeout \uC73C\uB85C \uC885\uB8CC\uB428)`],selected=answeredLines(response,questions,words4);return selected.length>0&&lines.push(`Before going idle the user had selected: ${selected.join("; ")}`),lines.push("Continue the work to completion on your best judgment; do not ask this question again this turn."),lines.join(`
688
- `)}case"cancelled":return"The user dismissed the question.";case"orphaned-after-restart":return"The pending question could not be resumed after a restart; continue on best judgment.";case"unavailable":return"This session has no user attached (subagent or headless); decide on best judgment."}}function formatResultText(_variant,response,questions=[]){return formatBody(response,questions,INLINE_WORDS)}function formatModelAnswer(response,requestId,questions=[]){let placement=separatedWords(requestId);return{text:formatBody(response,questions,placement),words:placement.words}}function formatUserMessage(response,requestId,questions=[]){let answer2=formatModelAnswer(response,requestId,questions),frame2=`[Answer to question ${requestId}]
689
- ${answer2.text}`;return answer2.words.length===0?frame2:[{type:"text",text:frame2},...userWordBlocks(answer2.words)]}function askUserAnswerDisplayText(content){if(typeof content=="string")return;let[first,...rest]=content;if(first?.type!=="text"||rest.length===0||!parseAskUserAnswerFrame(first.text))return;let words4=readUserWordBlocks(rest);return words4?resolveUserWordReferences(first.text,words4):void 0}function parseAskUserAnswerFrame(text2){let match=/^\[Answer to question ([^\]\r\n]+)\]\r?\n([\s\S]*)$/.exec(text2);return match?{requestId:match[1],body:match[2]}:void 0}function selectedAnswers(answer2){if(answer2.selected.length>0)return answer2.selected;let text2=answer2.text?.trim();return text2===void 0||text2.length===0?[]:[text2]}function formatResultDetails(variant,response,requestId,questions=[]){let{words:words4}=formatModelAnswer(response,requestId,questions);if(variant==="codex"){let answers2={};for(let[id,answer2]of Object.entries(response.answers))answers2[id]={answers:selectedAnswers(answer2)};let details2={...response.resolvedBy!==void 0?{resolvedBy:response.resolvedBy}:{},answers:answers2,unanswered:response.unanswered,status:response.status};return response.comment!==void 0&&(details2.comment=response.comment),words4.length>0&&(details2.userWords=words4),details2}let answers={};for(let[id,answer2]of Object.entries(response.answers)){let body=answerBody(answer2,headerFor(id,questions));body!==void 0&&(answers[questionTextFor(id,questions)]=body)}let details={...response.resolvedBy!==void 0?{resolvedBy:response.resolvedBy}:{},questions,answers,unanswered:response.unanswered.map(id=>questionTextFor(id,questions)),status:response.status};return response.comment!==void 0&&(details.freeText=response.comment),words4.length>0&&(details.userWords=words4),details}import{randomUUID as randomUUID2}from"node:crypto";var POST_COMPACT_RESTORATION_CUSTOM_TYPE="compaction.post-compact-restoration",POST_COMPACT_RESTORATION_SCHEMA="senpi.compaction.post-compact-restoration.v1",DEFAULT_RESTORATION_MAX_ITEMS=10,DEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM=5e3,DEFAULT_RESTORATION_MAX_TOTAL_TOKENS=5e4,DEFAULT_RESTORATION_CONTEXT_RATIO=.15;function createRestorationTrackerState(){return{items:new Map,restoredLabels:new Set,pendingPayload:null}}function trackToolCall(state,event){switch(event.toolName){case"read":trackPathInput(state,event.input,"read");return;case"write":trackPathInput(state,event.input,"write");return;case"edit":trackPathInput(state,event.input,"edit");return;case"apply_patch":trackApplyPatchInput(state,event.input);return;case"skill":case"load_skill":trackSkillInput(state,event.input);return}}function preparePendingPayload(state,options){if(!options.accepted)return;let budgetTokens=computeRestorationBudget(options);if(budgetTokens<=0){state.pendingPayload=null;return}filterAgainstKeptMessages(state,options.keptMessages??[]);let selectedItems=selectRestorationItems(state,options.settings,budgetTokens);if(selectedItems.length===0){state.pendingPayload=null;return}let content=buildRestorationContent(options,selectedItems);state.pendingPayload={customType:POST_COMPACT_RESTORATION_CUSTOM_TYPE,content,display:!1,details:{schema:POST_COMPACT_RESTORATION_SCHEMA,budgetTokens,compactionEntryId:options.compactionEntryId,reason:options.reason,items:selectedItems},budgetTokens}}function consumePendingPayload(state){let payload=state.pendingPayload;if(state.pendingPayload=null,!!payload){for(let item of payload.details.items)state.restoredLabels.add(item.label);return{customType:payload.customType,content:payload.content,display:payload.display,details:payload.details}}}function computeRestorationBudget(options){let settings=resolveSettings(options.settings),contextWindow=Math.max(0,options.contextWindow),configuredBudget=settings.restorationMaxTotalTokens,contextRatioBudget=Math.floor(contextWindow*settings.restorationContextRatio),usageTokens=Math.max(0,options.usageTokens??0),remainingBudget=Math.max(0,contextWindow-usageTokens-options.reserveTokens);return Math.floor(Math.min(configuredBudget,contextRatioBudget,remainingBudget))}function trackPathInput(state,input,operation){typeof input.path!="string"||input.path.length===0||trackFile(state,input.path,operation)}function trackApplyPatchInput(state,input){if(typeof input.input=="string")for(let path15 of extractPatchedPaths(input.input))path15.length>0&&trackFile(state,path15,"edit")}function trackSkillInput(state,input){let skillName=typeof input.name=="string"?input.name:input.skillName;typeof skillName=="string"&&skillName.length>0&&setItem(state,{content:skillName,label:skillName,priority:80,tokens:estimateTextTokens(skillName),type:"skill"})}function trackFile(state,path15,operation){let label3=path15,existing=state.items.get(label3),operations=new Set(parseFileOperations(existing?.content));operations.add(operation);let content=`${path15} (${sortOperations(operations).join(", ")})`;setItem(state,{content,label:label3,priority:operation==="read"&&operations.size===1?50:100,tokens:estimateTextTokens(content),type:"file"})}function setItem(state,item){state.items.set(item.label,item)}function selectRestorationItems(state,settingsInput,budgetTokens){let settings=resolveSettings(settingsInput),candidates=Array.from(state.items.values()).filter(item=>!state.restoredLabels.has(item.label)).map(item=>truncateRestorationItem(item,settings.restorationMaxTokensPerItem)).sort((left,right)=>left.priority!==right.priority?right.priority-left.priority:left.tokens!==right.tokens?left.tokens-right.tokens:left.label.localeCompare(right.label)),selected=[],totalTokens2=0;for(let item of candidates){if(selected.length>=settings.restorationMaxItems)break;totalTokens2+item.tokens>budgetTokens||(selected.push(item),totalTokens2+=item.tokens)}return selected}function buildRestorationContent(options,items){let files=items.filter(item=>item.type==="file"),skills=items.filter(item=>item.type==="skill"),lines=["[Restored context after compaction \u2014 files and skills from before compaction]",`reason: ${options.reason}`,`compactionEntryId: ${options.compactionEntryId}`,""];if(files.length>0){lines.push("<restored-files>");for(let file of files)lines.push(`<file label="${escapeXmlAttribute(file.label)}">${file.content}</file>`);lines.push("</restored-files>"),lines.push("")}if(skills.length>0){lines.push("<restored-skills>");for(let skill of skills)lines.push(`<skill label="${escapeXmlAttribute(skill.label)}">${skill.content}</skill>`);lines.push("</restored-skills>"),lines.push("")}return lines.join(`
689
+ `)}case"cancelled":return"The user dismissed the question.";case"orphaned-after-restart":return"The pending question could not be resumed after a restart; continue on best judgment.";case"unavailable":return"This session has no user attached (subagent or headless); decide on best judgment."}}function formatResultText(_variant,response,questions=[],required=!1){return formatBody(response,questions,INLINE_WORDS,required)}function formatModelAnswer(response,requestId,questions=[],required=!1){let placement=separatedWords(requestId);return{text:formatBody(response,questions,placement,required),words:placement.words}}function formatUserMessage(response,requestId,questions=[],required=!1){let answer2=formatModelAnswer(response,requestId,questions,required),frame2=`[Answer to question ${requestId}]
690
+ ${answer2.text}`;return answer2.words.length===0?frame2:[{type:"text",text:frame2},...userWordBlocks(answer2.words)]}function askUserAnswerDisplayText(content){if(typeof content=="string")return;let[first,...rest]=content;if(first?.type!=="text"||rest.length===0||!parseAskUserAnswerFrame(first.text))return;let words4=readUserWordBlocks(rest);return words4?resolveUserWordReferences(first.text,words4):void 0}function parseAskUserAnswerFrame(text2){let match=/^\[Answer to question ([^\]\r\n]+)\]\r?\n([\s\S]*)$/.exec(text2);return match?{requestId:match[1],body:match[2]}:void 0}function selectedAnswers(answer2){if(answer2.selected.length>0)return answer2.selected;let text2=answer2.text?.trim();return text2===void 0||text2.length===0?[]:[text2]}function formatResultDetails(variant,response,requestId,questions=[],required=!1){let{words:words4}=formatModelAnswer(response,requestId,questions,required);if(variant==="codex"){let answers2={};for(let[id,answer2]of Object.entries(response.answers))answers2[id]={answers:selectedAnswers(answer2)};let details2={...response.resolvedBy!==void 0?{resolvedBy:response.resolvedBy}:{},answers:answers2,unanswered:response.unanswered,status:response.status};return response.comment!==void 0&&(details2.comment=response.comment),words4.length>0&&(details2.userWords=words4),details2}let answers={};for(let[id,answer2]of Object.entries(response.answers)){let body=answerBody(answer2,headerFor(id,questions));body!==void 0&&(answers[questionTextFor(id,questions)]=body)}let details={...response.resolvedBy!==void 0?{resolvedBy:response.resolvedBy}:{},questions,answers,unanswered:response.unanswered.map(id=>questionTextFor(id,questions)),status:response.status};return response.comment!==void 0&&(details.freeText=response.comment),words4.length>0&&(details.userWords=words4),details}import{randomUUID as randomUUID2}from"node:crypto";var POST_COMPACT_RESTORATION_CUSTOM_TYPE="compaction.post-compact-restoration",POST_COMPACT_RESTORATION_SCHEMA="senpi.compaction.post-compact-restoration.v1",DEFAULT_RESTORATION_MAX_ITEMS=10,DEFAULT_RESTORATION_MAX_TOKENS_PER_ITEM=5e3,DEFAULT_RESTORATION_MAX_TOTAL_TOKENS=5e4,DEFAULT_RESTORATION_CONTEXT_RATIO=.15;function createRestorationTrackerState(){return{items:new Map,restoredLabels:new Set,pendingPayload:null}}function trackToolCall(state,event){switch(event.toolName){case"read":trackPathInput(state,event.input,"read");return;case"write":trackPathInput(state,event.input,"write");return;case"edit":trackPathInput(state,event.input,"edit");return;case"apply_patch":trackApplyPatchInput(state,event.input);return;case"skill":case"load_skill":trackSkillInput(state,event.input);return}}function preparePendingPayload(state,options){if(!options.accepted)return;let budgetTokens=computeRestorationBudget(options);if(budgetTokens<=0){state.pendingPayload=null;return}filterAgainstKeptMessages(state,options.keptMessages??[]);let selectedItems=selectRestorationItems(state,options.settings,budgetTokens);if(selectedItems.length===0){state.pendingPayload=null;return}let content=buildRestorationContent(options,selectedItems);state.pendingPayload={customType:POST_COMPACT_RESTORATION_CUSTOM_TYPE,content,display:!1,details:{schema:POST_COMPACT_RESTORATION_SCHEMA,budgetTokens,compactionEntryId:options.compactionEntryId,reason:options.reason,items:selectedItems},budgetTokens}}function consumePendingPayload(state){let payload=state.pendingPayload;if(state.pendingPayload=null,!!payload){for(let item of payload.details.items)state.restoredLabels.add(item.label);return{customType:payload.customType,content:payload.content,display:payload.display,details:payload.details}}}function computeRestorationBudget(options){let settings=resolveSettings(options.settings),contextWindow=Math.max(0,options.contextWindow),configuredBudget=settings.restorationMaxTotalTokens,contextRatioBudget=Math.floor(contextWindow*settings.restorationContextRatio),usageTokens=Math.max(0,options.usageTokens??0),remainingBudget=Math.max(0,contextWindow-usageTokens-options.reserveTokens);return Math.floor(Math.min(configuredBudget,contextRatioBudget,remainingBudget))}function trackPathInput(state,input,operation){typeof input.path!="string"||input.path.length===0||trackFile(state,input.path,operation)}function trackApplyPatchInput(state,input){if(typeof input.input=="string")for(let path15 of extractPatchedPaths(input.input))path15.length>0&&trackFile(state,path15,"edit")}function trackSkillInput(state,input){let skillName=typeof input.name=="string"?input.name:input.skillName;typeof skillName=="string"&&skillName.length>0&&setItem(state,{content:skillName,label:skillName,priority:80,tokens:estimateTextTokens(skillName),type:"skill"})}function trackFile(state,path15,operation){let label3=path15,existing=state.items.get(label3),operations=new Set(parseFileOperations(existing?.content));operations.add(operation);let content=`${path15} (${sortOperations(operations).join(", ")})`;setItem(state,{content,label:label3,priority:operation==="read"&&operations.size===1?50:100,tokens:estimateTextTokens(content),type:"file"})}function setItem(state,item){state.items.set(item.label,item)}function selectRestorationItems(state,settingsInput,budgetTokens){let settings=resolveSettings(settingsInput),candidates=Array.from(state.items.values()).filter(item=>!state.restoredLabels.has(item.label)).map(item=>truncateRestorationItem(item,settings.restorationMaxTokensPerItem)).sort((left,right)=>left.priority!==right.priority?right.priority-left.priority:left.tokens!==right.tokens?left.tokens-right.tokens:left.label.localeCompare(right.label)),selected=[],totalTokens2=0;for(let item of candidates){if(selected.length>=settings.restorationMaxItems)break;totalTokens2+item.tokens>budgetTokens||(selected.push(item),totalTokens2+=item.tokens)}return selected}function buildRestorationContent(options,items){let files=items.filter(item=>item.type==="file"),skills=items.filter(item=>item.type==="skill"),lines=["[Restored context after compaction \u2014 files and skills from before compaction]",`reason: ${options.reason}`,`compactionEntryId: ${options.compactionEntryId}`,""];if(files.length>0){lines.push("<restored-files>");for(let file of files)lines.push(`<file label="${escapeXmlAttribute(file.label)}">${file.content}</file>`);lines.push("</restored-files>"),lines.push("")}if(skills.length>0){lines.push("<restored-skills>");for(let skill of skills)lines.push(`<skill label="${escapeXmlAttribute(skill.label)}">${skill.content}</skill>`);lines.push("</restored-skills>"),lines.push("")}return lines.join(`
690
691
  `)}function truncateRestorationItem(item,maxTokens){if(item.tokens<=maxTokens)return item;let truncationNotice2="[... truncated]",noticeTokens=estimateTextTokens(truncationNotice2),targetTokens=Math.max(0,maxTokens-noticeTokens-1),truncatedBody=truncateToTokenLimit(item.content,targetTokens),content=truncatedBody.length>0?`${truncatedBody}
691
692
  ${truncationNotice2}`:truncationNotice2;return{...item,content,tokens:estimateTextTokens(content)}}function filterAgainstKeptMessages(state,keptMessages){if(keptMessages.length===0)return;let keptText=keptMessages.map(extractMessageText).join(`
692
693
  `);for(let label3 of state.items.keys())keptText.includes(label3)&&state.items.delete(label3)}function extractMessageText(message){if("content"in message){if(typeof message.content=="string")return message.content;if(Array.isArray(message.content))return message.content.filter(content=>content.type==="text").map(content=>content.text).join(`
@@ -728,7 +729,7 @@ File: ${path15}`)}return _ModelConfig.parseAndMigrate(content,path15)}static loa
728
729
 
729
730
  File: ${path15}`)}}getProvider(providerId){return this.providers.get(providerId)}getProviderIds(){return[...this.providers.keys()]}isProviderDisabled(providerId){return this.disabledProviders.has(providerId)||this.providers.get(providerId)?.disabled===!0}getError(){return this.error}getWarnings(){return this.warnings}};import{join as join7}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{constructor(){this.entries=new Map}async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{constructor(path15=join7(getAgentDir(),"models-store.json")){this.path=normalizePath(path15),this.storage=new FileAuthStorageBackend(this.path),this.readState=sharedModelsFileReadState?.path===this.path?sharedModelsFileReadState.readState:{data:{}},sharedModelsFileReadState||(sharedModelsFileReadState={path:this.path,readState:this.readState})}parse(content){return content?JSON.parse(stripBom(content)):{}}updateReadState(readState2,data,revision){readState2.data=data,readState2.revision=revision}reloadFromStorage(readState2,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState2,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState2,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState2.revision)return readState2.data;if(!readState2.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState2,{signal:controller.signal}),readers:0};readState2.reload=reload2,reload2.promise.then(()=>{readState2.reload===reload2&&(readState2.reload=void 0)},()=>{readState2.reload===reload2&&(readState2.reload=void 0)})}let reload=readState2.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState2.reload===reload&&(readState2.reload=void 0,reload.controller.abort())}}async read(providerId,options){let entry=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry?structuredClone(entry):void 0}async write(providerId,entry,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry),latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}async delete(providerId,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return delete current[providerId],latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}};function configuredHeaderAuthStatus(configHeaders,extensionHeaders){let sawCredentialHeader=!1;for(let header2 of effectiveHeaders(configHeaders,extensionHeaders).values()){if(!isCredentialHeaderName(header2.name))continue;if(sawCredentialHeader=!0,isCommandConfigValue(header2.value))return{configured:!0,source:"models_json_command"};let envNames=getConfigValueEnvVarNames(header2.value);if(envNames.length>0){if(isConfigValueConfigured(header2.value))return{configured:!0,source:"environment",label:envNames.join(", ")};continue}if(hasCredentialHeaders({[header2.name]:header2.value}))return{configured:!0,source:header2.source}}return sawCredentialHeader?{configured:!1}:void 0}function headerAuthResolutionSource(configHeaders,extensionHeaders){let headers=effectiveHeaders(configHeaders,extensionHeaders),values=Object.fromEntries([...headers.values()].map(header2=>[header2.name,header2.value]));if(hasCredentialHeaders(values)){for(let header2 of headers.values())if(hasCredentialHeaders({[header2.name]:header2.value}))return header2.source==="extension_headers"?"provider extension headers":"models.json headers"}}async function checkConfiguredHeaderAuth(headers,ctx,source2){if(headers)for(let header2 of effectiveHeaders(headers,void 0).values()){if(!isCredentialHeaderName(header2.name))continue;if(isCommandConfigValue(header2.value))return{type:"api_key",source:source2};let envNames=getConfigValueEnvVarNames(header2.value),configured=!0;for(let envName of envNames)if(await ctx.env(envName)===void 0){configured=!1;break}if(configured&&hasCredentialHeaders({[header2.name]:header2.value}))return{type:"api_key",source:source2}}}function effectiveHeaders(configHeaders,extensionHeaders){let effective=new Map;return addHeaders(effective,configHeaders,"models_json_headers"),addHeaders(effective,extensionHeaders,"extension_headers"),effective}function addHeaders(target,headers,source2){for(let[name,value2]of Object.entries(headers??{}))typeof value2=="string"&&target.set(name.toLowerCase(),{name,value:value2,source:source2})}function composeApiKeyAuth(providerId,base,config,extension){let inherited=base?.auth.apiKey,rawKey=configuredApiKey(config,extension),oauth=extension?.oauth??base?.auth.oauth,rawHeaders=configuredHeaders(config,extension),headerSource=headerAuthResolutionSource(config?.headers,extension?.headers),authHeader=extension?.authHeader??config?.authHeader??!1;return!inherited&&rawKey===void 0&&!headerSource&&oauth?ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader):{name:inherited?.name??"API key",login:inherited?.login??(headerSource&&rawKey===void 0?void 0:async interaction=>({type:"api_key",key:await interaction.prompt({type:"secret",message:"Enter API key"})})),check:async input=>{if(input.credential?.key){let inheritedCheck2=await inherited?.check?.(input);return inheritedCheck2||{type:"api_key",source:"stored credential"}}if(rawKey!==void 0){if(isCommandConfigValue(rawKey))return{type:"api_key",source:"configured API key"};for(let name of getConfigValueEnvVarNames(rawKey))if(await input.ctx.env(name)===void 0)return;return{type:"api_key",source:"configured API key"}}let inheritedCheck=await inherited?.check?.(input);if(inheritedCheck)return inheritedCheck;let resolved=await inherited?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:checkConfiguredHeaderAuth(rawHeaders,input.ctx,headerSource)},resolve:async input=>{let result3=await resolveBaseAuth(providerId,inherited,rawKey,input),explicitEnv={...input.credential?.env??{},...result3?.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);if(!(!result3&&!hasCredentialHeaders(headers)))return{...result3,auth:withConfiguredAuth(result3?.auth??{},headers,authHeader),source:result3?.source??headerSource}}}}function ambientResolverOf(oauth){let candidate=oauth?.resolveAmbient;return typeof candidate=="function"?candidate:void 0}function ambientOnlyAuth(providerId,oauth,rawHeaders,headerSource,authHeader){let resolveAmbient=ambientResolverOf(oauth);if(!resolveAmbient)return;let resolve47=async input=>{let result3=await resolveAmbient({ctx:input.ctx,env:input.credential?.env,signal:input.signal});if(!result3||input.credential?.key&&input.credential.key!==result3.auth.apiKey)return;let explicitEnv={...input.credential?.env??{},...result3.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result3,auth:withConfiguredAuth(result3.auth,headers,authHeader),source:result3.source??headerSource}};return{name:oauth.name??"Ambient credentials",ambientOnly:!0,check:async input=>{let resolved=await resolve47(input);return resolved?{type:"oauth",source:resolved.source}:void 0},resolve:resolve47}}function configuredApiKey(config,extension){return extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){if(!(!config?.headers&&!extension?.headers))return{...config?.headers,...extension?.headers}}function withConfiguredAuth(auth,headers,authHeader){let mergedHeaders=auth.headers||headers?{...auth.headers,...headers}:void 0;if(authHeader){if(!auth.apiKey)throw new Error("authHeader requires a resolved API key");mergedHeaders={...mergedHeaders,Authorization:`Bearer ${auth.apiKey}`}}return{...auth,headers:mergedHeaders}}async function resolveBaseAuth(providerId,inherited,rawKey,input){if(input.credential?.key)return inherited?inherited.resolve(input):{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"};if(rawKey===void 0)return inherited?.resolve(input);let env=await configContextEnv([rawKey],input.ctx,input.credential?.env),key=await resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env);return inherited?inherited.resolve({...input,credential:{type:"api_key",key}}):{auth:{apiKey:key},source:"configured API key"}}async function configContextEnv(values,ctx,explicit){let env={...explicit};for(let name of new Set(values.flatMap(getConfigValueEnvVarNames))){if(env[name]!==void 0)continue;let value2=await ctx.env(name);value2!==void 0&&(env[name]=value2)}return Object.keys(env).length>0?env:void 0}function getAllProviderModels(provider){return provider?provider.getAllModels?.()??provider.getModels():[]}function isChatModelConfig(definition){return(definition.type??"chat")==="chat"}function findExtensionChatModel(extension,modelId){return extension?.models?.filter(isChatModelConfig).find(entry=>entry.id===modelId)}function mergeCompat(base,override){if(!override)return base;let merged={...base,...override},baseNested=base,overrideNested=override,mergedNested=merged;for(let key of["openRouterRouting","vercelGatewayRouting","chatTemplateKwargs","chatTemplateArgs"]){let baseValue=baseNested?.[key],overrideValue=overrideNested[key];(typeof baseValue=="object"&&baseValue!==null||typeof overrideValue=="object"&&overrideValue!==null)&&(mergedNested[key]={...baseValue,...overrideValue})}return merged}function mergeInputLimits(base,override){return override?{...base,...override,images:override.images?{...base?.images,...override.images,resize:override.images.resize?{...base?.images?.resize,...override.images.resize}:base?.images?.resize}:base?.images}:base}function applyModelOverride(model,override){return{...model,name:override.name??model.name,promptPreset:override.promptPreset??model.promptPreset,recoverTextToolCalls:override.recoverTextToolCalls??model.recoverTextToolCalls,reasoning:override.reasoning??model.reasoning,thinkingLevelMap:override.thinkingLevelMap?override.thinkingLevelMapMode==="replace"?override.thinkingLevelMap:{...model.thinkingLevelMap,...override.thinkingLevelMap}:model.thinkingLevelMap,input:override.input??model.input,inputLimits:mergeInputLimits(model.inputLimits,override.inputLimits),cost:override.cost?{input:override.cost.input??model.cost.input,output:override.cost.output??model.cost.output,cacheRead:override.cost.cacheRead??model.cost.cacheRead,cacheWrite:override.cost.cacheWrite??model.cost.cacheWrite,tiers:override.cost.tiers??model.cost.tiers}:model.cost,promptCache:override.promptCache?{...model.promptCache,...override.promptCache}:model.promptCache,contextWindow:override.contextWindow??model.contextWindow,maxTokens:override.maxTokens??model.maxTokens,cacheRetention:override.cacheRetention??model.cacheRetention,samplingParams:override.samplingParams?{...model.samplingParams,...override.samplingParams}:model.samplingParams,compat:mergeCompat(model.compat,override.compat)}}function modelFromJson(providerId,definition,providerConfig,defaults){let api=definition.api??providerConfig.api??defaults?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??providerConfig.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);if(definition.contextWindow!==void 0&&definition.contextWindow<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);if(definition.maxTokens!==void 0&&definition.maxTokens<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);return{id:definition.id,name:definition.name??definition.id,promptPreset:definition.promptPreset,recoverTextToolCalls:definition.recoverTextToolCalls,api,provider:providerId,baseUrl,reasoning:definition.reasoning??!1,thinkingLevelMap:definition.thinkingLevelMap,defaultThinkingLevel:definition.defaultThinkingLevel,input:definition.input??["text"],inputLimits:definition.inputLimits,cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},promptCache:definition.promptCache,contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,cacheRetention:definition.cacheRetention??providerConfig.cacheRetention,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){let chatModels2=models.filter(model=>isModelType(model,"chat"));return chatModels2.find(model=>model.id===modelId)??(api?chatModels2.find(model=>model.api===api):void 0)??chatModels2.find(model=>model.api==="openai-completions")??chatModels2[0]}function findExtensionModelDefaults(models,definition){let type2=definition.type??"chat",candidates=models.filter(model=>isModelType(model,type2));return candidates.find(model=>model.id===definition.id)??(definition.api?candidates.find(model=>model.api===definition.api):void 0)??(type2==="chat"?candidates.find(model=>model.api==="openai-completions"):void 0)??candidates[0]}function extensionModelFromDefinition(providerId,models,config,definition){let type2=definition.type??"chat",defaults=findExtensionModelDefaults(models,definition),api=definition.api??(type2==="chat"?config.api:void 0)??defaults?.api;if(!api)throw new Error(type2==="chat"?`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`:`Provider ${providerId}, model ${definition.id}: no "api" specified. Set it at model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return definition.type==="image"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:definition.type==="classifier"?{...definition,api,provider:providerId,baseUrl,headers:void 0}:{...definition,api,provider:providerId,baseUrl,headers:void 0}}function applyModelsJson(providerId,baseModels,config,extension){if(!config)return[...baseModels];let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.extraBody&&!config.compat&&!hasOverrides&&!config.whitelist&&!config.blacklist&&config.hideFreeModels===void 0&&!config.apiKey&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "extraBody", "compat", "modelOverrides", or "models".`);let models=(providerId==="ollama"&&config.models?.length?[]:baseModels).map(model=>{let baseUrl=config.baseUrl??model.baseUrl;return isModelType(model,"chat")?{...model,baseUrl,compat:mergeCompat(model.compat,config.compat)}:{...model,baseUrl}});for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>isModelType(model2,"chat")&&model2.id===definition.id),defaults=existingIndex>=0?models[existingIndex]:findModelDefaults(models,definition.id,definition.api??extension?.api??config.api),model=modelFromJson(providerId,definition,config,{...defaults,api:extension?.api??defaults?.api,baseUrl:extension?.baseUrl??defaults?.baseUrl});existingIndex>=0?models[existingIndex]=model:models.push(model)}let whitelist=config.whitelist?new Set(config.whitelist):void 0,blacklist=config.blacklist?new Set(config.blacklist):void 0,hideFree=config.hideFreeModels===!0;return models.filter(model=>(whitelist===void 0||whitelist.has(model.id))&&(blacklist===void 0||!blacklist.has(model.id))&&!(hideFree&&model.cost.input===0&&model.cost.output===0))}function applyExtension(providerId,models,config,customModelIds){if(!config)return[...models];if(!config.models)return config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models];let declaredModels=config.models;return[...declaredModels.map(definition=>extensionModelFromDefinition(providerId,models,config,definition)),...models.filter(model=>isModelType(model,"chat")&&customModelIds.has(model.id)&&!declaredModels.some(definition=>isChatModelConfig(definition)&&definition.id===model.id))]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)}),...config.check?{check:config.check}:{}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env=credential.env,headers=await resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env=="object"&&env!==null?env:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let chatDefinition=isModelType(model,"chat")?config?.models?.find(entry=>entry.id===model.id):void 0,extensionModel=extension?.models?.find(entry=>(entry.type??"chat")===(model.type??"chat")&&entry.id===model.id),headers={...isModelType(model,"chat")?config?.modelOverrides?.[model.id]?.headers:void 0,...chatDefinition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function rawModelExtraBody(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),extraBody={...config?.modelOverrides?.[model.id]?.extraBody,...definition?.extraBody,...extensionModel?.extraBody};return Object.keys(extraBody).length>0?extraBody:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),modelsConfig,extension),extension,new Set((modelsConfig?.models??[]).map(definition=>definition.id)))}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getAllModels=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,currentExtension()),currentExtension(),new Set((config?.models??[]).map(definition=>definition.id)));return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=[...extension.oauth.modifyModels(models.filter(model=>isModelType(model,"chat")),extensionOAuthCredential),...models.filter(model=>!isModelType(model,"chat"))]),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override&&isModelType(model,"chat")?applyModelOverride(model,override):model})};getAllModels();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let refreshBase=providerId==="ollama"&&config?.models?.length?void 0:base?.refreshModels?.bind(base),supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{let format2=getToolCallFormat(model),tools=format2?getCurrentTools(context.messages):[];if(format2&&tools.length>0){let protocol=getProtocol(format2),transformedContext=transformContext(context,protocol),innerStream=streamWith(model,transformedContext,options,simple);return wrapStreamWithToolCallMiddleware(innerStream,protocol,tools)}if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api} (model "${model.provider}/${model.id}"). Load the extension that implements this api, or fix the "api" value for provider "${providerId}" in models.json.`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,retryPolicy:extension?.retryPolicy??base?.retryPolicy,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels:()=>getAllModels().filter(model=>isModelType(model,"chat")),getAllModels,refreshModels:refreshBase||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await refreshBase?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,getAllProviderModels(base),config,extension),{...extension,models:refreshed},new Set((config?.models??[]).map(definition=>definition.id))),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,filterAllModels:base?.filterAllModels?(models,credential)=>base.filterAllModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options));let extensionImages=extension?.images,generateImages2=base?.generateImages;(generateImages2||Object.keys(extensionImages??{}).length>0)&&(provider.generateImages=(model,context,options)=>{let implementation=extensionImages?.[model.api];return implementation?implementation.generateImages(model,context,options):generateImages2?generateImages2(model,context,options):Promise.resolve(imageErrorResult(model,new Error(`Provider ${providerId} has no image implementation for "${model.api}"`)))});let extensionClassifiers=extension?.classifiers,classify=base?.classify;return(classify||Object.keys(extensionClassifiers??{}).length>0)&&(provider.classify=(model,context,options)=>{let implementation=extensionClassifiers?.[model.api];return implementation?implementation.classify(model,context,options):classify?classify(model,context,options):Promise.resolve(classifierErrorResult(model,new Error(`Provider ${providerId} has no classifier implementation for "${model.api}"`)))}),provider}function resolveConfiguredModelHeaders(model,config,extension,env){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env)}async function resolveCompatibilityRequestHeaders(model,config,extension,env){let configured=await resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`,env);return model.headers||configured?{...model.headers,...configured}:void 0}function resolveCompatibilityRequestConfig(model,config,extension){let modelDefinition=config?.models?.find(entry=>entry.id===model.id),extensionModel=findExtensionChatModel(extension,model.id),configuredExtraBody={...config?.extraBody,...extension?.extraBody,...rawModelExtraBody(model,config,extension)};return{extraBody:Object.keys(configuredExtraBody).length>0?configuredExtraBody:void 0,upstreamModelId:extensionModel?.upstreamModelId??modelDefinition?.upstreamModelId??model.upstreamModelId,serviceTier:extensionModel?.serviceTier??modelDefinition?.serviceTier??model.serviceTier,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value2=configuredApiKey(config,extension);if(value2===void 0)return configuredHeaderAuthStatus(config?.headers,extension?.headers);if(isCommandConfigValue(value2))return{configured:!0,source:"models_json_command"};let names=getConfigValueEnvVarNames(value2);return names.length>0?isConfigValueConfigured(value2)?{configured:!0,source:"environment",label:names.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function createProviderSemaphores(getLimit){let providers=new Map;function drain(semaphore){for(;semaphore.active<semaphore.limit&&semaphore.waiters.length>0;)semaphore.waiters.shift()?.grant()}function resize(providerId,limit){let semaphore=providers.get(providerId);semaphore&&(semaphore.limit=limit>0?limit:1/0,drain(semaphore))}function acquire(semaphore,signal){return signal?.aborted?Promise.reject(signal.reason):new Promise((resolve47,reject)=>{let abort=()=>{let index=semaphore.waiters.indexOf(waiter);index!==-1&&semaphore.waiters.splice(index,1),reject(signal?.reason)},waiter={grant(){signal?.removeEventListener("abort",abort),semaphore.active++;let released=!1;resolve47(()=>{released||(released=!0,semaphore.active--,drain(semaphore))})}};semaphore.waiters.push(waiter),signal?.addEventListener("abort",abort,{once:!0}),drain(semaphore)})}async function runAcquired(semaphore,signal,run2){let release4=await acquire(semaphore,signal);try{signal?.throwIfAborted();let stream2=run2();return stream2.result().then(release4,release4),stream2}catch(error2){throw release4(),error2}}return{resize,bracket(providerId,signal,run2){let configured=getLimit(providerId),limit=configured>0?configured:1/0;if(resize(providerId,limit),limit===1/0)return run2();let semaphore=providers.get(providerId);return semaphore||(semaphore={limit,active:0,waiters:[]},providers.set(providerId,semaphore)),runAcquired(semaphore,signal,run2)}}}import{isDeepStrictEqual as isDeepStrictEqual2}from"node:util";var MODEL_CAPABILITY_FIELDS=["contextWindow","maxTokens","input","reasoning","thinkingLevelMap","upstreamModelId","serviceTier","recoverTextToolCalls","compat"];function mergeRemoteCatalogModels(providerId,baseline,dynamic){let merged=[...baseline],conflicts=[];for(let model of dynamic){let index=merged.findIndex(entry=>entry.id===model.id);if(index<0){merged.push(model);continue}let staticModel=merged[index],fields=MODEL_CAPABILITY_FIELDS.filter(field2=>!isDeepStrictEqual2(staticModel[field2],model[field2]));fields.length>0&&conflicts.push({providerId,modelId:model.id,fields}),merged[index]={...staticModel,name:model.name,cost:model.cost}}return{models:merged,conflicts}}function parseRemoteCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries?.every(isModelCatalogEntry))throw new Error(`Invalid model catalog for provider "${providerId}"`);return entries.map(model=>({...model,provider:providerId}))}function isModelCatalogEntry(value2){return isRecord7(value2)?typeof value2.id=="string"&&typeof value2.name=="string"&&typeof value2.api=="string"&&typeof value2.provider=="string"&&typeof value2.baseUrl=="string"&&typeof value2.reasoning=="boolean"&&isInputArray(value2.input)&&isModelCost(value2.cost)&&isFiniteNumber2(value2.contextWindow)&&isFiniteNumber2(value2.maxTokens):!1}function isInputArray(value2){return Array.isArray(value2)&&value2.every(modality=>modality==="text"||modality==="image"||modality==="video")}function isModelCost(value2){return isRecord7(value2)?isFiniteNumber2(value2.input)&&isFiniteNumber2(value2.output)&&isFiniteNumber2(value2.cacheRead)&&isFiniteNumber2(value2.cacheWrite):!1}function isFiniteNumber2(value2){return typeof value2=="number"&&Number.isFinite(value2)}function isRecord7(value2){return typeof value2=="object"&&value2!==null}var DEFAULT_CATALOG_BASE_URL="https://pi.dev",REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS=4e3,REMOTE_CATALOG_REFRESH_INTERVAL_MS=14400*1e3,REMOTE_CATALOG_MODEL_TYPES=["chat","image","classifier"],NON_CHAT_MODEL_TYPES=REMOTE_CATALOG_MODEL_TYPES.filter(type2=>type2!=="chat"),FORK_ONLY_BUILTIN_PROVIDERS=new Set(["alibaba-token-plan","opengateway"]);function remoteCatalogServesProvider(providerId,catalogBaseUrl){return catalogBaseUrl!==void 0||!FORK_ONLY_BUILTIN_PROVIDERS.has(providerId)}function isSupportedModelType(model){return model.type===void 0||typeof model.type=="string"&&REMOTE_CATALOG_MODEL_TYPES.includes(model.type)}function mergeModels(baseline,dynamic){let merged=new Map;for(let model of[...baseline,...dynamic])merged.set(`${getModelType(model)}\0${model.id}`,model);return[...merged.values()]}var remoteCatalogConflicts=new WeakMap;function chatModels(models){return models.filter(model=>isModelType(model,"chat"))}function nonChatModels(models){return models.filter(model=>!isModelType(model,"chat"))}function parseCatalog(providerId,value2){let entries=Array.isArray(value2)?value2:typeof value2=="object"&&value2!==null&&"models"in value2&&Array.isArray(value2.models)?value2.models:typeof value2=="object"&&value2!==null?Object.values(value2):void 0;if(!entries)throw new Error(`Invalid model catalog for provider "${providerId}"`);let supported=entries.filter(entry=>typeof entry=="object"&&entry!==null).filter(isSupportedModelType),isNonChat=entry=>NON_CHAT_MODEL_TYPES.includes(entry.type),chat=supported.filter(entry=>!isNonChat(entry)),other=supported.filter(entry=>isNonChat(entry)&&"id"in entry).map(model=>({...model,provider:providerId}));return[...parseRemoteCatalog(providerId,chat),...other]}function remoteModels(entry,localGeneratedAt){return entry?localGeneratedAt!==void 0&&(entry.lastModified===void 0||entry.lastModified<=localGeneratedAt)?[]:entry.models:[]}function withRemoteCatalog(provider,catalogBaseUrl=DEFAULT_CATALOG_BASE_URL,localGeneratedAt){let dynamicModels=[],currentChatModels=()=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(dynamicModels)).models,conflictsFor=models=>mergeRemoteCatalogModels(provider.id,provider.getModels(),chatModels(models)).conflicts,wrappedProvider={...provider,getModels:currentChatModels,getAllModels:()=>[...currentChatModels(),...mergeModels(nonChatModels(provider.getAllModels?.()??[]),nonChatModels(dynamicModels))],refreshModels:async context=>{let stored=context.stored,restored=remoteModels(stored,localGeneratedAt).filter(model=>model.provider===provider.id);if(!await context.publish({update:()=>{dynamicModels=restored,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(restored))}})||!context.allowNetwork||context.signal.aborted||!context.force&&stored?.checkedAt!==void 0&&stored.lastModified!==void 0&&Date.now()-stored.checkedAt<REMOTE_CATALOG_REFRESH_INTERVAL_MS)return;let validator=stored&&stored.models.length>0?stored.etag:void 0,url=new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`,catalogBaseUrl);url.searchParams.set("types",REMOTE_CATALOG_MODEL_TYPES.join(","));let response=await fetchWithRetry(url,{headers:{accept:"application/json","User-Agent":getPiUserAgent(VERSION),...validator?{"if-none-match":validator}:{}},signal:context.signal},{attemptTimeoutMs:REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS});if(context.signal.aborted)return;let checkedAt=Date.now();if(response.status===304&&stored){await context.publish({persist:{...stored,checkedAt}});return}if(response.status===404||response.status===501){await context.publish({persist:{...stored??{models:[]},checkedAt,lastModified:0,etag:void 0}});return}if(!response.ok)throw await context.publish({persist:{...stored??{models:[]},checkedAt}}),new Error(`Model catalog request failed for ${provider.id}: ${response.status}`);let refreshed=parseCatalog(provider.id,await response.json()),lastModified=Date.parse(response.headers.get("last-modified")??"");if(context.signal.aborted)return;let entry={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response.headers.get("etag")??void 0},published=remoteModels(entry,localGeneratedAt);await context.publish({persist:entry,update:()=>{dynamicModels=published,remoteCatalogConflicts.set(wrappedProvider,conflictsFor(published))}})}};return remoteCatalogConflicts.set(wrappedProvider,[]),wrappedProvider}function asExtensionOAuthRegistry(store){let candidate=store;return typeof candidate.registerOAuthProvider=="function"&&typeof candidate.unregisterOAuthProvider=="function"?candidate:void 0}var RuntimeCredentials=class{constructor(store){this.overrides=new Map,this.store=store}registerOAuthProvider(providerId,oauth){asExtensionOAuthRegistry(this.store)?.registerOAuthProvider(providerId,oauth)}unregisterOAuthProvider(providerId){asExtensionOAuthRegistry(this.store)?.unregisterOAuthProvider(providerId)}setRuntimeApiKey(providerId,apiKey){this.overrides.set(providerId,apiKey)}removeRuntimeApiKey(providerId){this.overrides.delete(providerId)}hasRuntimeApiKey(providerId){return this.overrides.has(providerId)}busyReadCount(){let store=this.store;return typeof store.getBusyReadCount=="function"?store.getBusyReadCount():0}async read(providerId,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?{type:"api_key",key:override}:this.store.read(providerId,options)}async list(options){let entries=new Map((await this.store.list(options)).map(entry=>[entry.providerId,entry]));options?.signal?.throwIfAborted();for(let providerId of this.overrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}modify(providerId,fn,options){return this.store.modify(providerId,fn,options)}async delete(providerId,options){options?.signal?.throwIfAborted(),await this.store.delete(providerId,options),this.overrides.delete(providerId)}};setWireIdentity(BRAND?.userAgent??APP_NAME);function installClaudeCodeVersionCache(modelsPath){modelsPath!==void 0&&installClaudeCodeVersionFileStore({path:join8(dirname7(modelsPath),"claude-code-version.json"),offline:envValue("OFFLINE")!==void 0})}function mightHoldCredentialPool(providerId,credential,env,policySlots){if(credential){let accounts=Object.entries(credential).find(([key])=>key==="accounts")?.[1];return Array.isArray(accounts)&&accounts.length>1||Object.keys(policySlots??{}).length>0}return discoverEnvSlots(providerId,env).length+Object.keys(policySlots??{}).length>1}var CredentialSynchronizationError=class extends Error{constructor(providerId,operation,credential,options){super(`Credential ${operation} committed for ${providerId}, but local synchronization failed`,options),this.name="CredentialSynchronizationError",this.providerId=providerId,this.operation=operation,this.credential=credential}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value2]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value2}return merged}function withPayloadRequestMetadata(options,model){if(!options.onPayload)return options;let onPayload=options.onPayload;return{...options,onPayload:async(payload,providerModel)=>await onPayload(payload,providerModel,{model,headers:options.headers??{}})}}var ModelRuntime=class _ModelRuntime{setSettingsManager(settingsManager){if(this.settingsManager===settingsManager)return;this.unsubscribeProviderSettings?.(),this.settingsManager=settingsManager;let resize=()=>{for(let provider of this.getProviders())this.providerSemaphores.resize(provider.id,settingsManager.getProviderConcurrencyLimit(provider.id))};this.unsubscribeProviderSettings=settingsManager.subscribeToProviderSettings(resize),resize()}constructor(credentials,config,modelsPath,modelsStore,providers,modelNetworkEnabled,modelRefreshTimeoutMs,poolStatePath){this.providerSemaphores=createProviderSemaphores(providerId=>this.settingsManager?.getProviderConcurrencyLimit(providerId)??1/0),this.builtins=new Map,this.nativeExtensionProviders=new Map,this.extensionProviders=new Map,this.virtualModels=new Map,this.compositionErrors=new Map,this.snapshot={all:[],available:[],configuredProviders:new Set,storedProviders:new Set,auth:new Map},this.availabilityInitialized=!1,this.availabilityRefreshSeq=0,this.availabilityErrorSeq=0,this.providerAvailabilitySeq=new Map,this.credentialOperations=new Map,this.credentials=credentials,this.poolStatePath=poolStatePath,this.config=config,this.modelsPath=modelsPath,this.modelNetworkEnabled=modelNetworkEnabled,this.modelRefreshTimeoutMs=modelRefreshTimeoutMs,this.defaultBuiltins=new Map(providers.map(provider=>[provider.id,provider]));for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);this.models=createModels({credentials,modelsStore}),this.rebuildProviders()}static async create(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join8(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join8(dirname7(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),builtinModelDataGeneratedAt=getBuiltinModelDataGeneratedAt(),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl,builtinModelDataGeneratedAt)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,envValue("OFFLINE")===void 0&&options.allowModelNetwork===!0,options.modelRefreshTimeoutMs??15e3,options.agentDir?join8(options.agentDir,"credential-pool-state.json"):options.authPath?join8(dirname7(options.authPath),"credential-pool-state.json"):void 0);runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager);let refreshFromNetwork=runtime.modelNetworkEnabled&&options.allowModelNetwork===!0,controller=refreshFromNetwork&&options.modelRefreshTimeoutMs!==void 0?new AbortController:void 0,timeout=controller?setTimeout(()=>controller.abort(),options.modelRefreshTimeoutMs):void 0,signal=controller?options.signal?AbortSignal.any([options.signal,controller.signal]):controller.signal:options.signal;try{options.refreshOnCreate!==!1&&await runtime.refresh({allowNetwork:refreshFromNetwork,signal})}finally{timeout&&clearTimeout(timeout)}return runtime}static createSync(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join8(getAgentDir(),"models.json");installClaudeCodeVersionCache(modelsPath);let config=ModelConfig.loadSync(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join8(dirname7(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),providers=builtinProviders().map(provider=>provider.refreshModels||!remoteCatalogServesProvider(provider.id,options.catalogBaseUrl)?provider:withRemoteCatalog(provider,options.catalogBaseUrl)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,options.allowModelNetwork??!1,options.modelRefreshTimeoutMs??15e3,options.agentDir?join8(options.agentDir,"credential-pool-state.json"):options.authPath?join8(dirname7(options.authPath),"credential-pool-state.json"):void 0);return runtime.rebuildProviders(),options.settingsManager&&runtime.setSettingsManager(options.settingsManager),runtime}providerIds(){return new Set([...this.builtins.keys(),...this.nativeExtensionProviders.keys(),...this.config.getProviderIds(),...this.extensionProviders.keys(),...this.virtualModels.keys()])}recomposeProvider(rawProviderId){let providerId=normalizeProviderId(rawProviderId);if(this.config.isProviderDisabled(providerId)){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}let provider=this.composeProvider(providerId),virtualModels=[...this.virtualModels.get(providerId)?.values()??[]].map(entry=>entry.model);return virtualModels.length>0?this.models.setProvider(withVirtualModels(providerId,provider,virtualModels)):provider?this.models.setProvider(provider):this.models.deleteProvider(providerId),provider}composeProvider(providerId){let base=this.nativeExtensionProviders.get(providerId)??this.builtins.get(providerId),extension=this.extensionProviders.get(providerId);if(!this.config.getProvider(providerId)&&!extension)return this.compositionErrors.delete(providerId),base;try{let provider=composeModelProvider(providerId,base,this.config,extension);return this.compositionErrors.delete(providerId),provider}catch(error2){return this.compositionErrors.set(providerId,error2 instanceof Error?error2.message:String(error2)),base}}rebuildProviders(){this.models.clearProviders(),this.compositionErrors.clear();for(let providerId of this.providerIds())this.recomposeProvider(providerId);this.updateModelSnapshot()}updateModelSnapshot(){let all2=[...this.models.getModels()];this.snapshot={...this.snapshot,all:all2,available:all2.filter(model=>this.snapshot.configuredProviders.has(model.provider))}}async runAvailabilityRefresh(seq,errorSeq,signal){let busyReadsBefore=this.credentials.busyReadCount(),providers=this.models.getProviders(),[available,checks,credentials]=await Promise.all([this.models.getAvailable(void 0,{signal}),Promise.all(providers.map(async provider=>[provider.id,await this.models.checkAuth(provider.id,{signal})])),this.credentials.list({signal})]);if(seq!==this.availabilityRefreshSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let auth=new Map(checks),configuredProviders=new Set(checks.filter(entry=>entry[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry=>entry.providerId)),auth},this.availabilityInitialized=!0,errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}queueAvailabilityRefresh(signal){let seq=++this.availabilityRefreshSeq;for(let[providerId,providerSeq]of this.providerAvailabilitySeq)this.providerAvailabilitySeq.set(providerId,providerSeq+1);let errorSeq=++this.availabilityErrorSeq,effectiveSignal=operationSignal(signal);return this.runAvailabilityRefresh(seq,errorSeq,effectiveSignal).catch(error2=>{throw errorSeq===this.availabilityErrorSeq&&!effectiveSignal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2})}async refreshProviderAvailability(providerId,signal){++this.availabilityRefreshSeq;let providerSeq=(this.providerAvailabilitySeq.get(providerId)??0)+1;this.providerAvailabilitySeq.set(providerId,providerSeq);let errorSeq=++this.availabilityErrorSeq,busyReadsBefore=this.credentials.busyReadCount();try{let[available,auth,credential]=await Promise.all([this.models.getAvailable(providerId,{signal}),this.models.checkAuth(providerId,{signal}),this.credentials.read(providerId,{signal})]);if(signal.throwIfAborted(),this.providerAvailabilitySeq.get(providerId)!==providerSeq||this.answeredFromBusyStore(busyReadsBefore,errorSeq))return;let configuredProviders=new Set(this.snapshot.configuredProviders),storedProviders=new Set(this.snapshot.storedProviders),authByProvider=new Map(this.snapshot.auth);auth?(configuredProviders.add(providerId),authByProvider.set(providerId,auth)):(configuredProviders.delete(providerId),authByProvider.delete(providerId)),credential?storedProviders.add(providerId):storedProviders.delete(providerId);let all2=[...this.models.getModels()],availableById=new Map([...this.snapshot.available.filter(model=>model.provider!==providerId),...available].map(model=>[`${model.provider}\0${model.id}`,model]));this.snapshot={all:all2,available:all2.flatMap(model=>availableById.get(`${model.provider}\0${model.id}`)??[]),configuredProviders,storedProviders,auth:authByProvider},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}catch(error2){throw this.providerAvailabilitySeq.get(providerId)===providerSeq&&errorSeq===this.availabilityErrorSeq&&!signal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}answeredFromBusyStore(busyReadsBefore,errorSeq){return this.credentials.busyReadCount()===busyReadsBefore?!1:(errorSeq===this.availabilityErrorSeq&&(this.availabilityError="Credential store was busy; availability will be re-read on the next refresh"),!0)}getProviders(){return this.models.getProviders()}getProvider(providerId){return this.models.getProvider(providerId)}getModels(providerId){return this.models.getModels(providerId)}getModel(providerId,modelId){return this.models.getModel(providerId,modelId)}getModelsOfType(type2,providerId){return this.models.getModelsOfType(type2,providerId)}getModelOfType(type2,providerId,modelId){return this.models.getModelOfType(type2,providerId,modelId)}getAllModels(providerId){return this.models.getAllModels(providerId)}getAvailableOfType(type2,providerId,options){return this.models.getAvailableOfType(type2,providerId,options)}getAllAvailable(providerId,options){return this.models.getAllAvailable(providerId,options)}async checkAuth(providerId,options){return this.models.checkAuth(providerId,options)}async getAvailable(providerId,options){if(providerId){let errorSeq=++this.availabilityErrorSeq;try{let available=await this.models.getAvailable(providerId,options);return errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0),available}catch(error2){throw errorSeq===this.availabilityErrorSeq&&!options?.signal?.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}return await this.queueAvailabilityRefresh(options?.signal),this.snapshot.available}getAvailableSnapshot(){return this.snapshot.available}hasFreshAvailabilitySnapshot(){return this.availabilityInitialized&&this.availabilityError===void 0}hasAvailabilitySnapshot(){return this.availabilityInitialized}getWarnings(){return this.config.getWarnings()}getError(){let errors=[],configError=this.config.getError();configError&&errors.push(configError);for(let[providerId,error2]of this.compositionErrors)errors.push(`Provider "${providerId}": ${error2}`);return this.availabilityError&&errors.push(`Availability refresh: ${this.availabilityError}`),errors.length>0?errors.join(`
730
731
 
731
- `):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve47=>{markStarted=resolve47}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}}:{configured:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=isModelType(model,"chat")?this.getCompatibilityRequestConfig(model):{},extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-TAARAJGY.js"),import("./state-store-SCMTDYE2.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name},prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}attemptWithTokenRecovery(model,options,slotAuth,send,transcript){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(prepared));return{stream:wrapStreamWithModelRecovery(inner,model,getCurrentTools(transcript.messages)),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return isVirtualModel(model)?lazyStream(model,async()=>{let route=await this.resolveModel(model,transcript.messages,{reason:"direct",thinkingLevel:options?.reasoning??"off",signal:options?.signal}),{maxTokens:limit}=route.model,maxTokens=options?.maxTokens&&limit>0?Math.min(options.maxTokens,limit):options?.maxTokens,reasoning=route.thinkingLevel==="off"?void 0:route.thinkingLevel,{apiKey,headers,env,...rest}=options??{},auth=route.model.provider===model.provider?{apiKey,headers,env}:{};return this.streamSimple(route.model,context,{...rest,...auth,maxTokens,reasoning})}):lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name},prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}async generateImages(model,context,options){try{assertImageModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);return await prepared.provider.generateImages(prepared.model,context,prepared.options)}catch(error2){return imageErrorResult(model,error2,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);return await prepared.provider.classify(prepared.model,context,prepared.options)}catch(error2){return classifierErrorResult(model,error2,options?.signal?.aborted)}}login(providerId,type2,interaction,options){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal},options);return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(this.config.getProvider(provider.id),void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}markProvisionallyConfigured(providerId,configuredStatus,type2){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:type2,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(this.config.getProvider(providerId),effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerVirtualModel(definition){let{provider:providerId,id}=definition;if(!providerId.trim()||!id.trim())throw new Error("Virtual model provider and id must not be empty.");let existing=this.models.getModel(providerId,id);if(existing&&!isVirtualModel(existing))throw new Error(`Virtual model ${providerId}/${id} conflicts with a physical model.`);let models=this.virtualModels.get(providerId)??new Map;if(models.set(id,{model:createVirtualModel(definition),route:request2=>definition.route(request2)}),this.virtualModels.set(providerId,models),!this.recomposeProvider(providerId)&&!this.snapshot.configuredProviders.has(providerId)){let auth=new Map(this.snapshot.auth).set(providerId,{type:"api_key",source:"virtual"}),configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId);this.snapshot={...this.snapshot,auth,configuredProviders}}this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}unregisterVirtualModel(providerId,id){let models=this.virtualModels.get(providerId);models?.delete(id)&&(models.size===0&&this.virtualModels.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1}))}async resolveModel(model,messages,options){let name=`Virtual model ${model.provider}/${model.id}`,virtual=this.virtualModels.get(model.provider)?.get(model.id);if(!virtual)throw new Error(`${name} is not registered.`);let{failed,...request2}=options,latest=findLatestResponse(messages),previousModel=latest&&this.getPhysicalModel(latest.provider,latest.model),failedModel=failed&&this.getPhysicalModel(failed.provider,failed.model),route=await virtual.route({...request2,model,previous:previousModel&&{model:previousModel,thinkingLevel:latest?.thinkingLevel},failed:failedModel&&failed&&{model:failedModel,thinkingLevel:failed.thinkingLevel,message:failed},messages}),target=this.getPhysicalModel(route.model.provider,route.model.id),routed=`${name} routed to ${route.model.provider}/${route.model.id}`;if(!target)throw new Error(`${routed}, which is not a physical model.`);if(!this.hasConfiguredAuth(target.provider))throw new Error(`${routed}, which has no credentials.`);return{model:target,thinkingLevel:clampThinkingLevel(target,route.thinkingLevel),state:route.state}}getPhysicalModel(providerId,modelId){let model=this.models.getModel(providerId,modelId);return model&&!isVirtualModel(model)?model:void 0}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join9(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:(this.retryBusyCredentialRead(),this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]}))}find(provider,modelId){return this.runtime.getModel(provider,modelId)}findOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}hasConfiguredAuth(model){return this.retryBusyCredentialRead(),this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}retryBusyCredentialRead(){this.authStorage.isCredentialStoreBusy()&&this.authStorage.reload()}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env,...resolution.ambient?{ambient:!0}:{}}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getModelsOfType(type2,provider){return this.runtime.getModelsOfType(type2,provider)}getAvailableOfType(type2,provider,options){return this.runtime.getAvailableOfType(type2,provider,options)}getModelOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}classify(model,context,options){return this.runtime.classify(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}registerVirtualModel(definition){this.runtime.registerVirtualModel(definition)}unregisterVirtualModel(providerName,id){this.runtime.unregisterVirtualModel(providerName,id)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source2,providerId){return source2.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source2){let cache=new Map;return providerId=>{let ambient=cache.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source2,providerId),cache.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source2){let isAmbient=createAmbientProviderCheck(source2),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-4-8",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-ultra-550b-a55b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding",meta:"muse-spark-1.3","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.5-pro","xiaomi-token-plan-cn":"mimo-v2.5-pro","xiaomi-token-plan-ams":"mimo-v2.5-pro","xiaomi-token-plan-sgp":"mimo-v2.5-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference2){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference2.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches2=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches2.length===0)return;let aliases=matches2.filter(m=>isAlias(m.id)),datedVersions=matches2.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority","ultrafast"];function isServiceTier(value2){return SERVICE_TIER_VALUES.includes(value2)}function dropsParsedDecorators(warning){return warning?.startsWith("Invalid thinking level")??!1}function pushUltrafastAdvisory(diagnostics,pattern,model,serviceTier){let message=ultrafastSelectionWarning(model,serviceTier);message&&diagnostics.push({type:"warning",code:"ultrafast-undocumented",message,pattern})}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=dropsParsedDecorators(result3.warning)?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let serviceTier=dropsParsedDecorators(result3.warning)?void 0:result3.serviceTier??suffix;return{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier,warning:result3.warning??ultrafastSelectionWarning(result3.model,serviceTier)}}return result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,exactMatch,serviceTier2),patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches2=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches2(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches2(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,model2,serviceTier2),owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:model&&warning===ultrafastSelectionWarning(model,serviceTier)?"ultrafast-undocumented":"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches2=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches2}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelReference(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{existsSync as existsSync31,mkdirSync as mkdirSync16,readdirSync as readdirSync8,readFileSync as readFileSync38,realpathSync as realpathSync8,statSync as statSync19,unlinkSync as unlinkSync4,writeFileSync as writeFileSync17}from"node:fs";import{basename as basename20,dirname as dirname38,join as join64,resolve as resolve38,sep as sep14}from"node:path";import{fileURLToPath as fileURLToPath4,pathToFileURL}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
732
+ `):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}getCompatibilityRequestHeaders(model,env){return resolveCompatibilityRequestHeaders(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider),env)}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}isFallbackEligible(providerId){let hook=this.extensionProviders.get(providerId)?.fallbackEligible;if(typeof hook!="function")return!0;try{return hook()!==!1}catch{return!0}}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=await resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve47=>{markStarted=resolve47}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result3=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result3.aborted&&signal.throwIfAborted();let refreshError=result3.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source,...check.ambient?{ambient:!0}:{}}:{configured:!1}}async prepareRequest(model,options,slotAuth){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:slotAuth?.apiKey??options?.apiKey,env:options?.env,signal:options?.signal,...slotAuth?.slotName===void 0?{}:{slotName:slotAuth.slotName},...slotAuth?.rejectedAccess===void 0?{}:{rejectedAccess:slotAuth.rejectedAccess}});if(!resolution)throw new ModelsError("auth",providerNotConfiguredMessage(model.provider));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let compatibility=isModelType(model,"chat")?this.getCompatibilityRequestConfig(model):{},extraBody=compatibility.extraBody||providerOptions.extraBody?{...compatibility.extraBody,...providerOptions.extraBody}:void 0,env=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0,upstreamModelId=compatibility.upstreamModelId,requestModel=resolution.auth.baseUrl||upstreamModelId?{...model,...upstreamModelId?{id:upstreamModelId}:{},...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{}}:model,rejectedTokenStatuses=provider.auth.oauth?.rejectedTokenStatuses,storedOAuthAccess=resolution.source==="OAuth"&&(slotAuth?.apiKey??providerOptions.apiKey)===void 0?resolution.auth.apiKey:void 0;return{...rejectedTokenStatuses!==void 0&&storedOAuthAccess!==void 0?{rejectableAccess:storedOAuthAccess,rejectedTokenStatuses}:{},provider,model:requestModel,options:{...providerOptions,apiKey:slotAuth?.apiKey??providerOptions.apiKey??resolution.auth.apiKey,headers,extraBody,env}}}loadCredentialPool(){return this.credentialPoolModules??=(async()=>{let[rotation,stateStore]=await Promise.all([import("./rotation-stream-FQH63DMY.js"),import("./state-store-SCMTDYE2.js")]);return{rotation,repository:new stateStore.CredentialSlotRepository(this.poolStatePath)}})(),this.credentialPoolModules}couldRotateCredentials(model,options){if(options?.apiKey!==void 0||this.credentials.hasRuntimeApiKey(model.provider)||this.config.getProvider(model.provider)?.credentials?.rotation===!1)return!1;let env=name=>options?.env?.[name]??process.env[name];if(this.snapshot.storedProviders.has(model.provider))return!0;let policySlots=this.config.getProvider(model.provider)?.credentials?.slots;return discoverEnvSlots(model.provider,env).length+Object.keys(policySlots??{}).length>1}async credentialRotationSources(model,options){let env=name=>options?.env?.[name]??process.env[name],credential=await this.credentials.read(model.provider,{signal:options?.signal}),policy=this.config.getProvider(model.provider)?.credentials;if(!mightHoldCredentialPool(model.provider,credential,env,policy?.slots))return;let pool=await this.loadCredentialPool(),sources={providerId:model.provider,credential,env,repository:pool.repository,policy};return(await pool.rotation.listRotationSlots(sources,{acquireLeases:!1})).length>1?sources:void 0}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.affinityKey!==void 0?{affinityKey:streamOptions.affinityKey}:streamOptions?.sessionId!==void 0?{affinityKey:streamOptions.sessionId}:{},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{...slot.envKey===void 0?{}:{apiKey:slot.envKey}}:{slotName:slot.name},prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,streamOptions,void 0,prepared=>prepared.provider.stream(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}attemptWithTokenRecovery(model,options,slotAuth,send,transcript){return retryOnceOnRejectedToken(async rejectedAccess=>{let prepared=await this.prepareRequest(model,options,rejectedAccess===void 0?slotAuth:{...slotAuth,rejectedAccess}),inner=await this.providerSemaphores.bracket(prepared.model.provider,prepared.options.signal,()=>send(prepared));return{stream:wrapStreamWithModelRecovery(inner,model,getCurrentTools(transcript.messages)),...prepared.rejectableAccess===void 0?{}:{rejectableAccess:prepared.rejectableAccess},...prepared.rejectedTokenStatuses===void 0?{}:{rejectedTokenStatuses:prepared.rejectedTokenStatuses}}})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return isVirtualModel(model)?lazyStream(model,async()=>{let route=await this.resolveModel(model,transcript.messages,{reason:"direct",thinkingLevel:options?.reasoning??"off",signal:options?.signal}),{maxTokens:limit}=route.model,maxTokens=options?.maxTokens&&limit>0?Math.min(options.maxTokens,limit):options?.maxTokens,reasoning=route.thinkingLevel==="off"?void 0:route.thinkingLevel,{apiKey,headers,env,...rest}=options??{},auth=route.model.provider===model.provider?{apiKey,headers,env}:{};return this.streamSimple(route.model,context,{...rest,...auth,maxTokens,reasoning})}):lazyStream(model,async()=>{assertChatModel(model);let streamOptions=options,sources=this.couldRotateCredentials(model,streamOptions)?await this.credentialRotationSources(model,streamOptions):void 0;if(sources){let{rotation}=await this.loadCredentialPool();return rotation.streamWithCredentialRotation({sources,modelId:this.getCompatibilityRequestConfig(model).upstreamModelId??model.id,...streamOptions?.sessionId===void 0?{}:{affinityKey:streamOptions.sessionId},runAttempt:slot=>this.attemptWithTokenRecovery(model,streamOptions,slot.lane==="env"?{apiKey:slot.envKey}:{slotName:slot.name},prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}return this.attemptWithTokenRecovery(model,options,void 0,prepared=>prepared.provider.streamSimple(prepared.model,transcript,withPayloadRequestMetadata(prepared.options,prepared.model)),transcript)})}async prepareSimpleRequest(model,options){let prepared=await this.prepareRequest(model,options);return{model:prepared.model,options:withPayloadRequestMetadata(prepared.options,prepared.model)}}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){assertChatModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}async generateImages(model,context,options){try{assertImageModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);return await prepared.provider.generateImages(prepared.model,context,prepared.options)}catch(error2){return imageErrorResult(model,error2,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let prepared=await this.prepareRequest(model,options);if(!prepared.provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);return await prepared.provider.classify(prepared.model,context,prepared.options)}catch(error2){return classifierErrorResult(model,error2,options?.signal?.aborted)}}login(providerId,type2,interaction,options){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type2,{...interaction,signal},options);return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async reloadConfig(){await this.refresh({allowNetwork:this.modelNetworkEnabled})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result3=await this.models.refresh(refreshOptions)??{aborted:refreshOptions.signal?.aborted??!1,errors:new Map},errors=new Map(result3.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result3.aborted||(options.signal?.aborted??!1),errors}}shouldSkipRegistrationRefresh(providerId){return this.hasFreshAvailabilitySnapshot()&&(this.nativeExtensionProviders.has(providerId)||this.extensionProviders.has(providerId))}refreshAfterRegistration(){if(!this.modelNetworkEnabled)return this.refresh({allowNetwork:!1});let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),this.modelRefreshTimeoutMs);return this.refresh({allowNetwork:!0,signal:controller.signal}).finally(()=>clearTimeout(timeout))}registerNativeProvider(provider,options){if(!provider.id.trim())throw new Error("Provider id must not be empty.");let alreadyFresh=this.shouldSkipRegistrationRefresh(provider.id);this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id);let composedOAuth=this.models.getProvider(provider.id)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(provider.id,composedOAuth):this.credentials.unregisterOAuthProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(this.config.getProvider(provider.id),void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}markProvisionallyConfigured(providerId,configuredStatus,type2){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:type2,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}registerProvider(providerId,config,options){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config);let alreadyFresh=this.shouldSkipRegistrationRefresh(providerId);this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value2]of Object.entries(config))value2!==void 0&&(effective[key]=value2);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId);let composedOAuth=this.models.getProvider(providerId)?.auth.oauth;return composedOAuth?this.credentials.registerOAuthProvider(providerId,composedOAuth):this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(this.config.getProvider(providerId),effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),alreadyFresh||options?.refresh===!1?Promise.resolve({aborted:!1,errors:new Map}):this.refreshAfterRegistration()}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.credentials.unregisterOAuthProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerVirtualModel(definition){let{provider:providerId,id}=definition;if(!providerId.trim()||!id.trim())throw new Error("Virtual model provider and id must not be empty.");let existing=this.models.getModel(providerId,id);if(existing&&!isVirtualModel(existing))throw new Error(`Virtual model ${providerId}/${id} conflicts with a physical model.`);let models=this.virtualModels.get(providerId)??new Map;if(models.set(id,{model:createVirtualModel(definition),route:request2=>definition.route(request2)}),this.virtualModels.set(providerId,models),!this.recomposeProvider(providerId)&&!this.snapshot.configuredProviders.has(providerId)){let auth=new Map(this.snapshot.auth).set(providerId,{type:"api_key",source:"virtual"}),configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId);this.snapshot={...this.snapshot,auth,configuredProviders}}this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}unregisterVirtualModel(providerId,id){let models=this.virtualModels.get(providerId);models?.delete(id)&&(models.size===0&&this.virtualModels.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1}))}async resolveModel(model,messages,options){let name=`Virtual model ${model.provider}/${model.id}`,virtual=this.virtualModels.get(model.provider)?.get(model.id);if(!virtual)throw new Error(`${name} is not registered.`);let{failed,...request2}=options,latest=findLatestResponse(messages),previousModel=latest&&this.getPhysicalModel(latest.provider,latest.model),failedModel=failed&&this.getPhysicalModel(failed.provider,failed.model),route=await virtual.route({...request2,model,previous:previousModel&&{model:previousModel,thinkingLevel:latest?.thinkingLevel},failed:failedModel&&failed&&{model:failedModel,thinkingLevel:failed.thinkingLevel,message:failed},messages}),target=this.getPhysicalModel(route.model.provider,route.model.id),routed=`${name} routed to ${route.model.provider}/${route.model.id}`;if(!target)throw new Error(`${routed}, which is not a physical model.`);if(!this.hasConfiguredAuth(target.provider))throw new Error(`${routed}, which has no credentials.`);return{model:target,thinkingLevel:clampThinkingLevel(target,route.thinkingLevel),state:route.state}}getPhysicalModel(providerId,modelId){let model=this.models.getModel(providerId,modelId);return model&&!isVirtualModel(model)?model:void 0}};var ModelRegistry=class _ModelRegistry{constructor(runtime,authStorage=AuthStorage.inMemory()){this.runtime=runtime,this.authStorage=authStorage}static create(authStorage,modelsJsonPath=join9(getAgentDir(),"models.json")){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:modelsJsonPath}),authStorage)}static inMemory(authStorage){return new _ModelRegistry(ModelRuntime.createSync({credentials:authStorage,modelsPath:null}),authStorage)}get modelRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return this.runtime.hasAvailabilitySnapshot()?[...this.runtime.getAvailableSnapshot()]:(this.retryBusyCredentialRead(),this.runtime.getProviders().flatMap(provider=>{if(!this.authStorage.hasAuth(provider.id)&&!this.runtime.getProviderAuthStatus(provider.id).configured)return[];let models=this.runtime.getModels(provider.id);return[...provider.filterModels?.(models,this.authStorage.get(provider.id))??models]}))}find(provider,modelId){return this.runtime.getModel(provider,modelId)}findOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}hasConfiguredAuth(model){return this.retryBusyCredentialRead(),this.authStorage.hasAuth(model.provider)||this.runtime.getProviderAuthStatus(model.provider).configured}retryBusyCredentialRead(){this.authStorage.isCredentialStoreBusy()&&this.authStorage.reload()}getUpstreamModelId(model){return this.runtime.getCompatibilityRequestConfig(model).upstreamModelId}getServiceTier(model){return this.runtime.getCompatibilityRequestConfig(model).serviceTier}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model),compatibility=this.runtime.getCompatibilityRequestConfig(model);return resolution?{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,extraBody:compatibility.extraBody,baseUrl:resolution.auth.baseUrl,upstreamModelId:compatibility.upstreamModelId,serviceTier:compatibility.serviceTier,env:resolution.env,...resolution.ambient?{ambient:!0}:{}}:compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:await this.runtime.getCompatibilityRequestHeaders(model),extraBody:compatibility.extraBody}}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0,message=cause instanceof Error?cause.message:error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getModelsOfType(type2,provider){return this.runtime.getModelsOfType(type2,provider)}getAvailableOfType(type2,provider,options){return this.runtime.getAvailableOfType(type2,provider,options)}getModelOfType(type2,provider,modelId){return this.runtime.getModelOfType(type2,provider,modelId)}classify(model,context,options){return this.runtime.classify(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??BUILT_IN_PROVIDER_DISPLAY_NAMES[provider]??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.authStorage.get(model.provider)?.type==="oauth"||this.runtime.isUsingOAuth(model.provider)}isFallbackEligible(model){return this.runtime.isFallbackEligible(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}registerVirtualModel(definition){this.runtime.registerVirtualModel(definition)}unregisterVirtualModel(providerName,id){this.runtime.unregisterVirtualModel(providerName,id)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function isAmbientOnlyProvider(source2,providerId){return source2.getProviderAuthStatus?.(providerId).ambient===!0}function createAmbientProviderCheck(source2){let cache=new Map;return providerId=>{let ambient=cache.get(providerId);return ambient===void 0&&(ambient=isAmbientOnlyProvider(source2,providerId),cache.set(providerId,ambient)),ambient}}function selectProviderDefault(availableModels2,providerDefaults,source2){let isAmbient=createAmbientProviderCheck(source2),configured=availableModels2.filter(model=>!isAmbient(model.provider)),group=configured.length>0?configured:availableModels2;for(let[provider,modelId]of Object.entries(providerDefaults)){let match=group.find(model=>model.provider===provider&&model.id===modelId);if(match)return{model:match,provenance:"provider-default"}}let first=group[0];return first?{model:first,provenance:"first-available"}:void 0}var defaultModelPerProvider={"alibaba-token-plan":"qwen3.7-max","amazon-bedrock":"us.anthropic.claude-opus-4-6-v1","ant-ling":"Ring-2.6-1T","anthropic-subscription":"claude-opus-4-8",anthropic:"claude-opus-4-8",bai:"gpt-5.6-sol",openai:"gpt-6.1-sol","azure-openai-responses":"gpt-5.4","chatgpt-subscription":"gpt-6.1-sol",ollama:"qwen3.5:397b",cursor:"auto",radius:"balanced",nvidia:"nvidia/nemotron-3-ultra-550b-a55b",deepseek:"deepseek-v4-pro",google:"gemini-3.1-pro-preview","google-vertex":"gemini-3.1-pro-preview","github-copilot":"gpt-5.4",openrouter:"moonshotai/kimi-k2.6","vercel-ai-gateway":"zai/glm-5.1",opengateway:"moonshotai/kimi-k3",xai:"grok-4.7",groq:"openai/gpt-oss-120b",cerebras:"gpt-oss-120b",zai:"glm-5.3","zai-coding-cn":"glm-5.3",mistral:"devstral-medium-latest",minimax:"MiniMax-M2.7","minimax-cn":"MiniMax-M2.7",moonshotai:"kimi-k2.6","moonshotai-cn":"kimi-k2.6",huggingface:"moonshotai/Kimi-K2.6",fireworks:"accounts/fireworks/models/kimi-k3",together:"moonshotai/Kimi-K3",venice:"z-ai-glm-5-3",baseten:"zai-org/GLM-5.2",opencode:"kimi-k2.6","opencode-go":"kimi-k3","kimi-coding":"kimi-for-coding",meta:"muse-spark-1.3","cloudflare-workers-ai":"@cf/moonshotai/kimi-k2.6","cloudflare-ai-gateway":"workers-ai/@cf/moonshotai/kimi-k2.6","qwen-token-plan":"qwen3.7-max","qwen-token-plan-cn":"qwen3.7-max","qwen-token-plan-individual":"qwen3.8-max",xiaomi:"mimo-v2.5-pro","xiaomi-token-plan-cn":"mimo-v2.5-pro","xiaomi-token-plan-ams":"mimo-v2.5-pro","xiaomi-token-plan-sgp":"mimo-v2.5-pro"};function getModelNarrowingPatterns(options){return options.cliPatterns??options.legacyEnabledPatterns??[]}function isAlias(id){return id.endsWith("-latest")?!0:!/-\d{8}$/.test(id)}function findExactModelReferenceMatch(modelReference,availableModels2){let trimmedReference=modelReference.trim();if(!trimmedReference)return;let normalizedReference=trimmedReference.toLowerCase(),canonicalMatches=availableModels2.filter(model=>`${model.provider}/${model.id}`.toLowerCase()===normalizedReference);if(canonicalMatches.length===1)return canonicalMatches[0];if(canonicalMatches.length>1)return;let slashIndex=trimmedReference.indexOf("/");if(slashIndex!==-1){let provider=trimmedReference.substring(0,slashIndex).trim(),modelId=trimmedReference.substring(slashIndex+1).trim();if(provider&&modelId){let providerMatches=availableModels2.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()&&model.id.toLowerCase()===modelId.toLowerCase());if(providerMatches.length===1)return providerMatches[0];if(providerMatches.length>1)return}}let idMatches=availableModels2.filter(model=>model.id.toLowerCase()===normalizedReference);return idMatches.length===1?idMatches[0]:void 0}var CURSOR_PROVIDER_IDS=new Set(["cursor","cursor-cli-oauth"]),CURSOR_ALIAS_LEVEL_TOKENS=["minimal","low","medium","high","extra-high","xhigh","max","none"];function legacySelection(legacyVariantId){let alias=getCursorVariantAlias(legacyVariantId);if(alias?.level)return{level:alias.level,source:"legacy-variant",legacyVariantId}}function derivedCursorVariantIds(model){if(!((model.provider!=="cursor"||model.api!=="cursor-agent")&&(model.provider!=="cursor-cli-oauth"||model.api!=="cursor-cli-oauth")))return model.compat?.cursorReasoning?.variantIds}function derivedCursorVariantMatch(model,reference2){let variantIds=derivedCursorVariantIds(model);if(variantIds===void 0)return;let normalized2=reference2.toLowerCase();for(let[level,id]of Object.entries(variantIds))if(id?.toLowerCase()===normalized2)return{level,variantId:id}}function derivedResolution(model,match){return{model,thinkingLevel:match.level,thinkingSelection:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}}function cursorLegacySelection(model,variantId){let alias=legacySelection(variantId);if(alias)return alias;let match=derivedCursorVariantMatch(model,variantId);return match===void 0?void 0:{level:match.level,source:"legacy-variant",legacyVariantId:match.variantId}}function resolveLegacyCursorReference(modelReference,availableModels2){let trimmed=modelReference.trim();if(!trimmed)return;let slashIndex=trimmed.indexOf("/"),explicitProvider=slashIndex===-1?void 0:trimmed.slice(0,slashIndex),legacyVariantId=slashIndex===-1?trimmed:trimmed.slice(slashIndex+1),alias=getCursorVariantAlias(legacyVariantId),providerMatches=model=>CURSOR_PROVIDER_IDS.has(model.provider)&&(!explicitProvider||model.provider.toLowerCase()===explicitProvider.toLowerCase());if(alias){let candidates=availableModels2.filter(model=>providerMatches(model)&&model.id===alias.targetId);if(candidates.length!==1)return;let thinkingSelection=legacySelection(legacyVariantId);return{model:candidates[0],thinkingLevel:thinkingSelection?.level,thinkingSelection}}let exactCandidates=explicitProvider?availableModels2.filter(providerMatches):availableModels2;if(findExactModelReferenceMatch(trimmed,[...exactCandidates]))return;let derivedCandidates=availableModels2.flatMap(model=>{let match=providerMatches(model)?derivedCursorVariantMatch(model,legacyVariantId):void 0;return match===void 0?[]:[{model,match}]});if(derivedCandidates.length===1)return derivedResolution(derivedCandidates[0].model,derivedCandidates[0].match)}function cursorLegacyAliasesForModel(model){if(!CURSOR_PROVIDER_IDS.has(model.provider))return[];let targetId=model.id,baseId=targetId.endsWith("-thinking")?targetId.slice(0,-9):targetId,candidates=new Set([targetId,`${baseId}-thinking`,`${baseId}-fast`]);for(let level of CURSOR_ALIAS_LEVEL_TOKENS)candidates.add(`${baseId}-${level}`),candidates.add(`${baseId}-thinking-${level}`),candidates.add(`${baseId}-${level}-thinking`),candidates.add(`${targetId}-${level}`);let aliases=[...candidates].filter(candidate=>getCursorVariantAlias(candidate)?.targetId===targetId);for(let derivedId of Object.values(derivedCursorVariantIds(model)??{}))aliases.push(derivedId);return aliases}function resolveDerivedCursorVariant(provider,modelId,modelSource){let parsed=parseCursorVariantId(modelId);if(parsed.fast||parsed.level===void 0||parsed.baseId==="")return;let targetId=parsed.thinking===!0?`${parsed.baseId}-thinking`:parsed.baseId,model=modelSource.getModel(provider,targetId),match=model===void 0?void 0:derivedCursorVariantMatch(model,modelId);if(!(model===void 0||match===void 0))return derivedResolution(model,match)}function resolveStoredModelReference(provider,modelId,modelSource){if(CURSOR_PROVIDER_IDS.has(provider)){let alias=getCursorVariantAlias(modelId);if(alias){let model=modelSource.getModel(provider,alias.targetId);if(model){let thinkingSelection=legacySelection(modelId);return{model,thinkingLevel:thinkingSelection?.level,thinkingSelection}}}else{let direct2=modelSource.getModel(provider,modelId);if(direct2)return{model:direct2};let derived=resolveDerivedCursorVariant(provider,modelId,modelSource);if(derived)return derived}}let direct=modelSource.getModel(provider,modelId);return direct?{model:direct}:void 0}function tryMatchModel(modelPattern,availableModels2){let exactMatch=findExactModelReferenceMatch(modelPattern,availableModels2);if(exactMatch)return exactMatch;let matches2=availableModels2.filter(m=>m.id.toLowerCase().includes(modelPattern.toLowerCase())||m.name?.toLowerCase().includes(modelPattern.toLowerCase()));if(matches2.length===0)return;let aliases=matches2.filter(m=>isAlias(m.id)),datedVersions=matches2.filter(m=>!isAlias(m.id));return aliases.length>0?(aliases.sort((a,b)=>b.id.localeCompare(a.id)),aliases[0]):(datedVersions.sort((a,b)=>b.id.localeCompare(a.id)),datedVersions[0])}function buildFallbackModel(provider,modelId,availableModels2){let providerModels=availableModels2.filter(m=>m.provider===provider);if(providerModels.length===0)return;let defaultId=defaultModelPerProvider[provider];return{...defaultId?providerModels.find(m=>m.id===defaultId)??providerModels[0]:providerModels[0],id:modelId,name:modelId}}var SERVICE_TIER_VALUES=["auto","flex","priority","ultrafast"];function isServiceTier(value2){return SERVICE_TIER_VALUES.includes(value2)}function dropsParsedDecorators(warning){return warning?.startsWith("Invalid thinking level")??!1}function pushUltrafastAdvisory(diagnostics,pattern,model,serviceTier){let message=ultrafastSelectionWarning(model,serviceTier);message&&diagnostics.push({type:"warning",code:"ultrafast-undocumented",message,pattern})}function parseModelPattern(pattern,availableModels2,options){let legacyMatch=resolveLegacyCursorReference(pattern,availableModels2);if(legacyMatch)return{...legacyMatch,serviceTier:void 0,warning:void 0};let fullMatch=tryMatchModel(pattern,availableModels2);if(fullMatch)return{model:fullMatch,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:void 0,warning:void 0};let lastColonIndex=pattern.lastIndexOf(":");if(lastColonIndex===-1)return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let prefix=pattern.substring(0,lastColonIndex),suffix=pattern.substring(lastColonIndex+1);if(isValidThinkingLevel(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let thinkingLevel=dropsParsedDecorators(result3.warning)?void 0:result3.thinkingLevel??suffix;return{model:result3.model,thinkingLevel,thinkingSelection:thinkingLevel?{level:thinkingLevel,source:"explicit"}:void 0,serviceTier:result3.serviceTier,warning:result3.warning}}return result3}else if(isServiceTier(suffix)){let result3=parseModelPattern(prefix,availableModels2,options);if(result3.model){let serviceTier=dropsParsedDecorators(result3.warning)?void 0:result3.serviceTier??suffix;return{model:result3.model,thinkingLevel:result3.thinkingLevel,thinkingSelection:result3.thinkingSelection,serviceTier,warning:result3.warning??ultrafastSelectionWarning(result3.model,serviceTier)}}return result3}else{if(!(options?.allowInvalidThinkingLevelFallback??!0))return{model:void 0,thinkingLevel:void 0,serviceTier:void 0,warning:void 0};let result3=parseModelPattern(prefix,availableModels2,options);return result3.model?{model:result3.model,thinkingLevel:void 0,thinkingSelection:void 0,serviceTier:result3.serviceTier,warning:`Invalid thinking level "${suffix}" in pattern "${pattern}". Using default instead.`}:result3}}function resolveModelScopeFromModels(patterns,models){let availableModels2=[...models],scopedModels=[],diagnostics=[],patternResolutions=[],claimedIds=new Set,canonicalId=model=>`${model.provider}/${model.id}`,addScoped=entry=>{let id=canonicalId(entry.model);if(!claimedIds.has(id))return claimedIds.add(id),scopedModels.push(entry),id};for(let pattern of patterns){if(pattern.includes("*")||pattern.includes("?")||pattern.includes("[")){let globPattern=pattern,thinkingLevel2,serviceTier2;for(;;){let colonIdx=globPattern.lastIndexOf(":");if(colonIdx===-1)break;let suffix=globPattern.substring(colonIdx+1);if(thinkingLevel2===void 0&&isValidThinkingLevel(suffix))thinkingLevel2=suffix;else if(serviceTier2===void 0&&isServiceTier(suffix))serviceTier2=suffix;else break;globPattern=globPattern.substring(0,colonIdx)}let exactMatch=findExactModelReferenceMatch(globPattern,availableModels2);if(exactMatch){let owned2=addScoped({model:exactMatch,thinkingLevel:thinkingLevel2,thinkingSelection:thinkingLevel2?{level:thinkingLevel2,source:"explicit"}:void 0,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,exactMatch,serviceTier2),patternResolutions.push({pattern,ownedIds:owned2?[owned2]:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let canonicalPattern=globPattern.includes("/"),matches2=(provider,id)=>minimatch(`${provider}/${id}`,globPattern,{nocase:!0})||!canonicalPattern&&minimatch(id,globPattern,{nocase:!0}),projections=new Map;for(let model2 of availableModels2){let id=canonicalId(model2);matches2(model2.provider,model2.id)&&projections.set(id,{model:model2,aliases:[]});for(let aliasId of cursorLegacyAliasesForModel(model2)){if(!matches2(model2.provider,aliasId))continue;let projection=projections.get(id)??{model:model2,aliases:[]};projection.aliases.push({id:aliasId,selection:cursorLegacySelection(model2,aliasId)}),projections.set(id,projection)}}if(projections.size===0){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!0,isGlob:!0});continue}let ownedIds=[];for(let{model:model2,aliases}of projections.values()){let thinkingSelection2,projectedLevel=thinkingLevel2;if(thinkingLevel2!==void 0)thinkingSelection2={level:thinkingLevel2,source:"explicit"};else{let selections=aliases.flatMap(alias=>alias.selection?[alias.selection]:[]);new Set(selections.map(selection=>selection.level)).size===1&&selections.length>0&&(thinkingSelection2=[...selections].sort((a,b)=>(a.legacyVariantId??"").localeCompare(b.legacyVariantId??""))[0],projectedLevel=thinkingSelection2.level)}let owned2=addScoped({model:model2,thinkingLevel:projectedLevel,thinkingSelection:thinkingSelection2,serviceTier:serviceTier2});pushUltrafastAdvisory(diagnostics,pattern,model2,serviceTier2),owned2&&ownedIds.push(owned2)}patternResolutions.push({pattern,ownedIds,thinkingLevel:thinkingLevel2,serviceTier:serviceTier2,unresolved:!1,isGlob:!0});continue}let{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,availableModels2);if(warning&&diagnostics.push({type:"warning",code:model&&warning===ultrafastSelectionWarning(model,serviceTier)?"ultrafast-undocumented":"invalid-thinking-level",message:warning,pattern}),!model){diagnostics.push({type:"warning",code:"no-match",message:`No models match pattern "${pattern}"`,pattern}),patternResolutions.push({pattern,ownedIds:[],thinkingLevel,serviceTier,unresolved:!0,isGlob:!1});continue}let owned=addScoped({model,thinkingLevel,thinkingSelection,serviceTier});patternResolutions.push({pattern,ownedIds:owned?[owned]:[],thinkingLevel,serviceTier,unresolved:!1,isGlob:!1})}return{scopedModels,diagnostics,patternResolutions}}async function resolveModelScopeWithDiagnostics(patterns,modelRuntime,options){return resolveModelScopeFromModels(patterns,await modelRuntime.getAvailable(void 0,options))}async function resolveModelScope(patterns,modelRuntime,options){let{scopedModels,diagnostics}=await resolveModelScopeWithDiagnostics(patterns,modelRuntime,options);for(let diagnostic2 of diagnostics){if(options?.onWarning){options.onWarning(diagnostic2.message);continue}console.warn(source_default.yellow(`Warning: ${diagnostic2.message}`))}return scopedModels}function resolveCliModel(options){let{cliProvider,cliModel,cliThinking,modelRuntime}=options;if(!cliModel)return{model:void 0,warning:void 0,error:void 0};let availableModels2=[...modelRuntime.getModels()];if(availableModels2.length===0)return{model:void 0,warning:void 0,error:"No models available. Check your installation or add models to models.json."};let providerMap=new Map;for(let m of availableModels2)providerMap.set(m.provider.toLowerCase(),m.provider);let provider=cliProvider?providerMap.get(cliProvider.toLowerCase()):void 0;if(cliProvider&&!provider)return{model:void 0,warning:void 0,error:`Unknown provider "${cliProvider}". Use --list-models to see available providers/models.`};let pattern=cliModel,inferredProvider=!1;if(!provider){let slashIndex=cliModel.indexOf("/");if(slashIndex!==-1){let maybeProvider=cliModel.substring(0,slashIndex),canonical=providerMap.get(maybeProvider.toLowerCase());canonical&&(provider=canonical,pattern=cliModel.substring(slashIndex+1),inferredProvider=!0)}}if(!provider){let lower=cliModel.toLowerCase(),exactMatches=availableModels2.filter(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exactMatches.length===1)return{model:exactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};if(exactMatches.length>1){let authenticatedExactMatches=exactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedExactMatches.length===1)return{model:authenticatedExactMatches[0],warning:void 0,thinkingLevel:void 0,error:void 0};let matches2=exactMatches.map(m=>`${m.provider}/${m.id}`).sort((a,b)=>a.localeCompare(b)).join(", "),authHint=authenticatedExactMatches.length===0?"No matching provider is authenticated.":"More than one matching provider is authenticated.";return{model:void 0,warning:void 0,thinkingLevel:void 0,error:`Model "${cliModel}" is ambiguous across providers: ${matches2}. ${authHint} Use --provider or provider/model.`}}}if(cliProvider&&provider){let prefix=`${provider}/`;cliModel.toLowerCase().startsWith(prefix.toLowerCase())&&(pattern=cliModel.substring(prefix.length))}let candidates=provider?availableModels2.filter(m=>m.provider===provider):availableModels2,{model,thinkingLevel,thinkingSelection,serviceTier,warning}=parseModelPattern(pattern,candidates,{allowInvalidThinkingLevelFallback:!1});if(model){if(inferredProvider){let rawExactMatches=availableModels2.filter(m=>m.id.toLowerCase()===cliModel.toLowerCase()&&!modelsAreEqual(m,model));if(rawExactMatches.length>0&&!modelRuntime.hasConfiguredAuth(model.provider)){let authenticatedRawMatches=rawExactMatches.filter(m=>modelRuntime.hasConfiguredAuth(m.provider));if(authenticatedRawMatches.length===1)return{model:authenticatedRawMatches[0],thinkingLevel:void 0,serviceTier,warning:void 0,error:void 0}}}return{model,thinkingLevel,thinkingSelection,serviceTier,warning,error:void 0}}if(inferredProvider){let lower=cliModel.toLowerCase(),exact=availableModels2.find(m=>m.id.toLowerCase()===lower||`${m.provider}/${m.id}`.toLowerCase()===lower);if(exact)return{model:exact,warning:void 0,thinkingLevel:void 0,serviceTier,error:void 0};let fallback=parseModelPattern(cliModel,availableModels2,{allowInvalidThinkingLevelFallback:!1});if(fallback.model)return{model:fallback.model,thinkingLevel:fallback.thinkingLevel,serviceTier:fallback.serviceTier,warning:fallback.warning,error:void 0}}if(provider){let fallbackPattern=pattern,fallbackThinking;if(!cliThinking){let lastColon=pattern.lastIndexOf(":");if(lastColon!==-1){let suffix=pattern.substring(lastColon+1);isValidThinkingLevel(suffix)&&(fallbackPattern=pattern.substring(0,lastColon),fallbackThinking=suffix)}}let fallbackModel=buildFallbackModel(provider,fallbackPattern,availableModels2);if(fallbackModel){let requestedThinking=cliThinking??fallbackThinking,model2=requestedThinking&&requestedThinking!=="off"?{...fallbackModel,reasoning:!0}:fallbackModel,fallbackWarning=warning?`${warning} Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`:`Model "${fallbackPattern}" not found for provider "${provider}". Using custom model id.`;return{model:model2,thinkingLevel:fallbackThinking,serviceTier,warning:fallbackWarning,error:void 0}}}let display=provider?`${provider}/${pattern}`:cliModel;return{model:void 0,thinkingLevel:void 0,serviceTier,warning,error:`Model "${display}" not found. Use --list-models to see available models.`}}async function findInitialModel(options){let{cliProvider,cliModel,scopedModels,isContinuing,defaultProvider,defaultModelId,modelRuntime}=options,model;if(cliProvider&&cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error&&(console.error(source_default.red(resolved.error)),process.exit(1)),resolved.model)return{model:resolved.model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"cli"}}if(scopedModels.length>0&&!isContinuing){let scopedModel=scopedModels[0],perModel=options.modelThinkingLevels?.[`${scopedModel.model.provider}/${scopedModel.model.id}`];return{model:scopedModels[0].model,thinkingLevel:perModel??scopedModels[0].thinkingLevel,thinkingSelection:scopedModels[0].thinkingSelection,fallbackMessage:void 0,provenance:"scoped"}}if(defaultProvider&&defaultModelId){let resolved=resolveStoredModelReference(defaultProvider,defaultModelId,modelRuntime);if(resolved&&modelRuntime.hasConfiguredAuth(resolved.model.provider))return model=resolved.model,{model,thinkingLevel:resolved.thinkingLevel,thinkingSelection:resolved.thinkingSelection,fallbackMessage:void 0,provenance:"settings"}}let availableModels2=[...typeof modelRuntime.getAvailableSnapshot=="function"?modelRuntime.getAvailableSnapshot():await modelRuntime.getAvailable()],selected=selectProviderDefault(availableModels2,defaultModelPerProvider,modelRuntime);return selected?{model:selected.model,thinkingLevel:void 0,fallbackMessage:void 0,provenance:selected.provenance}:{model:void 0,thinkingLevel:void 0,fallbackMessage:void 0,provenance:"first-available"}}import{existsSync as existsSync31,mkdirSync as mkdirSync16,readdirSync as readdirSync8,readFileSync as readFileSync38,realpathSync as realpathSync8,statSync as statSync19,unlinkSync as unlinkSync4,writeFileSync as writeFileSync17}from"node:fs";import{basename as basename20,dirname as dirname38,join as join64,resolve as resolve38,sep as sep14}from"node:path";import{fileURLToPath as fileURLToPath4,pathToFileURL}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
732
733
  `,HISTORICAL_SHIM_BANNERS=[`// Generated by senpi. Delete this file to stop loading the default global extension.
733
734
  `,`// Generated by pi-coding-agent. Delete this file to stop loading the default global extension.
734
735
  `],ACCEPTED_SHIM_BANNERS=[...new Set([GENERATED_SHIM_BANNER,...HISTORICAL_SHIM_BANNERS])],ACCEPTED_SHIM_BANNER_PREFIXES=[...new Set(ACCEPTED_SHIM_BANNERS.map(banner=>banner.split(".")[0]??banner).map(prefix=>`${prefix}.`))];function hasGeneratedShimBanner(content){return ACCEPTED_SHIM_BANNER_PREFIXES.some(prefix=>content.startsWith(prefix))}import{spawn}from"node:child_process";function openBrowser(target){let[cmd,args]=process.platform==="darwin"?["open",[target]]:process.platform==="win32"?["rundll32",["url.dll,FileProtocolHandler",target]]:["xdg-open",[target]];spawn(cmd,args,{stdio:"ignore",detached:!0}).on("error",()=>{}).unref()}var LOGIN_CANCELLED_MESSAGE="Login cancelled",pendingLogins=new Map;function cancelledError(){return new Error(LOGIN_CANCELLED_MESSAGE)}function ownLoginController(providerId){let controller=new AbortController;return providerId===void 0||(pendingLogins.get(providerId)?.abort(cancelledError()),pendingLogins.set(providerId,controller),controller.signal.addEventListener("abort",()=>{pendingLogins.get(providerId)===controller&&pendingLogins.delete(providerId)},{once:!0})),controller}function createExtensionLoginInteraction(ctx,options){let openBrowser2=options.openBrowser??openBrowser,controller=ownLoginController(options.providerId);return{signal:controller.signal,prompt:prompt=>relayPrompt(ctx,controller,prompt),notify:event=>relayEvent(ctx,event,options.providerLabel,openBrowser2)}}function dialogSignal(loginSignal,promptSignal){return promptSignal?AbortSignal.any([loginSignal,promptSignal]):loginSignal}async function relayPrompt(ctx,login,prompt){let signal=dialogSignal(login.signal,prompt.signal);if(signal.aborted)throw cancelledError();let answer2=await answerPrompt(ctx,prompt,{signal});if(signal.aborted)throw cancelledError();if(answer2===void 0)throw login.abort(cancelledError()),cancelledError();return answer2}async function answerPrompt(ctx,prompt,dialogOptions){switch(prompt.type){case"select":{let label3=await ctx.ui.select(prompt.message,prompt.options.map(option=>option.label),dialogOptions);return prompt.options.find(option=>option.label===label3)?.id}case"text":case"secret":case"manual_code":return ctx.ui.input(prompt.message,prompt.placeholder,dialogOptions)}}function relayEvent(ctx,event,providerLabel,openBrowser2){switch(event.type){case"auth_url":{ctx.mode==="tui"&&openBrowser2(event.url);let lines=[`Open this URL to authorize ${providerLabel}:`,event.url];event.instructions&&lines.push(event.instructions),ctx.ui.notify(lines.join(`
@@ -786,7 +787,7 @@ Use web_search when the user asks for current or online information.
786
787
  Prefer web_search over guessing when freshness matters.
787
788
  `;function anthropicWebSearchExtension(pi){pi.on("before_provider_request",(event,ctx)=>addAnthropicWebSearchToPayload(ctx.model,event.payload)),pi.on("session_start",async(_event,ctx)=>{syncUi(ctx)}),pi.on("model_select",async(_event,ctx)=>{syncUi(ctx)}),pi.on("session_shutdown",async(_event,ctx)=>{clearUi(ctx)}),pi.on("before_agent_start",async(event,ctx)=>{if(supportsNativeAnthropicWebSearch(ctx.model)&&isAnthropicWebSearchEnabled())return{systemPrompt:`${event.systemPrompt}
788
789
  ${ANTHROPIC_WEB_SEARCH_SECTION}`}},{previewSafe:!0})}function pickVariant(model){return getApplyPatchWireMode(model)!=="none"?"codex":"claude"}var TOOL_NAMES={codex:"request_user_input",claude:"ask_user_question"};var sessions=new Map,outcomes=new Map;function queueQuestionOutcome(sessionId,outcome){let queued=outcomes.get(sessionId)??[];queued.push(outcome),outcomes.set(sessionId,queued)}function deliverQueuedQuestionOutcomes(sessionId,pi,ctx){let queued=outcomes.get(sessionId)??[];outcomes.delete(sessionId);for(let outcome of queued)outcome(pi,ctx)}function getPendingQuestions(sessionId){return[...sessions.get(sessionId)?.values()??[]]}function registerPendingQuestion(sessionId,entry){let entries=sessions.get(sessionId);return entries||(entries=new Map,sessions.set(sessionId,entries)),entries.set(entry.request.requestId,entry),()=>{entries.get(entry.request.requestId)===entry&&(entries.delete(entry.request.requestId),entries.size===0&&sessions.delete(sessionId))}}var ASK_USER_SETTLED_EVENT="ask-user:settled",ASK_USER_CLOSED_EVENT="ask-user:closed",ASK_USER_ASKED_EVENT="ask-user:asked",ASK_USER_QUESTION_ENTRY="ask-user:question",ASK_USER_SETTLEMENT_ENTRY="ask-user:settlement";function emitAskUserClosed(pi,requestId,response){pi.events.emit(ASK_USER_CLOSED_EVENT,{requestId,status:response.status,...response.resolvedBy!==void 0?{resolvedBy:response.resolvedBy}:{}})}function emitAskUserNotification(pi,ctx,request2,response,variant){response.status!=="cancelled"&&pi.events.emit(ASK_USER_SETTLED_EVENT,{ctx,request:request2,response,variant})}function copyAnswers(answers){let copied={};for(let[id,answer2]of Object.entries(answers))copied[id]={selected:[...answer2.selected],...answer2.text!==void 0?{text:answer2.text}:{}};return copied}function hasAnswer(answer2){return answer2===void 0?!1:answer2.selected.length>0?!0:answer2.text!==void 0&&answer2.text.trim()!==""}function unansweredIds(request2,answers){let unanswered=[];for(let question of request2.questions)hasAnswer(answers[question.id])||unanswered.push(question.id);return unanswered}function isCommentPresent(comment){return comment!==void 0&&comment.trim()!==""}function buildResponse(status,request2,answers,comment,autoResolvedAfterMs,resolvedBy){return{status,...resolvedBy!==void 0?{resolvedBy}:{},answers:copyAnswers(answers),...isCommentPresent(comment)?{comment}:{},unanswered:unansweredIds(request2,answers),...autoResolvedAfterMs!==void 0?{autoResolvedAfterMs}:{}}}function createPendingQuestion(options){let createdAtMs=options.now(),hardCapMs=options.hardCapMs??72e5,hardDeadlineAtMs=createdAtMs+hardCapMs,schedule=options.setTimeout??((handler,delayMs)=>setTimeout(handler,delayMs)),unsched=options.clearTimeout??clearTimeout,deadlineAtMs=Math.min(createdAtMs+options.idleTimeoutMs,hardDeadlineAtMs),draftAnswers={},draftComment,terminal2,timer,disarm=()=>{timer!==void 0&&(unsched(timer),timer=void 0)},settle=(response,notifyTimeout)=>terminal2!==void 0?terminal2:(terminal2=response,disarm(),notifyTimeout&&options.onTimeout?.(response),response),fireTimeout=()=>{let elapsedMs=Math.max(0,options.now()-createdAtMs);return settle(buildResponse("timed_out",options.request,draftAnswers,draftComment,elapsedMs),!0)},arm=()=>{if(disarm(),terminal2!==void 0)return;let delayMs=deadlineAtMs-options.now();if(delayMs<=0){fireTimeout();return}timer=schedule(()=>{timer=void 0,fireTimeout()},delayMs)};return arm(),{touch(draft){terminal2===void 0&&(draft!==void 0&&(draftAnswers=copyAnswers(draft.answers),draftComment=draft.comment),deadlineAtMs=Math.min(options.now()+options.idleTimeoutMs,hardDeadlineAtMs),arm())},submit(answers,comment,resolvedBy){return terminal2!==void 0?terminal2:isCommentPresent(comment)?settle(buildResponse("comment-submitted",options.request,answers,comment,void 0,resolvedBy),!1):unansweredIds(options.request,answers).length===0||Object.keys(answers).length>0?settle(buildResponse("answered",options.request,answers,comment,void 0,resolvedBy),!1):!1},cancel(reason="cancelled"){return terminal2!==void 0?terminal2:settle(buildResponse(reason,options.request,draftAnswers,draftComment),!1)},timeout(){return terminal2!==void 0?terminal2:fireTimeout()},get state(){return terminal2?.status??"pending"},get deadlineAtMs(){return deadlineAtMs},remainingMs(now2){return Math.max(0,deadlineAtMs-now2)},get result(){return terminal2}}}var renderCall=(args,theme2)=>{let values=typeof args=="object"&&args!==null?args:{},headers="questions"in values&&Array.isArray(values.questions)?values.questions.map(q=>typeof q=="object"&&q!==null&&"header"in q?`[${q.header}]`:"[Question]").join(" "):"Question",wait="waitForAnswer"in values&&values.waitForAnswer===!0||"wait_for_answer"in values&&values.wait_for_answer===!0;return new Text(`${theme2.fg("toolTitle",headers)} ${wait?"wait for answer":"answer later"}`,0,0)},renderResult=result3=>{let details=result3.details,summary="",words4=toolResultUserWords({details});return typeof details=="object"&&details!==null&&"status"in details&&(summary=String(details.status),"answers"in details&&typeof details.answers=="object"&&details.answers!==null&&(summary+=`; ${Object.keys(details.answers).length} answered`),"unanswered"in details&&Array.isArray(details.unanswered)&&(summary+=`; ${details.unanswered.length} unanswered`)),new Text([summary,...result3.content.flatMap(c=>c.type==="text"?[resolveUserWordReferences(c.text,words4)]:[])].filter(Boolean).join(`
789
- `),0,0)};function askUserRenderers(toolName){return Object.values(TOOL_NAMES).includes(toolName)?{renderCall,renderResult}:void 0}var REASK="The user did not answer the previous question this turn; continue without asking again.";function result(variant,response,request2,text2){return{content:[{type:"text",text:text2??formatModelAnswer(response,request2.requestId,request2.questions).text}],details:formatResultDetails(variant,response,request2.requestId,request2.questions)}}function deliverAnswer(pi,ctx,request2,response,variant){response.status!=="cancelled"&&(pi.sendUserMessage(formatUserMessage(response,request2.requestId,request2.questions),{deliverAs:ctx.isIdle()?"followUp":"steer"}),emitAskUserNotification(pi,ctx,request2,response,variant))}function emitWake(pi,sessionId){let entries=getPendingQuestions(sessionId).filter(e=>!e.request.waitForAnswer),event={source:"ask-user",activeCount:entries.length,items:entries.map(e=>({id:e.request.requestId,deadlineAtMs:e.pending.deadlineAtMs,description:e.request.questions.map(q=>q.header).join(", ")}))};pi.events.emit(WAKE_SOURCE_STATE_EVENT,event)}function startQuestion(initialPi,initialCtx,request2,signal,initialState,variant,{resuming=!1}={}){let pi=initialPi,ctx=initialCtx,state=initialState,notify2=ctx.ui.notify.bind(ctx.ui);if(!ctx.ui.question&&!resuming)throw new Error("Question UI is unavailable");let sessionId=ctx.sessionManager.getSessionId(),existing=getPendingQuestions(sessionId).find(entry=>entry.request.requestId===request2.requestId);if(existing)return existing.completion;let orphaned=()=>({status:"orphaned-after-restart",answers:{},unanswered:request2.questions.map(question2=>question2.id)}),controller=new AbortController,attached=!0,ownerBound=!0,generation2=0,completion=Promise.withResolvers(),settled=!1,unregister=()=>{},publish=(ownerPi,ownerCtx,response)=>{emitAskUserClosed(ownerPi,request2.requestId,response),request2.waitForAnswer||ownerPi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:request2.requestId,status:response.status}),(!request2.waitForAnswer||resuming)&&deliverAnswer(ownerPi,ownerCtx,request2,response,variant)},finish=response=>{if(settled)return;settled=!0,response.status==="timed_out"&&(state.timedOut=!0),unregister(),signal?.removeEventListener("abort",abort),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit("herdr:blocked",{active:!1,id:request2.requestId}),ownerBound?publish(pi,ctx,response):(queueQuestionOutcome(sessionId,(nextPi,nextCtx)=>publish(nextPi,nextCtx,response)),response.status!=="cancelled"&&notify2(`Question ${request2.requestId} ended (${response.status}) while reload was incomplete. Its outcome will reach the model when the session starts again.`,"error")),completion.resolve(response);let abortReason3=response.status;controller.abort(abortReason3)},pending=createPendingQuestion({request:request2,now:Date.now,idleTimeoutMs:request2.timeoutMs,onTimeout:finish}),cancel2=(message,reportDetachedLoss=!1)=>{let lost3=!attached&&reportDetachedLoss,response=pending.cancel(lost3?"orphaned-after-restart":"cancelled");finish(message?{...response,comment:message}:response),lost3&&notify2(message??"The pending question could not be restored.","error")},abort=()=>cancel2();unregister=registerPendingQuestion(sessionId,{request:request2,pending,completion:completion.promise,cancel:cancel2,detach(){!attached||settled||(attached=!1,ownerBound=!1,generation2++,controller.abort("reload"))},rebind(nextPi,nextCtx,nextState){pi=nextPi,ctx=nextCtx,state=nextState,notify2=ctx.ui.notify.bind(ctx.ui),ownerBound=!0},reattach(){attached||settled||(attached=!0,controller=new AbortController,attach())}}),pi.appendEntry(ASK_USER_QUESTION_ENTRY,{requestId:request2.requestId,headers:request2.questions.map(question2=>question2.header)}),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit(ASK_USER_ASKED_EVENT,{ctx,request:request2,variant});let first=request2.questions[0];pi.events.emit("herdr:blocked",{active:!0,label:first?`${first.header} \u2014 ${first.question}`:"Question",id:request2.requestId}),signal?.addEventListener("abort",abort,{once:!0});let draft={answers:{}},opts={timeout:request2.timeoutMs,signal:controller.signal,deliver:request2.waitForAnswer?"tool-result":"user-message",hardDeadlineAtMs:Date.now()+72e5,getDeadlineAtMs:()=>pending.deadlineAtMs,onProgress:progress=>{draft={...draft,...progress,answers:progress.answers??draft.answers},pending.touch(draft),request2.waitForAnswer||emitWake(pi,sessionId)}},accept=response=>{if(!settled){if(pending.touch({answers:response.answers,comment:response.comment}),response.status==="timed_out"){finish(response),pending.timeout();return}response.status==="answered"||response.status==="comment-submitted"?(pending.submit(response.answers,response.comment,response.resolvedBy),pending.state==="pending"&&pending.cancel()):pending.cancel(response.status),finish(response)}},fail=error2=>{if(settled)return;let message=`Question UI failed: ${error2 instanceof Error?error2.message:String(error2)}`;if(resuming||generation2>0){accept({...orphaned(),comment:message}),ctx.ui.notify(message,"error");return}cancel2(message),ctx.ui.notify(message,"error")},attach=()=>{let currentGeneration=generation2,currentQuestion=ctx.ui.question;if(!currentQuestion){accept(orphaned()),generation2>0&&ctx.ui.notify("The pending question could not be restored: question UI is unavailable.","error");return}try{currentQuestion.call(ctx.ui,request2,{...opts,signal:controller.signal,timeout:currentGeneration===0?request2.timeoutMs:pending.remainingMs(Date.now()),initialDraft:draft,onProgress:progress=>{attached&&generation2===currentGeneration&&opts.onProgress(progress)}}).then(response=>{attached&&generation2===currentGeneration&&accept(response)},error2=>{attached&&generation2===currentGeneration&&fail(error2)})}catch(error2){fail(error2)}};return signal?.aborted?abort():attach(),completion.promise}function createAskUserTool(variant,pi,state){let flag=variant==="codex"?"wait_for_answer":"waitForAnswer",opener=variant==="codex"?"Request user input for one to three short questions.":"Ask the user one to four concise questions.";return{name:TOOL_NAMES[variant],label:"Ask user",exposure:"direct",allowLazyActivation:!1,parameters:variant==="codex"?CODEX_PARAMS:CLAUDE_PARAMS,promptSnippet:"Ask a material question, explicitly choosing whether to wait or receive the answer later.",description:`${opener} Set ${flag} true to pause here until the user answers (the answer returns as this tool's result, or a timeout result after 30 idle minutes); set ${flag} false to keep working while the question stays open (the answer arrives later as a user message). Use it only when the answer materially changes the work; if it returns no answers, continue with best judgment instead of asking again. Never use it for permission requests; ask those directly in your message. Unavailable to subagents.${variant==="claude"?" Users will always be able to type a free-text answer or one comment covering everything; do not add an Other option.":""} Call this tool directly, never from inside an eval cell (a cell that waits on the user would hold the kernel).`,prepareArguments(args){return toCanonical(variant,args),args},async execute(toolCallId,params,signal,_onUpdate,ctx){let request2;try{request2=toCanonical(variant,params,{requestId:toolCallId,timeoutMs:(ctx.getAskUserSettings?.().timeoutMinutes??30)*6e4})}catch(error2){if(!(error2 instanceof AskUserSchemaError))throw error2;return emitAskUserClosed(pi,toolCallId,{status:"unavailable"}),{content:[{type:"text",text:error2.message}],details:{status:"unavailable"}}}let unavailable={status:"unavailable",answers:{},unanswered:request2.questions.map(q=>q.id)};if(state.timedOut)return emitAskUserClosed(pi,request2.requestId,unavailable),result(variant,unavailable,request2,REASK);if(state.unavailable||ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0||ctx.mode==="print"||ctx.mode==="json"||!ctx.ui.question)return state.unavailable=!0,pi.setActiveTools(pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name))),emitAskUserClosed(pi,request2.requestId,unavailable),result(variant,unavailable,request2);let completion=startQuestion(pi,ctx,request2,signal,state,variant);if(!request2.waitForAnswer)return{content:[{type:"text",text:"Question accepted; the answer will arrive as a user message."}],details:{accepted:!0,requestId:request2.requestId,status:"pending"}};let response=await completion;return response.status!=="cancelled"&&emitAskUserNotification(pi,ctx,request2,response,variant),result(variant,response,request2,response.status==="cancelled"&&response.comment?response.comment:void 0)},renderCall,renderResult}}var ASK_USER_RESUMED_ENTRY="ask-user:resumed";function isRecord13(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function variantFor(name){if(name===TOOL_NAMES.claude)return"claude";if(name===TOOL_NAMES.codex)return"codex"}function findDanglingQuestions(entries){let results=new Set,accepted=new Set,resumed=new Set,settled=new Set;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){let content=entry.message.content,texts=typeof content=="string"?[content]:content.flatMap(part=>part.type==="text"?[part.text]:[]);for(let text2 of texts){let frame2=parseAskUserAnswerFrame(text2);frame2&&settled.add(frame2.requestId)}}if(entry.type==="custom"&&entry.customType===ASK_USER_RESUMED_ENTRY&&isRecord13(entry.data)){let toolCallId=entry.data.toolCallId;typeof toolCallId=="string"&&resumed.add(toolCallId)}if(entry.type==="message"&&entry.message.role==="toolResult"){results.add(entry.message.toolCallId);let details=entry.message.details;!entry.message.isError&&isRecord13(details)&&details.accepted===!0&&details.status==="pending"&&accepted.add(entry.message.toolCallId)}entry.type==="custom"&&entry.customType===ASK_USER_SETTLEMENT_ENTRY&&isRecord13(entry.data)&&typeof entry.data.requestId=="string"&&settled.add(entry.data.requestId)}let dangling=[];for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type!=="message"||entry.message.role!=="assistant")continue;let content=entry.message.content;for(let blockIndex=content.length-1;blockIndex>=0;blockIndex--){let block=content[blockIndex];if(block?.type!=="toolCall"||block.incomplete===!0)continue;let variant=variantFor(block.name);if(!variant||settled.has(block.id))continue;let call={toolCallId:block.id,variant,args:block.arguments},request2=requestFromCall(call,DEFAULT_ASK_USER_TIMEOUT_MS);results.has(block.id)&&(request2?.waitForAnswer===!0||!accepted.has(block.id))||resumed.has(block.id)||dangling.push(call)}}return dangling}function requestFromCall(dangling,timeoutMs){try{return toCanonical(dangling.variant,dangling.args,{requestId:dangling.toolCallId,timeoutMs})}catch{return}}function settleUnrestorable(pi,ctx,dangling,timeoutMs){let lost3={requestId:dangling.toolCallId,questions:[],waitForAnswer:!1,timeoutMs},response={status:"orphaned-after-restart",answers:{},unanswered:[]};pi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:lost3.requestId,status:response.status}),emitAskUserClosed(pi,lost3.requestId,response),deliverAnswer(pi,ctx,lost3,response,dangling.variant)}async function resumeDanglingQuestion(pi,event,ctx){if(event.reason!=="resume"&&event.reason!=="reload")return;let pending=new Set(getPendingQuestions(ctx.sessionManager.getSessionId()).map(entry=>entry.request.requestId)),timeoutMs=(ctx.getAskUserSettings?.().timeoutMinutes??DEFAULT_ASK_USER_TIMEOUT_MS/6e4)*6e4;for(let dangling of findDanglingQuestions(ctx.sessionManager.getBranch())){if(pending.has(dangling.toolCallId))continue;pending.add(dangling.toolCallId),pi.appendEntry(ASK_USER_RESUMED_ENTRY,{toolCallId:dangling.toolCallId});let request2=requestFromCall(dangling,timeoutMs);if(!request2){settleUnrestorable(pi,ctx,dangling,timeoutMs);continue}startQuestion(pi,ctx,request2,ctx.signal,{timedOut:!1,unavailable:!1},dangling.variant,{resuming:!0})}}function askUserExtension(pi){pi.registerFlag("no-ask-user",{description:"Disable the built-in question tool.",type:"boolean",default:!1}),pi.registerCommand("answer",{description:"Open the pending question",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify(`/answer opens the pending question in the TUI; run ${APP_NAME} in TUI mode to use it.`,"info");return}}});let state={timedOut:!1,unavailable:!1},registered=!1,cancelPending=(ctx,message,reportDetachedLoss=!1)=>{for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.cancel(message,reportDetachedLoss)},sync=(ctx,model=ctx.model)=>{let rest=pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name));if(ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0){cancelPending(ctx,"The pending question was cancelled because ask-user is disabled.",!0),pi.setActiveTools(rest);return}registered||(pi.registerTool(createAskUserTool("codex",pi,state)),pi.registerTool(createAskUserTool("claude",pi,state)),registered=!0),pi.setActiveTools(state.unavailable?rest:[...rest,TOOL_NAMES[pickVariant(model)]])};pi.on("session_start",async(event,ctx)=>{state.timedOut=!1,state.unavailable=!1;let sessionId=ctx.sessionManager.getSessionId();for(let entry of getPendingQuestions(sessionId))entry.rebind(pi,ctx,state);deliverQueuedQuestionOutcomes(sessionId,pi,ctx),sync(ctx);for(let entry of getPendingQuestions(sessionId))entry.reattach();resumeDanglingQuestion(pi,event,ctx)}),pi.on("model_select",async(event,ctx)=>{sync(ctx,event.model)}),pi.on("agent_end",async()=>{state.timedOut=!1}),pi.on("session_shutdown",async(event,ctx)=>{if(event.reason==="reload"){for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.detach();return}cancelPending(ctx,"The pending question was cancelled because the session closed.")})}function resolveForegroundWindowSeconds(env){let parsed=Number.parseFloat(env.PI_BASH_FOREGROUND_SECONDS??"");return!Number.isFinite(parsed)||parsed<=0?60:parsed}function parsePositiveInt(value2){if(!value2)return;let parsed=Number.parseInt(value2,10);if(!(!Number.isFinite(parsed)||parsed<=0))return parsed}function resolveBashTimeoutDefaults(env){let{PI_BASH_DEFAULT_TIMEOUT_SECONDS:defaultTimeout,PI_BASH_MAX_TIMEOUT_SECONDS:maxTimeout}=env,defaultSeconds=parsePositiveInt(defaultTimeout)??1800,rawMax=parsePositiveInt(maxTimeout)??1800,maxSeconds=Math.max(rawMax,defaultSeconds);return{defaultSeconds,maxSeconds}}function applyBashTimeout(input,defaults){let current=input.timeout;return current===void 0||current<=0?{...input,timeout:defaults.defaultSeconds}:input}function buildBashTimeoutPrompt(defaults,options={}){let{foregroundWindowSeconds}=options,minutes=seconds=>seconds%60===0?`${seconds/60} min`:`${seconds}s`,detachRules=foregroundWindowSeconds===void 0?"":`
790
+ `),0,0)};function askUserRenderers(toolName){return Object.values(TOOL_NAMES).includes(toolName)?{renderCall,renderResult}:void 0}var REASK="The user did not answer the previous question this turn; continue without asking again.",REASK_REQUIRED="The user did not answer the previous question this turn, so this one gets no answer either. No answer: do not take the action it gates. Keep that action pending and end the turn.";function result(variant,response,request2,text2){return{content:[{type:"text",text:text2??formatModelAnswer(response,request2.requestId,request2.questions,request2.required===!0).text}],details:formatResultDetails(variant,response,request2.requestId,request2.questions,request2.required===!0)}}function deliverAnswer(pi,ctx,request2,response,variant){response.status!=="cancelled"&&(pi.sendUserMessage(formatUserMessage(response,request2.requestId,request2.questions,request2.required===!0),{deliverAs:ctx.isIdle()?"followUp":"steer"}),emitAskUserNotification(pi,ctx,request2,response,variant))}function emitWake(pi,sessionId){let entries=getPendingQuestions(sessionId).filter(e=>!e.request.waitForAnswer),event={source:"ask-user",activeCount:entries.length,items:entries.map(e=>({id:e.request.requestId,deadlineAtMs:e.pending.deadlineAtMs,description:e.request.questions.map(q=>q.header).join(", ")}))};pi.events.emit(WAKE_SOURCE_STATE_EVENT,event)}function startQuestion(initialPi,initialCtx,request2,signal,initialState,variant,{resuming=!1}={}){let pi=initialPi,ctx=initialCtx,state=initialState,notify2=ctx.ui.notify.bind(ctx.ui);if(!ctx.ui.question&&!resuming)throw new Error("Question UI is unavailable");let sessionId=ctx.sessionManager.getSessionId(),existing=getPendingQuestions(sessionId).find(entry=>entry.request.requestId===request2.requestId);if(existing)return existing.completion;let orphaned=()=>({status:"orphaned-after-restart",answers:{},unanswered:request2.questions.map(question2=>question2.id)}),controller=new AbortController,attached=!0,ownerBound=!0,generation2=0,completion=Promise.withResolvers(),settled=!1,unregister=()=>{},publish=(ownerPi,ownerCtx,response)=>{emitAskUserClosed(ownerPi,request2.requestId,response),request2.waitForAnswer||ownerPi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:request2.requestId,status:response.status}),(!request2.waitForAnswer||resuming)&&deliverAnswer(ownerPi,ownerCtx,request2,response,variant)},finish=response=>{if(settled)return;settled=!0,response.status==="timed_out"&&(state.timedOut=!0),unregister(),signal?.removeEventListener("abort",abort),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit("herdr:blocked",{active:!1,id:request2.requestId}),ownerBound?publish(pi,ctx,response):(queueQuestionOutcome(sessionId,(nextPi,nextCtx)=>publish(nextPi,nextCtx,response)),response.status!=="cancelled"&&notify2(`Question ${request2.requestId} ended (${response.status}) while reload was incomplete. Its outcome will reach the model when the session starts again.`,"error")),completion.resolve(response);let abortReason3=response.status;controller.abort(abortReason3)},pending=createPendingQuestion({request:request2,now:Date.now,idleTimeoutMs:request2.timeoutMs,onTimeout:finish}),cancel2=(message,reportDetachedLoss=!1)=>{let lost3=!attached&&reportDetachedLoss,response=pending.cancel(lost3?"orphaned-after-restart":"cancelled");finish(message?{...response,comment:message}:response),lost3&&notify2(message??"The pending question could not be restored.","error")},abort=()=>cancel2();unregister=registerPendingQuestion(sessionId,{request:request2,pending,completion:completion.promise,cancel:cancel2,detach(){!attached||settled||(attached=!1,ownerBound=!1,generation2++,controller.abort("reload"))},rebind(nextPi,nextCtx,nextState){pi=nextPi,ctx=nextCtx,state=nextState,notify2=ctx.ui.notify.bind(ctx.ui),ownerBound=!0},reattach(){attached||settled||(attached=!0,controller=new AbortController,attach())}}),pi.appendEntry(ASK_USER_QUESTION_ENTRY,{requestId:request2.requestId,headers:request2.questions.map(question2=>question2.header)}),request2.waitForAnswer||emitWake(pi,sessionId),pi.events.emit(ASK_USER_ASKED_EVENT,{ctx,request:request2,variant});let first=request2.questions[0];pi.events.emit("herdr:blocked",{active:!0,label:first?`${first.header} \u2014 ${first.question}`:"Question",id:request2.requestId}),signal?.addEventListener("abort",abort,{once:!0});let draft={answers:{}},opts={timeout:request2.timeoutMs,signal:controller.signal,deliver:request2.waitForAnswer?"tool-result":"user-message",hardDeadlineAtMs:Date.now()+72e5,getDeadlineAtMs:()=>pending.deadlineAtMs,onProgress:progress=>{draft={...draft,...progress,answers:progress.answers??draft.answers},pending.touch(draft),request2.waitForAnswer||emitWake(pi,sessionId)}},accept=response=>{if(!settled){if(pending.touch({answers:response.answers,comment:response.comment}),response.status==="timed_out"){finish(response),pending.timeout();return}response.status==="answered"||response.status==="comment-submitted"?(pending.submit(response.answers,response.comment,response.resolvedBy),pending.state==="pending"&&pending.cancel()):pending.cancel(response.status),finish(response)}},fail=error2=>{if(settled)return;let message=`Question UI failed: ${error2 instanceof Error?error2.message:String(error2)}`;if(resuming||generation2>0){accept({...orphaned(),comment:message}),ctx.ui.notify(message,"error");return}cancel2(message),ctx.ui.notify(message,"error")},attach=()=>{let currentGeneration=generation2,currentQuestion=ctx.ui.question;if(!currentQuestion){accept(orphaned()),generation2>0&&ctx.ui.notify("The pending question could not be restored: question UI is unavailable.","error");return}try{currentQuestion.call(ctx.ui,request2,{...opts,signal:controller.signal,timeout:currentGeneration===0?request2.timeoutMs:pending.remainingMs(Date.now()),initialDraft:draft,onProgress:progress=>{attached&&generation2===currentGeneration&&opts.onProgress(progress)}}).then(response=>{attached&&generation2===currentGeneration&&accept(response)},error2=>{attached&&generation2===currentGeneration&&fail(error2)})}catch(error2){fail(error2)}};return signal?.aborted?abort():attach(),completion.promise}function createAskUserTool(variant,pi,state){let flag=variant==="codex"?"wait_for_answer":"waitForAnswer",opener=variant==="codex"?"Request user input for one to three short questions.":"Ask the user one to four concise questions.";return{name:TOOL_NAMES[variant],label:"Ask user",exposure:"direct",allowLazyActivation:!1,parameters:variant==="codex"?CODEX_PARAMS:CLAUDE_PARAMS,promptSnippet:"Ask a material question, explicitly choosing whether to wait or receive the answer later.",description:`${opener} Set ${flag} true to pause here until the user answers (the answer returns as this tool's result, or a timeout result after 30 idle minutes); set ${flag} false to keep working while the question stays open (the answer arrives later as a user message). Use it only when the answer materially changes the work; if it returns no answers, continue with best judgment instead of asking again, unless you set required true because the answer decides whether you take an action: then no answer means do not take it. Never use it for permission requests; ask those directly in your message. Unavailable to subagents.${variant==="claude"?" Users will always be able to type a free-text answer or one comment covering everything; do not add an Other option.":""} Call this tool directly, never from inside an eval cell (a cell that waits on the user would hold the kernel).`,prepareArguments(args){return toCanonical(variant,args),args},async execute(toolCallId,params,signal,_onUpdate,ctx){let request2;try{request2=toCanonical(variant,params,{requestId:toolCallId,timeoutMs:(ctx.getAskUserSettings?.().timeoutMinutes??30)*6e4})}catch(error2){if(!(error2 instanceof AskUserSchemaError))throw error2;return emitAskUserClosed(pi,toolCallId,{status:"unavailable"}),{content:[{type:"text",text:error2.message}],details:{status:"unavailable"}}}let unavailable={status:"unavailable",answers:{},unanswered:request2.questions.map(q=>q.id)};if(state.timedOut)return emitAskUserClosed(pi,request2.requestId,unavailable),result(variant,unavailable,request2,request2.required===!0?REASK_REQUIRED:REASK);if(state.unavailable||ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0||ctx.mode==="print"||ctx.mode==="json"||!ctx.ui.question)return state.unavailable=!0,pi.setActiveTools(pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name))),emitAskUserClosed(pi,request2.requestId,unavailable),result(variant,unavailable,request2);let completion=startQuestion(pi,ctx,request2,signal,state,variant);if(!request2.waitForAnswer)return{content:[{type:"text",text:"Question accepted; the answer will arrive as a user message."}],details:{accepted:!0,requestId:request2.requestId,status:"pending"}};let response=await completion;return response.status!=="cancelled"&&emitAskUserNotification(pi,ctx,request2,response,variant),result(variant,response,request2,response.status==="cancelled"&&response.comment?request2.required===!0?formatGatedCancellation(response.comment,response,request2.requestId,request2.questions):response.comment:void 0)},renderCall,renderResult}}var ASK_USER_RESUMED_ENTRY="ask-user:resumed";function isRecord13(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function variantFor(name){if(name===TOOL_NAMES.claude)return"claude";if(name===TOOL_NAMES.codex)return"codex"}function findDanglingQuestions(entries){let results=new Set,accepted=new Set,resumed=new Set,settled=new Set;for(let entry of entries){if(entry.type==="message"&&entry.message.role==="user"){let content=entry.message.content,texts=typeof content=="string"?[content]:content.flatMap(part=>part.type==="text"?[part.text]:[]);for(let text2 of texts){let frame2=parseAskUserAnswerFrame(text2);frame2&&settled.add(frame2.requestId)}}if(entry.type==="custom"&&entry.customType===ASK_USER_RESUMED_ENTRY&&isRecord13(entry.data)){let toolCallId=entry.data.toolCallId;typeof toolCallId=="string"&&resumed.add(toolCallId)}if(entry.type==="message"&&entry.message.role==="toolResult"){results.add(entry.message.toolCallId);let details=entry.message.details;!entry.message.isError&&isRecord13(details)&&details.accepted===!0&&details.status==="pending"&&accepted.add(entry.message.toolCallId)}entry.type==="custom"&&entry.customType===ASK_USER_SETTLEMENT_ENTRY&&isRecord13(entry.data)&&typeof entry.data.requestId=="string"&&settled.add(entry.data.requestId)}let dangling=[];for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry?.type!=="message"||entry.message.role!=="assistant")continue;let content=entry.message.content;for(let blockIndex=content.length-1;blockIndex>=0;blockIndex--){let block=content[blockIndex];if(block?.type!=="toolCall"||block.incomplete===!0)continue;let variant=variantFor(block.name);if(!variant||settled.has(block.id))continue;let call={toolCallId:block.id,variant,args:block.arguments},request2=requestFromCall(call,DEFAULT_ASK_USER_TIMEOUT_MS);results.has(block.id)&&(request2?.waitForAnswer===!0||!accepted.has(block.id))||resumed.has(block.id)||dangling.push(call)}}return dangling}function requestFromCall(dangling,timeoutMs){try{return toCanonical(dangling.variant,dangling.args,{requestId:dangling.toolCallId,timeoutMs})}catch{return}}function settleUnrestorable(pi,ctx,dangling,timeoutMs){let required=isRecord13(dangling.args)&&dangling.args.required===!0,lost3={requestId:dangling.toolCallId,questions:[],waitForAnswer:!1,timeoutMs,...required?{required:!0}:{}},response={status:"orphaned-after-restart",answers:{},unanswered:[]};pi.appendEntry(ASK_USER_SETTLEMENT_ENTRY,{requestId:lost3.requestId,status:response.status}),emitAskUserClosed(pi,lost3.requestId,response),deliverAnswer(pi,ctx,lost3,response,dangling.variant)}async function resumeDanglingQuestion(pi,event,ctx){if(event.reason!=="resume"&&event.reason!=="reload")return;let pending=new Set(getPendingQuestions(ctx.sessionManager.getSessionId()).map(entry=>entry.request.requestId)),timeoutMs=(ctx.getAskUserSettings?.().timeoutMinutes??DEFAULT_ASK_USER_TIMEOUT_MS/6e4)*6e4;for(let dangling of findDanglingQuestions(ctx.sessionManager.getBranch())){if(pending.has(dangling.toolCallId))continue;pending.add(dangling.toolCallId),pi.appendEntry(ASK_USER_RESUMED_ENTRY,{toolCallId:dangling.toolCallId});let request2=requestFromCall(dangling,timeoutMs);if(!request2){settleUnrestorable(pi,ctx,dangling,timeoutMs);continue}startQuestion(pi,ctx,request2,ctx.signal,{timedOut:!1,unavailable:!1},dangling.variant,{resuming:!0})}}function askUserExtension(pi){pi.registerFlag("no-ask-user",{description:"Disable the built-in question tool.",type:"boolean",default:!1}),pi.registerCommand("answer",{description:"Open the pending question",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify(`/answer opens the pending question in the TUI; run ${APP_NAME} in TUI mode to use it.`,"info");return}}});let state={timedOut:!1,unavailable:!1},registered=!1,cancelPending=(ctx,message,reportDetachedLoss=!1)=>{for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.cancel(message,reportDetachedLoss)},sync=(ctx,model=ctx.model)=>{let rest=pi.getActiveTools().filter(name=>!Object.values(TOOL_NAMES).includes(name));if(ctx.getAskUserSettings?.().enabled===!1||pi.getFlag("no-ask-user")===!0){cancelPending(ctx,"The pending question was cancelled because ask-user is disabled.",!0),pi.setActiveTools(rest);return}registered||(pi.registerTool(createAskUserTool("codex",pi,state)),pi.registerTool(createAskUserTool("claude",pi,state)),registered=!0),pi.setActiveTools(state.unavailable?rest:[...rest,TOOL_NAMES[pickVariant(model)]])};pi.on("session_start",async(event,ctx)=>{state.timedOut=!1,state.unavailable=!1;let sessionId=ctx.sessionManager.getSessionId();for(let entry of getPendingQuestions(sessionId))entry.rebind(pi,ctx,state);deliverQueuedQuestionOutcomes(sessionId,pi,ctx),sync(ctx);for(let entry of getPendingQuestions(sessionId))entry.reattach();resumeDanglingQuestion(pi,event,ctx)}),pi.on("model_select",async(event,ctx)=>{sync(ctx,event.model)}),pi.on("agent_end",async()=>{state.timedOut=!1}),pi.on("session_shutdown",async(event,ctx)=>{if(event.reason==="reload"){for(let entry of getPendingQuestions(ctx.sessionManager.getSessionId()))entry.detach();return}cancelPending(ctx,"The pending question was cancelled because the session closed.")})}function resolveForegroundWindowSeconds(env){let parsed=Number.parseFloat(env.PI_BASH_FOREGROUND_SECONDS??"");return!Number.isFinite(parsed)||parsed<=0?60:parsed}function parsePositiveInt(value2){if(!value2)return;let parsed=Number.parseInt(value2,10);if(!(!Number.isFinite(parsed)||parsed<=0))return parsed}function resolveBashTimeoutDefaults(env){let{PI_BASH_DEFAULT_TIMEOUT_SECONDS:defaultTimeout,PI_BASH_MAX_TIMEOUT_SECONDS:maxTimeout}=env,defaultSeconds=parsePositiveInt(defaultTimeout)??1800,rawMax=parsePositiveInt(maxTimeout)??1800,maxSeconds=Math.max(rawMax,defaultSeconds);return{defaultSeconds,maxSeconds}}function applyBashTimeout(input,defaults){let current=input.timeout;return current===void 0||current<=0?{...input,timeout:defaults.defaultSeconds}:input}function buildBashTimeoutPrompt(defaults,options={}){let{foregroundWindowSeconds}=options,minutes=seconds=>seconds%60===0?`${seconds/60} min`:`${seconds}s`,detachRules=foregroundWindowSeconds===void 0?"":`
790
791
  - Foreground blocking stops at the ~${foregroundWindowSeconds}s window. A command still running then auto-detaches alive to a background session with a \`bash_id\` and keeps running until it exits or hits the kill deadline; the session tools in the terminal section steer or stop it.`;return`
791
792
  ## Bash Tool Timeout Policy
792
793
 
@@ -1048,13 +1049,7 @@ ${value2.verificationUri}`:typeof value2.message=="string"?value2.message:"Curso
1048
1049
  `);for(let index=context.messages.length-1;index>=0;index-=1){let message=context.messages[index];if(message?.role==="user")return userText(message)}throw new Error("cursor-cli-oauth needs a user message to prompt the Cursor CLI")}function recapExchanges(context){let exchanges=[];for(let message of context.messages)if(message.role==="user"){let text2=typeof message.content=="string"?message.content:blockText(message.content);text2.length>0&&exchanges.push({role:"user",text:text2})}else if(message.role==="assistant"){let text2=blockText(message.content);text2.length>0&&exchanges.push({role:"assistant",text:text2})}return exchanges.slice(-RECENT_EXCHANGE_LIMIT)}function isFailoverNotice(event){return event.type==="cursor_account_changed"}function isRestartNotice(event){return event.type==="cursor_chat_restarted"}function turnErrorMessage(error2){let detail=error2;for(let depth=0;depth<3&&typeof detail=="object"&&detail!==null;depth+=1){let wrapper=detail;if(wrapper.original!==void 0)detail=wrapper.original;else if(wrapper.thrown!==void 0)detail=wrapper.thrown;else break}if(detail instanceof Error)return detail.message;if(typeof detail=="string")return detail;let message=detail?.message;return typeof message=="string"&&message.length>0?message:"Cursor CLI turn failed"}function streamCursorCliOauth(model,context,options,deps={}){let stream2=createAssistantMessageEventStream();return(async()=>{let mapper={stream:stream2,output:emptyCursorCliOutput(model),started:!1,openKind:void 0,openIndex:-1,openText:"",textAccumulated:""},now2=deps.now??Date.now,cwdDirectory=deps.cwd??process.cwd(),agentDir=deps.agentDir??getAgentDir(),store=deps.store??AuthStorage.create(),router=deps.router??cursorCliSessionRouter,signal=options?.signal,wasAborted=signal?.aborted===!0,sentPromptTokens=0,runningHandle,handleRunning=!1,onAbort=()=>{wasAborted=!0};wasAborted||signal?.addEventListener("abort",onAbort,{once:!0});try{let settings=deps.settings??loadCursorCliOauthProviderSettingsFromDisk(cwdDirectory);if(settings.explicitlyDisabled)throw new Error(DISABLED_MESSAGE);let executableDeps={...defaultCursorAgentExecutableDeps(),settings:{executablePath:settings.executablePath}};try{resolveCursorAgentExecutable(deps.executableDeps??executableDeps)}catch(error2){throw cursorAgentNotInstalledError(error2)}let guardrailSession=createCursorCliGuardrailSession(),policy=resolveCursorCliExecutionPolicy({forceExecution:settings.forceExecution,noApprovalAcknowledgedAt:settings.noApprovalAcknowledgedAt,executionMode:settings.executionMode,sandboxMode:settings.sandboxMode},guardrailSession,settings.denyCommands??[]);if(policy.status==="refused")throw new CursorCliExecutionRefusalError(policy.refusal);for(let warning of policy.warnings)appendNotice(mapper,warning.message);let stored=await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),storedAccounts3=stored?.type==="oauth"?listAccounts2(stored):[];if(!isCursorCliOauthLaneEnabled(settings,storedAccounts3.length))throw new Error(DISABLED_MESSAGE);if(storedAccounts3.length===0)throw new Error(NO_ACCOUNTS_MESSAGE);let prompt=turnPrompt(context),senpiSessionId=options?.affinitySessionId??options?.sessionId??DEFAULT_CURSOR_AFFINITY_KEY,spawnModel=resolveCursorCliSpawnModel(model,options?.thinkingSelection),turnInput={prompt,model:spawnModel,recentExchanges:recapExchanges(context)},spawnAndStream=(attempt2,slot)=>{sentPromptTokens=estimateTokens2({role:"user",content:attempt2.prompt,timestamp:now2()});let buffer=new CursorCliEventBuffer;return(async()=>{let sawResult=!1,heldMalformed=[];try{await runInCursorAccountHome(agentDir,slot,async({home})=>{applyCursorCliDenyConfig(home,policy.denyCommands);let handle=spawnCursorCli({prompt:attempt2.prompt,model:spawnModel,resumeChatId:attempt2.resumeChatId,force:policy.force,executionMode:policy.executionMode,sandboxMode:policy.sandboxMode,accountHome:home,cwd:cwdDirectory,signal,executableDeps:deps.executableDeps??executableDeps});runningHandle=handle,handleRunning=!0,wasAborted&&handle.abort();try{for await(let event of handle.events){if(event instanceof CursorCliAbortError){buffer.fail(event);return}if(event.type==="result"&&(sawResult=!0),event.type==="malformed_stream"){heldMalformed.push(event);continue}buffer.push(event)}let outcome=await handle.completed;if(outcome.type==="completed"&&outcome.exitCode!==0&&!sawResult){buffer.fail(new CursorCliProcessFailureError(outcome.exitCode,outcome.stderr));return}for(let event of heldMalformed)buffer.push(event);buffer.close()}finally{handleRunning=!1}},deps.log),buffer.close()}catch(error2){buffer.fail(error2)}})(),buffer.events()},turn=runCursorCliFailover({store,providerId:CURSOR_CLI_OAUTH_PROVIDER_ID,affinity:{sessionId:senpiSessionId,pinnedAccount:settings.pinnedAccount,now:now2()},now:()=>now2(),runAttempt:async(selected,_options)=>{let slot=selected,current=await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID);if(current?.type==="oauth"){let fresh=current.accounts?.find(candidate=>candidate.name===slot.name);fresh&&(slot=fresh)}if(now2()>=slot.expires){let oauth=deps.oauth??createCursorCliOauthConfig({readCurrent:()=>store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),readSettings:()=>settings,resolveExecutable:oauthSettings=>resolveCursorAgentExecutable({...deps.executableDeps??executableDeps,settings:{executablePath:oauthSettings.executablePath}})}),storedCredential=current?.type==="oauth"?current:emptyCredential2(),refreshed=await oauth.refreshToken(storedCredential,signal??new AbortController().signal);await store.modify(CURSOR_CLI_OAUTH_PROVIDER_ID,async()=>refreshed);let reread=await store.read(CURSOR_CLI_OAUTH_PROVIDER_ID),updated=reread?.type==="oauth"?reread.accounts?.find(candidate=>candidate.name===slot.name):void 0;if(!updated)throw new Error(`cursor-cli-oauth account '${slot.name}' disappeared during token refresh`);slot=updated}return router.runTurn({senpiSessionId,accountName:slot.name,runAttempt:attempt2=>spawnAndStream(attempt2,slot),resumeMode:settings.resumeMode,contextRecapOnModelSwitch:settings.contextRecapOnModelSwitch,now:()=>now2()},turnInput)}});for await(let event of turn){if(isFailoverNotice(event)||isRestartNotice(event)){appendNotice(mapper,event.message);continue}switch(event.type){case"system":break;case"thinking":event.subtype==="completed"?mapper.openKind==="thinking"&&closeOpen(mapper):event.text.length>0&&(ensureOpen(mapper,"thinking"),pushThinkingDelta(mapper,event.text));break;case"assistant":for(let block of event.message.content)appendAssistantFragment(mapper,block.text);break;case"tool_call":resetTextSegment(mapper);break;case"result":event.subtype==="success"&&!event.is_error&&applyResultEvent(mapper,model,sentPromptTokens,event.usage,event.request_id,event.duration_ms);break;default:break}}closeOpen(mapper),stream2.push({type:"done",reason:"stop",message:mapper.output})}catch(error2){closeOpen(mapper);let aborted=wasAborted||signal?.aborted===!0;mapper.output.stopReason=aborted?"aborted":"error",mapper.output.errorMessage=turnErrorMessage(error2),stream2.push({type:"error",reason:mapper.output.stopReason,error:mapper.output})}finally{signal?.removeEventListener("abort",onAbort),handleRunning&&runningHandle?.abort(),stream2.end()}})(),stream2}var defaultResolveExecutable2=settings=>resolveCursorAgentExecutable({...defaultCursorAgentExecutableDeps(),settings});function registerCursorCliOauthExtension(pi,deps={}){let cwd=deps.cwd??process.cwd(),agentDir=deps.agentDir??getAgentDir(),store=deps.store??AuthStorage.create(),readCurrent=deps.readCurrent??createCursorCliOauthCredentialReader({store,readNativeCredential:deps.readNativeCredential??(()=>store.read("cursor")),canBootstrap:()=>{let settings=loadSettings(cwd);if(!settings.enabled||settings.explicitlyDisabled)return!1;try{return resolveExecutable(settings),!0}catch{return!1}}}),loadSettings=deps.loadSettings??loadCursorCliOauthProviderSettingsFromDisk,resolveExecutable=deps.resolveExecutable??defaultResolveExecutable2;registerCursorCliAccountCommand(pi);let register=models=>{pi.registerProvider(CURSOR_CLI_OAUTH_PROVIDER_ID,{baseUrl:CURSOR_CLI_OAUTH_PROVIDER_ID,api:CURSOR_CLI_OAUTH_PROVIDER_ID,models:models.map(entry=>({...entry})),streamSimple:(model,context,options)=>streamCursorCliOauth(model,toBuiltinProviderContext(context),options,{cwd,agentDir,store}),fallbackEligible:()=>{let current=loadSettings(cwd);return!current.explicitlyDisabled&&!cursorCliForceRefusalPending(current)},oauth:createCursorCliOauthConfig({readCurrent,readSettings:()=>loadSettings(cwd),resolveExecutable,persistAcknowledgement:acknowledgedAt=>persistCursorCliNoApprovalAcknowledgement(cwd,acknowledgedAt),persistEnabled:enabled=>persistCursorCliOauthEnabled(cwd,enabled)})})};register(STATIC_CURSOR_CLI_MODELS),refreshCursorCliModelCatalogForLane({agentDir,settings:loadSettings(cwd),readCurrent,resolveExecutable,...deps.runModelsProbe===void 0?{}:{runProbe:deps.runModelsProbe}}).then(models=>{if(models===void 0)return;models.map(entry=>entry.id).join(`
1049
1050
  `)!==STATIC_CURSOR_CLI_MODELS.map(entry=>entry.id).join(`
1050
1051
  `)&&register(models)}).catch(()=>{})}function cursorCliOauthExtension(pi){registerCursorCliOauthExtension(pi)}function diff_default(pi){pi.registerCommand("diff",{description:"Show git changes and open in VS Code diff view",handler:async(_args,ctx)=>{if(!ctx.hasUI){ctx.ui.notify("No UI available","error");return}let result3=await pi.exec("git",["status","--porcelain"],{cwd:ctx.cwd});if(result3.code!==0){ctx.ui.notify(`git status failed: ${result3.stderr}`,"error");return}if(!result3.stdout?.trim()){ctx.ui.notify("No changes in working tree","info");return}let lines=result3.stdout.split(`
1051
- `),files=[];for(let line of lines){if(line.length<4)continue;let status=line.slice(0,2),file=line.slice(2).trimStart(),statusLabel;status.includes("M")?statusLabel="M":status.includes("A")?statusLabel="A":status.includes("D")?statusLabel="D":status.includes("?")?statusLabel="?":status.includes("R")?statusLabel="R":status.includes("C")?statusLabel="C":statusLabel=status.trim()||"~",files.push({status:statusLabel,statusLabel,file})}if(files.length===0){ctx.ui.notify("No changes found","info");return}let WINDOWS_UNSAFE_CMD_CHARS_RE=/[&|<>^%\r\n]/,quoteCmdArg=value2=>`"${value2.replace(/"/g,'""')}"`,openWithCode=async file=>{if(process.platform==="win32"){if(WINDOWS_UNSAFE_CMD_CHARS_RE.test(file))return ctx.ui.notify(`Refusing to open ${file}: path contains Windows cmd metacharacters (& | < > ^ % or newline).`,"error"),null;let commandLine=`code ${quoteCmdArg(file)}`;return pi.exec("cmd",["/d","/s","/c",commandLine],{cwd:ctx.cwd})}return pi.exec("code",["-g",file],{cwd:ctx.cwd})},reportOpen=(file,openResult)=>{let openStderr=openResult.stderr.trim();openResult.code!==0?ctx.ui.notify(`Failed to open ${file} (exit ${openResult.code})${openStderr?`: ${openStderr}`:""}`,"error"):openStderr&&ctx.ui.notify(`code reported a problem opening ${file}: ${openStderr}`,"warning")},openSelected=async fileInfo=>{try{if(fileInfo.status==="?"){let openResult=await openWithCode(fileInfo.file);if(!openResult)return;reportOpen(fileInfo.file,openResult);return}let diffResult=await pi.exec("git",["difftool","-y","--tool=vscode",fileInfo.file],{cwd:ctx.cwd});if(diffResult.code!==0){let diffStderr=diffResult.stderr.trim();ctx.ui.notify(`Failed to show diff with vscode for ${fileInfo.file} (exit ${diffResult.code})${diffStderr?`: ${diffStderr}`:""}`,"error"),ctx.ui.notify("Troubleshooting: check git difftool config (e.g. `git config --get difftool.vscode.cmd`).","info");let openResult=await openWithCode(fileInfo.file);if(!openResult)return;reportOpen(fileInfo.file,openResult)}}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`Failed to open ${fileInfo.file}: ${message}`,"error")}};await ctx.ui.custom((tui,theme2,_kb,done)=>{let container=new Container;container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),container.addChild(new Text(theme2.fg("accent",theme2.bold(" Select file to diff")),0,0));let filesByValue=new Map,items=files.map((f,i)=>{let key=String(i);filesByValue.set(key,f);let statusColor2;switch(f.status){case"M":statusColor2=theme2.fg("warning",f.status);break;case"A":statusColor2=theme2.fg("success",f.status);break;case"D":statusColor2=theme2.fg("error",f.status);break;case"?":statusColor2=theme2.fg("muted",f.status);break;default:statusColor2=theme2.fg("dim",f.status)}return{value:key,label:`${statusColor2} ${f.file}`}}),visibleRows=Math.min(files.length,15),currentIndex=0,selectList=new SelectList(items,visibleRows,{selectedPrefix:t=>theme2.fg("accent",t),selectedText:t=>t,description:t=>theme2.fg("muted",t),scrollInfo:t=>theme2.fg("dim",t),noMatch:t=>theme2.fg("warning",t)});return selectList.onSelect=item=>{let fileInfo=filesByValue.get(item.value);fileInfo&&openSelected(fileInfo)},selectList.onCancel=()=>done(),selectList.onSelectionChange=item=>{currentIndex=items.indexOf(item)},container.addChild(selectList),container.addChild(new Text(theme2.fg("dim"," \u2191\u2193 navigate \u2022 \u2190\u2192 page \u2022 enter open \u2022 esc close"),0,0)),container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),{render:w=>container.render(w),invalidate:()=>container.invalidate(),handleInput:data=>{matchesKey(data,Key.left)?(currentIndex=Math.max(0,currentIndex-visibleRows),selectList.setSelectedIndex(currentIndex)):matchesKey(data,Key.right)?(currentIndex=Math.min(items.length-1,currentIndex+visibleRows),selectList.setSelectedIndex(currentIndex)):selectList.handleInput(data),tui.requestRender()}}})}})}function files_default(pi){pi.registerCommand("files",{description:"Show files read/written/edited in this session",handler:async(_args,ctx)=>{if(!ctx.hasUI){ctx.ui.notify("No UI available","error");return}let branch=ctx.sessionManager.getBranch(),toolCalls=new Map;for(let entry of branch){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="assistant"&&Array.isArray(msg.content)){for(let block of msg.content)if(block.type==="toolCall"){let name=block.name;if(name==="read"||name==="write"||name==="edit"){let path15=block.arguments?.path;path15&&typeof path15=="string"&&toolCalls.set(block.id,{paths:[path15],name,timestamp:msg.timestamp})}else if(name==="apply_patch"){let input=block.arguments?.input;if(typeof input=="string"){let paths=extractPatchedPaths(input);paths.length>0&&toolCalls.set(block.id,{paths,name:"edit",timestamp:msg.timestamp})}}}}}let fileMap=new Map;for(let entry of branch){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="toolResult"){let toolCall=toolCalls.get(msg.toolCallId);if(!toolCall)continue;let{paths,name}=toolCall,timestamp=msg.timestamp;for(let path15 of paths){let existing=fileMap.get(path15);existing?(existing.operations.add(name),timestamp>existing.lastTimestamp&&(existing.lastTimestamp=timestamp)):fileMap.set(path15,{path:path15,operations:new Set([name]),lastTimestamp:timestamp})}}}if(fileMap.size===0){ctx.ui.notify("No files read/written/edited in this session","info");return}let files=Array.from(fileMap.values()).sort((a,b)=>b.lastTimestamp-a.lastTimestamp),WINDOWS_UNSAFE_CMD_CHARS_RE=/[&|<>^%\r\n]/,quoteCmdArg=value2=>`"${value2.replace(/"/g,'""')}"`,openWithCode=async path15=>{if(process.platform==="win32"){if(WINDOWS_UNSAFE_CMD_CHARS_RE.test(path15))return ctx.ui.notify(`Refusing to open ${path15}: path contains Windows cmd metacharacters (& | < > ^ % or newline).`,"error"),null;let commandLine=`code ${quoteCmdArg(path15)}`;return pi.exec("cmd",["/d","/s","/c",commandLine],{cwd:ctx.cwd})}return pi.exec("code",["-g",path15],{cwd:ctx.cwd})},openSelected=async file=>{try{let openResult=await openWithCode(file.path);if(!openResult)return;let openStderr=openResult.stderr.trim();openResult.code!==0?ctx.ui.notify(`Failed to open ${file.path} (exit ${openResult.code})${openStderr?`: ${openStderr}`:""}`,"error"):openStderr&&ctx.ui.notify(`code reported a problem opening ${file.path}: ${openStderr}`,"warning")}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`Failed to open ${file.path}: ${message}`,"error")}};await ctx.ui.custom((tui,theme2,_kb,done)=>{let container=new Container;container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),container.addChild(new Text(theme2.fg("accent",theme2.bold(" Select file to open")),0,0));let filesByValue=new Map,items=files.map((f,i)=>{let key=String(i);filesByValue.set(key,f);let ops=[];f.operations.has("read")&&ops.push(theme2.fg("muted","R")),f.operations.has("write")&&ops.push(theme2.fg("success","W")),f.operations.has("edit")&&ops.push(theme2.fg("warning","E"));let opsLabel=ops.join("");return{value:key,label:`${opsLabel} ${f.path}`}}),visibleRows=Math.min(files.length,15),currentIndex=0,selectList=new SelectList(items,visibleRows,{selectedPrefix:t=>theme2.fg("accent",t),selectedText:t=>t,description:t=>theme2.fg("muted",t),scrollInfo:t=>theme2.fg("dim",t),noMatch:t=>theme2.fg("warning",t)});return selectList.onSelect=item=>{let fileEntry=filesByValue.get(item.value);fileEntry&&openSelected(fileEntry)},selectList.onCancel=()=>done(),selectList.onSelectionChange=item=>{currentIndex=items.indexOf(item)},container.addChild(selectList),container.addChild(new Text(theme2.fg("dim"," \u2191\u2193 navigate \u2022 \u2190\u2192 page \u2022 enter open \u2022 esc close"),0,0)),container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),{render:w=>container.render(w),invalidate:()=>container.invalidate(),handleInput:data=>{matchesKey(data,Key.left)?(currentIndex=Math.max(0,currentIndex-visibleRows),selectList.setSelectedIndex(currentIndex)):matchesKey(data,Key.right)?(currentIndex=Math.min(items.length-1,currentIndex+visibleRows),selectList.setSelectedIndex(currentIndex)):selectList.handleInput(data),tui.requestRender()}}})}})}var MANUAL_CONTINUE_CUSTOM_TYPE="manual-continue";function isManualContinueSubmission(input){return input.text.trim()==="."&&input.hasMessages&&!input.hasImages}var MANUAL_CONTINUE_DIRECTIVE=`<system-notice>
1052
- Continue.
1053
-
1054
- Resume the most recent intent and complete the unfinished work.
1055
- If you were interrupted mid-step, resume exactly where you stopped.
1056
- Never pause to summarize progress, re-confirm the plan, or ask whether to proceed; continue.
1057
- </system-notice>`;var GOAL_CONTINUATION_CAP=8,GOAL_STALL_TOOLLESS_THRESHOLD=3,GOAL_REPETITION_HASH_STREAK=3,GOAL_LENGTH_RECOVERY_LIMIT=1,GOAL_UNATTENDED_CONTINUATION_LIMIT=150,GOAL_USER_GRACE_DELAY_MS=1e4;function didAgentEndCleanly(messages){let lastAssistantIndex=findLastAssistantMessageIndex(messages);if(lastAssistantIndex===void 0)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||!isContinuableStopReason(lastAssistant.stopReason)&&!isMalformedToolUseTurn(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&isAbortedToolResult(message))return!1}return!0}function findLastAssistantMessageIndex(messages){for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant")return index}function isContinuableStopReason(stopReason){return stopReason==="stop"||stopReason==="length"}function isMalformedToolUseTurn(message){return message.content.some(content=>content.type==="toolCall")?!1:message.stopReason==="toolUse"?!0:message.stopReason==="stop"&&(message.diagnostics??[]).some(diagnostic2=>diagnostic2.type===EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC)}function isAbortedToolResult(message){return message.isError?message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)):!1}function evaluateGoalContinuation(input){return input.goal?.status==="active"&&input.lastTurnStuckOnContextOverflow?{kind:"deny",reason:"context-overflow"}:isEligibleForGoalContinuation(input)?input.continuationPending?{kind:"deny",reason:"single-flight"}:hasRepeatedNormalizedOutputHash(input.recentNormalizedOutputHashes)?{kind:"deny",reason:"repetition"}:isUnattendedBudgetExhausted(input)?{kind:"deny",reason:"unattended"}:input.consecutiveContinuations>=GOAL_CONTINUATION_CAP?{kind:"deny",reason:"cap"}:(input.path==="immediate"||input.path==="userGrace")&&input.lastContinuationSignature!==void 0&&input.lastContinuationSignature===input.currentSignature?{kind:"deny",reason:"stale"}:input.lastStopReason==="length"?input.consecutiveLengthRecoveries>=GOAL_LENGTH_RECOVERY_LIMIT?{kind:"deny",reason:"length-exhausted"}:{kind:"continue",prompt:"minimal",stallNotice:shouldShowStallNotice(input)}:{kind:"continue",prompt:"full",stallNotice:shouldShowStallNotice(input)}:{kind:"deny",reason:"not-eligible"}}function normalizeAssistantText(text2){return text2.toLowerCase().replace(/\s+/g," ").trim()}function hashAssistantText(text2){let normalized2=normalizeAssistantText(text2),hash=2166136261;for(let index=0;index<normalized2.length;index++)hash^=normalized2.charCodeAt(index),hash=Math.imul(hash,16777619);return(hash>>>0).toString(16).padStart(8,"0")}function buildGoalContinuationSignature(goal,openTodos,totalTodos,lastAssistantTextHash){return`${goal.id}:${openTodos}/${totalTodos}:${lastAssistantTextHash}`}function hasGoalContinuationProgress(input){return input.lastContinuationSignature!==void 0&&input.currentSignature!==void 0&&input.lastContinuationSignature!==input.currentSignature}function continuationTurnUsedTools(messages){return messages.some(message=>message?.role==="toolResult"?!0:message?.role==="assistant"&&message.content.some(content=>content.type==="toolCall"))}function isEligibleForGoalContinuation(input){return input.goal?.status!=="active"||input.hasPendingMessages?!1:input.path==="systemRecovery"||input.path==="providerRecovery"?!0:input.path==="immediate"?input.lastTurnWasMalformedToolUse||input.lastStopReason!==void 0&&isContinuableStopReason(input.lastStopReason):input.isIdle}function isUnattendedBudgetExhausted(input){return input.path==="monitorDelayed"?!1:(input.goal?.unattendedContinuations??0)>=GOAL_UNATTENDED_CONTINUATION_LIMIT}function hasRepeatedNormalizedOutputHash(hashes){let latestHash=hashes.at(-1);if(latestHash===void 0)return!1;let streak=0;for(let index=hashes.length-1;index>=0&&hashes[index]===latestHash;index--)streak+=1;return streak>=GOAL_REPETITION_HASH_STREAK}function shouldShowStallNotice(input){return input.toollessContinuationStreak>=GOAL_STALL_TOOLLESS_THRESHOLD}var CONTINUATION_CAP_BLOCKED_REASON="continuation cap reached",REPETITION_BLOCKED_REASON="repeated assistant output",LENGTH_EXHAUSTED_BLOCKED_REASON="output truncation repeated",UNATTENDED_CONTINUATION_BLOCKED_REASON="unattended continuation limit reached",PROVIDER_ERROR_BLOCKED_REASON="provider error ended the turn (retries exhausted)",CONTEXT_OVERFLOW_BLOCKED_REASON="context overflow ended the turn (compaction did not recover)",PROVIDER_AUTH_BLOCKED_REASON_PREFIX="provider rejected the request: ",MECHANICAL_CONTINUATION_BLOCKS=[CONTINUATION_CAP_BLOCKED_REASON,REPETITION_BLOCKED_REASON,LENGTH_EXHAUSTED_BLOCKED_REASON,UNATTENDED_CONTINUATION_BLOCKED_REASON,PROVIDER_ERROR_BLOCKED_REASON,CONTEXT_OVERFLOW_BLOCKED_REASON],RESUME_GUIDANCE="Send any message to resume.";function isMechanicalContinuationBlock(blockedReason){return blockedReason===void 0?!1:blockedReason.startsWith(PROVIDER_AUTH_BLOCKED_REASON_PREFIX)?!0:MECHANICAL_CONTINUATION_BLOCKS.includes(blockedReason)}function providerAuthBlockedReason(block){let verdict=block.httpStatus===401?"authentication failed":"access denied";return`${PROVIDER_AUTH_BLOCKED_REASON_PREFIX}HTTP ${block.httpStatus} ${verdict} for ${block.provider}/${block.model}`}function planName(provider){return provider==="github-copilot"?"your Copilot plan":"your account or plan"}function providerAuthRecoveryHint(block){let fix=block.httpStatus===401?`Run /login ${block.provider} to sign in again, or check the API key or token for ${block.provider}`:`Run /login ${block.provider} to refresh the account, or check that ${block.model} is enabled for ${planName(block.provider)}`;return[`Goal continuation blocked: ${providerAuthBlockedReason(block)}.`,"Retrying would get the same rejection, so the goal stopped instead of retrying.",`${fix}, and check any proxy or gateway in front of it. Then send any message to resume.`].join(" ")}function continuationCapRecoveryHint(blockedReason){return isMechanicalContinuationBlock(blockedReason)?`Goal continuation blocked: ${blockedReason}. ${RESUME_GUIDANCE}`:`Goal continuation blocked: ${blockedReason}`}import{randomUUID as randomUUID5}from"node:crypto";import{appendFile as appendFile2,mkdir as mkdir6,writeFile as writeFile5}from"node:fs/promises";import{dirname as dirname18,join as join27}from"node:path";var GoalAlreadyExistsError=class extends Error{constructor(message){super(message),this.name="GoalAlreadyExistsError"}},GoalNotFoundError=class extends Error{constructor(message){super(message),this.name="GoalNotFoundError"}},InvalidGoalStoreError=class extends Error{constructor(message){super(message),this.name="InvalidGoalStoreError"}},UnsupportedGoalStoreVersionError=class extends Error{constructor(message){super(message),this.name="UnsupportedGoalStoreVersionError"}};var import_proper_lockfile2=__toESM(require_proper_lockfile(),1);import{createHash as createHash9}from"node:crypto";import{mkdir as mkdir5}from"node:fs/promises";import{basename as basename9,dirname as dirname17,join as join26}from"node:path";import{randomUUID as randomUUID4}from"node:crypto";import{mkdir as mkdir4,readdir,readFile as readFile5,rename as rename5,rm as rm5,writeFile as writeFile4}from"node:fs/promises";import{homedir as homedir3}from"node:os";import{dirname as dirname16,join as join25,sep as sep8}from"node:path";var GOAL_STATUS_VALUES=["active","paused","blocked","complete"],MODEL_SETTABLE_GOAL_STATUS_VALUES=["complete","blocked"];function isRecord24(value2){return typeof value2=="object"&&value2!==null}var MAX_OBJECTIVE_LENGTH=4e3,WHITESPACE_LOOKBACK=200;function validateObjective(value2,fullTextFileName){let objective=value2.trim();if(objective.length===0)throw new Error("objective must not be empty");let codePoints=[...objective];if(codePoints.length<=MAX_OBJECTIVE_LENGTH)return{objective,truncated:!1};let marker=truncationMarker(fullTextFileName),payloadBudget=MAX_OBJECTIVE_LENGTH-[...marker].length;return{objective:`${codePoints.slice(0,nearestWhitespaceCut(codePoints,payloadBudget)??payloadBudget).join("")}${marker}`,truncated:!0,fullTextFileName}}function truncationMarker(fullTextFileName){return`\u2026 [truncated; full objective: ${fullTextFileName}]`}function objectiveTruncationNotice(fullTextFileName){return`Objective was truncated; full objective saved to ${fullTextFileName}.`}function isGoalStatus(value2){return GOAL_STATUS_VALUES.some(status=>status===value2)}function isNonNegativeSafeInteger(value2){return typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=0}function resolveTokenBudget(current,update){return update===void 0?current:update===null?void 0:validateTokenBudget(update)}function validateTokenBudget(value2){if(!isNonNegativeSafeInteger(value2))throw new Error("token budget must be a non-negative integer");return value2}function nearestWhitespaceCut(codePoints,payloadBudget){for(let index=payloadBudget-1;index>=Math.max(0,payloadBudget-WHITESPACE_LOOKBACK);index-=1)if(/\s/u.test(codePoints[index]??""))return index}var STORE_VERSION=1,CURRENT_STORE_DIRECTORY="goal",LEGACY_STORE_DIRECTORY="pi-goal",LEGACY_BUDGET_LIMITED_STATUSES=["budgetLimited","budget_limited"];function encodedThreadId(ref){return encodeURIComponent(ref.threadId)}function goalFilePath(ref){return join25(ref.baseDir,`${encodedThreadId(ref)}.json`)}async function readGoalFile(ref){try{return parseGoalFile(await readFile5(goalFilePath(ref),"utf8")).goal}catch(error2){if(isMissingFile(error2))return null;throw error2}}async function migrateLegacyGoalFile(ref){try{return await readFile5(goalFilePath(ref),"utf8"),null}catch(error2){if(!isMissingFile(error2))throw error2}let legacyCandidates=await readLegacyGoalCandidates(ref);if(legacyCandidates.length>1)throw new Error(`multiple legacy goals found for no-session store: ${legacyCandidates.map(({path:path15})=>path15).join(", ")}`);let candidate=legacyCandidates[0];if(candidate===void 0)return null;let published=await publishMigratedGoalFile(ref,candidate.goal);return await retireLegacyGoalFile(candidate.path),published?candidate.goal:null}async function readLegacyGoalCandidates(ref){let legacyBaseDir=legacyBaseDirFor(ref.baseDir);if(legacyBaseDir===void 0)return[];let cwdKey=noSessionCwdKey(ref.baseDir);if(cwdKey===void 0){let candidate=await readLegacyGoalCandidate(goalFilePath({...ref,baseDir:legacyBaseDir}));return candidate===null?[]:[candidate]}let standaloneAgentDir=process.env.PI_CODING_AGENT_DIR??join25(homedir3(),".pi","agent"),baseDirs=new Set([legacyBaseDir,join25(standaloneAgentDir,"extensions",LEGACY_STORE_DIRECTORY,"no-session",cwdKey)]),candidatePaths=[];for(let baseDir of baseDirs){let entries;try{entries=await readdir(baseDir,{withFileTypes:!0})}catch(error2){if(isMissingFile(error2))continue;throw error2}for(let entry of entries)entry.isFile()&&entry.name.endsWith(".json")&&candidatePaths.push(join25(baseDir,entry.name))}let candidates=[];for(let path15 of candidatePaths.sort()){let candidate=await readLegacyGoalCandidate(path15);candidate!==null&&candidates.push(candidate)}return candidates}async function readLegacyGoalCandidate(path15){let goal;try{goal=parseGoalFile(await readFile5(path15,"utf8"),{legacy:!0}).goal}catch(error2){if(isMissingFile(error2)||isIgnoredLegacyStoreError(error2))return null;throw error2}return goal===null?(await retireLegacyGoalFile(path15),null):{path:path15,goal}}async function retireLegacyGoalFile(path15){try{await rename5(path15,`${path15}.migrated`)}catch{}}function isIgnoredLegacyStoreError(error2){return error2 instanceof InvalidGoalStoreError||error2 instanceof UnsupportedGoalStoreVersionError||error2 instanceof SyntaxError}function legacyBaseDirFor(baseDir){let segments2=pathSegments(baseDir),goalIndex=segments2.lastIndexOf(CURRENT_STORE_DIRECTORY);if(goalIndex!==-1)return segments2[goalIndex]=LEGACY_STORE_DIRECTORY,segments2.join(sep8)}function noSessionCwdKey(baseDir){let segments2=pathSegments(baseDir),goalIndex=segments2.lastIndexOf(CURRENT_STORE_DIRECTORY);if(!(goalIndex===-1||segments2[goalIndex+1]!=="no-session"))return segments2[goalIndex+2]}function pathSegments(path15){return path15.split(/[\\/]/)}async function writeGoalFile(ref,goal){let filePath=goalFilePath(ref);await mkdir4(dirname16(filePath),{recursive:!0}),await writeGoalFileAtomic(filePath,`${JSON.stringify({version:STORE_VERSION,goal},null,2)}
1052
+ `),files=[];for(let line of lines){if(line.length<4)continue;let status=line.slice(0,2),file=line.slice(2).trimStart(),statusLabel;status.includes("M")?statusLabel="M":status.includes("A")?statusLabel="A":status.includes("D")?statusLabel="D":status.includes("?")?statusLabel="?":status.includes("R")?statusLabel="R":status.includes("C")?statusLabel="C":statusLabel=status.trim()||"~",files.push({status:statusLabel,statusLabel,file})}if(files.length===0){ctx.ui.notify("No changes found","info");return}let WINDOWS_UNSAFE_CMD_CHARS_RE=/[&|<>^%\r\n]/,quoteCmdArg=value2=>`"${value2.replace(/"/g,'""')}"`,openWithCode=async file=>{if(process.platform==="win32"){if(WINDOWS_UNSAFE_CMD_CHARS_RE.test(file))return ctx.ui.notify(`Refusing to open ${file}: path contains Windows cmd metacharacters (& | < > ^ % or newline).`,"error"),null;let commandLine=`code ${quoteCmdArg(file)}`;return pi.exec("cmd",["/d","/s","/c",commandLine],{cwd:ctx.cwd})}return pi.exec("code",["-g",file],{cwd:ctx.cwd})},reportOpen=(file,openResult)=>{let openStderr=openResult.stderr.trim();openResult.code!==0?ctx.ui.notify(`Failed to open ${file} (exit ${openResult.code})${openStderr?`: ${openStderr}`:""}`,"error"):openStderr&&ctx.ui.notify(`code reported a problem opening ${file}: ${openStderr}`,"warning")},openSelected=async fileInfo=>{try{if(fileInfo.status==="?"){let openResult=await openWithCode(fileInfo.file);if(!openResult)return;reportOpen(fileInfo.file,openResult);return}let diffResult=await pi.exec("git",["difftool","-y","--tool=vscode",fileInfo.file],{cwd:ctx.cwd});if(diffResult.code!==0){let diffStderr=diffResult.stderr.trim();ctx.ui.notify(`Failed to show diff with vscode for ${fileInfo.file} (exit ${diffResult.code})${diffStderr?`: ${diffStderr}`:""}`,"error"),ctx.ui.notify("Troubleshooting: check git difftool config (e.g. `git config --get difftool.vscode.cmd`).","info");let openResult=await openWithCode(fileInfo.file);if(!openResult)return;reportOpen(fileInfo.file,openResult)}}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`Failed to open ${fileInfo.file}: ${message}`,"error")}};await ctx.ui.custom((tui,theme2,_kb,done)=>{let container=new Container;container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),container.addChild(new Text(theme2.fg("accent",theme2.bold(" Select file to diff")),0,0));let filesByValue=new Map,items=files.map((f,i)=>{let key=String(i);filesByValue.set(key,f);let statusColor2;switch(f.status){case"M":statusColor2=theme2.fg("warning",f.status);break;case"A":statusColor2=theme2.fg("success",f.status);break;case"D":statusColor2=theme2.fg("error",f.status);break;case"?":statusColor2=theme2.fg("muted",f.status);break;default:statusColor2=theme2.fg("dim",f.status)}return{value:key,label:`${statusColor2} ${f.file}`}}),visibleRows=Math.min(files.length,15),currentIndex=0,selectList=new SelectList(items,visibleRows,{selectedPrefix:t=>theme2.fg("accent",t),selectedText:t=>t,description:t=>theme2.fg("muted",t),scrollInfo:t=>theme2.fg("dim",t),noMatch:t=>theme2.fg("warning",t)});return selectList.onSelect=item=>{let fileInfo=filesByValue.get(item.value);fileInfo&&openSelected(fileInfo)},selectList.onCancel=()=>done(),selectList.onSelectionChange=item=>{currentIndex=items.indexOf(item)},container.addChild(selectList),container.addChild(new Text(theme2.fg("dim"," \u2191\u2193 navigate \u2022 \u2190\u2192 page \u2022 enter open \u2022 esc close"),0,0)),container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),{render:w=>container.render(w),invalidate:()=>container.invalidate(),handleInput:data=>{matchesKey(data,Key.left)?(currentIndex=Math.max(0,currentIndex-visibleRows),selectList.setSelectedIndex(currentIndex)):matchesKey(data,Key.right)?(currentIndex=Math.min(items.length-1,currentIndex+visibleRows),selectList.setSelectedIndex(currentIndex)):selectList.handleInput(data),tui.requestRender()}}})}})}function files_default(pi){pi.registerCommand("files",{description:"Show files read/written/edited in this session",handler:async(_args,ctx)=>{if(!ctx.hasUI){ctx.ui.notify("No UI available","error");return}let branch=ctx.sessionManager.getBranch(),toolCalls=new Map;for(let entry of branch){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="assistant"&&Array.isArray(msg.content)){for(let block of msg.content)if(block.type==="toolCall"){let name=block.name;if(name==="read"||name==="write"||name==="edit"){let path15=block.arguments?.path;path15&&typeof path15=="string"&&toolCalls.set(block.id,{paths:[path15],name,timestamp:msg.timestamp})}else if(name==="apply_patch"){let input=block.arguments?.input;if(typeof input=="string"){let paths=extractPatchedPaths(input);paths.length>0&&toolCalls.set(block.id,{paths,name:"edit",timestamp:msg.timestamp})}}}}}let fileMap=new Map;for(let entry of branch){if(entry.type!=="message")continue;let msg=entry.message;if(msg.role==="toolResult"){let toolCall=toolCalls.get(msg.toolCallId);if(!toolCall)continue;let{paths,name}=toolCall,timestamp=msg.timestamp;for(let path15 of paths){let existing=fileMap.get(path15);existing?(existing.operations.add(name),timestamp>existing.lastTimestamp&&(existing.lastTimestamp=timestamp)):fileMap.set(path15,{path:path15,operations:new Set([name]),lastTimestamp:timestamp})}}}if(fileMap.size===0){ctx.ui.notify("No files read/written/edited in this session","info");return}let files=Array.from(fileMap.values()).sort((a,b)=>b.lastTimestamp-a.lastTimestamp),WINDOWS_UNSAFE_CMD_CHARS_RE=/[&|<>^%\r\n]/,quoteCmdArg=value2=>`"${value2.replace(/"/g,'""')}"`,openWithCode=async path15=>{if(process.platform==="win32"){if(WINDOWS_UNSAFE_CMD_CHARS_RE.test(path15))return ctx.ui.notify(`Refusing to open ${path15}: path contains Windows cmd metacharacters (& | < > ^ % or newline).`,"error"),null;let commandLine=`code ${quoteCmdArg(path15)}`;return pi.exec("cmd",["/d","/s","/c",commandLine],{cwd:ctx.cwd})}return pi.exec("code",["-g",path15],{cwd:ctx.cwd})},openSelected=async file=>{try{let openResult=await openWithCode(file.path);if(!openResult)return;let openStderr=openResult.stderr.trim();openResult.code!==0?ctx.ui.notify(`Failed to open ${file.path} (exit ${openResult.code})${openStderr?`: ${openStderr}`:""}`,"error"):openStderr&&ctx.ui.notify(`code reported a problem opening ${file.path}: ${openStderr}`,"warning")}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);ctx.ui.notify(`Failed to open ${file.path}: ${message}`,"error")}};await ctx.ui.custom((tui,theme2,_kb,done)=>{let container=new Container;container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),container.addChild(new Text(theme2.fg("accent",theme2.bold(" Select file to open")),0,0));let filesByValue=new Map,items=files.map((f,i)=>{let key=String(i);filesByValue.set(key,f);let ops=[];f.operations.has("read")&&ops.push(theme2.fg("muted","R")),f.operations.has("write")&&ops.push(theme2.fg("success","W")),f.operations.has("edit")&&ops.push(theme2.fg("warning","E"));let opsLabel=ops.join("");return{value:key,label:`${opsLabel} ${f.path}`}}),visibleRows=Math.min(files.length,15),currentIndex=0,selectList=new SelectList(items,visibleRows,{selectedPrefix:t=>theme2.fg("accent",t),selectedText:t=>t,description:t=>theme2.fg("muted",t),scrollInfo:t=>theme2.fg("dim",t),noMatch:t=>theme2.fg("warning",t)});return selectList.onSelect=item=>{let fileEntry=filesByValue.get(item.value);fileEntry&&openSelected(fileEntry)},selectList.onCancel=()=>done(),selectList.onSelectionChange=item=>{currentIndex=items.indexOf(item)},container.addChild(selectList),container.addChild(new Text(theme2.fg("dim"," \u2191\u2193 navigate \u2022 \u2190\u2192 page \u2022 enter open \u2022 esc close"),0,0)),container.addChild(new DynamicBorder(s=>theme2.fg("accent",s))),{render:w=>container.render(w),invalidate:()=>container.invalidate(),handleInput:data=>{matchesKey(data,Key.left)?(currentIndex=Math.max(0,currentIndex-visibleRows),selectList.setSelectedIndex(currentIndex)):matchesKey(data,Key.right)?(currentIndex=Math.min(items.length-1,currentIndex+visibleRows),selectList.setSelectedIndex(currentIndex)):selectList.handleInput(data),tui.requestRender()}}})}})}var GOAL_CONTINUATION_CAP=8,GOAL_STALL_TOOLLESS_THRESHOLD=3,GOAL_REPETITION_HASH_STREAK=3,GOAL_LENGTH_RECOVERY_LIMIT=1,GOAL_UNATTENDED_CONTINUATION_LIMIT=150,GOAL_USER_GRACE_DELAY_MS=1e4;function didAgentEndCleanly(messages){let lastAssistantIndex=findLastAssistantMessageIndex(messages);if(lastAssistantIndex===void 0)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||!isContinuableStopReason(lastAssistant.stopReason)&&!isMalformedToolUseTurn(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&isAbortedToolResult(message))return!1}return!0}function findLastAssistantMessageIndex(messages){for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant")return index}function isContinuableStopReason(stopReason){return stopReason==="stop"||stopReason==="length"}function isMalformedToolUseTurn(message){return message.content.some(content=>content.type==="toolCall")?!1:message.stopReason==="toolUse"?!0:message.stopReason==="stop"&&(message.diagnostics??[]).some(diagnostic2=>diagnostic2.type===EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC)}function isAbortedToolResult(message){return message.isError?message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)):!1}function evaluateGoalContinuation(input){return input.goal?.status==="active"&&input.lastTurnStuckOnContextOverflow?{kind:"deny",reason:"context-overflow"}:isEligibleForGoalContinuation(input)?input.continuationPending?{kind:"deny",reason:"single-flight"}:hasRepeatedNormalizedOutputHash(input.recentNormalizedOutputHashes)?{kind:"deny",reason:"repetition"}:isUnattendedBudgetExhausted(input)?{kind:"deny",reason:"unattended"}:input.consecutiveContinuations>=GOAL_CONTINUATION_CAP?{kind:"deny",reason:"cap"}:(input.path==="immediate"||input.path==="userGrace")&&input.lastContinuationSignature!==void 0&&input.lastContinuationSignature===input.currentSignature?{kind:"deny",reason:"stale"}:input.lastStopReason==="length"?input.consecutiveLengthRecoveries>=GOAL_LENGTH_RECOVERY_LIMIT?{kind:"deny",reason:"length-exhausted"}:{kind:"continue",prompt:"minimal",stallNotice:shouldShowStallNotice(input)}:{kind:"continue",prompt:"full",stallNotice:shouldShowStallNotice(input)}:{kind:"deny",reason:"not-eligible"}}function normalizeAssistantText(text2){return text2.toLowerCase().replace(/\s+/g," ").trim()}function hashAssistantText(text2){let normalized2=normalizeAssistantText(text2),hash=2166136261;for(let index=0;index<normalized2.length;index++)hash^=normalized2.charCodeAt(index),hash=Math.imul(hash,16777619);return(hash>>>0).toString(16).padStart(8,"0")}function buildGoalContinuationSignature(goal,openTodos,totalTodos,lastAssistantTextHash){return`${goal.id}:${openTodos}/${totalTodos}:${lastAssistantTextHash}`}function hasGoalContinuationProgress(input){return input.lastContinuationSignature!==void 0&&input.currentSignature!==void 0&&input.lastContinuationSignature!==input.currentSignature}function continuationTurnUsedTools(messages){return messages.some(message=>message?.role==="toolResult"?!0:message?.role==="assistant"&&message.content.some(content=>content.type==="toolCall"))}function isEligibleForGoalContinuation(input){return input.goal?.status!=="active"||input.hasPendingMessages?!1:input.path==="systemRecovery"||input.path==="providerRecovery"?!0:input.path==="immediate"?input.lastTurnWasMalformedToolUse||input.lastStopReason!==void 0&&isContinuableStopReason(input.lastStopReason):input.isIdle}function isUnattendedBudgetExhausted(input){return input.path==="monitorDelayed"?!1:(input.goal?.unattendedContinuations??0)>=GOAL_UNATTENDED_CONTINUATION_LIMIT}function hasRepeatedNormalizedOutputHash(hashes){let latestHash=hashes.at(-1);if(latestHash===void 0)return!1;let streak=0;for(let index=hashes.length-1;index>=0&&hashes[index]===latestHash;index--)streak+=1;return streak>=GOAL_REPETITION_HASH_STREAK}function shouldShowStallNotice(input){return input.toollessContinuationStreak>=GOAL_STALL_TOOLLESS_THRESHOLD}var CONTINUATION_CAP_BLOCKED_REASON="continuation cap reached",REPETITION_BLOCKED_REASON="repeated assistant output",LENGTH_EXHAUSTED_BLOCKED_REASON="output truncation repeated",UNATTENDED_CONTINUATION_BLOCKED_REASON="unattended continuation limit reached",PROVIDER_ERROR_BLOCKED_REASON="provider error ended the turn (retries exhausted)",CONTEXT_OVERFLOW_BLOCKED_REASON="context overflow ended the turn (compaction did not recover)",PROVIDER_AUTH_BLOCKED_REASON_PREFIX="provider rejected the request: ",MECHANICAL_CONTINUATION_BLOCKS=[CONTINUATION_CAP_BLOCKED_REASON,REPETITION_BLOCKED_REASON,LENGTH_EXHAUSTED_BLOCKED_REASON,UNATTENDED_CONTINUATION_BLOCKED_REASON,PROVIDER_ERROR_BLOCKED_REASON,CONTEXT_OVERFLOW_BLOCKED_REASON],RESUME_GUIDANCE="Send any message to resume.";function isMechanicalContinuationBlock(blockedReason){return blockedReason===void 0?!1:blockedReason.startsWith(PROVIDER_AUTH_BLOCKED_REASON_PREFIX)?!0:MECHANICAL_CONTINUATION_BLOCKS.includes(blockedReason)}function providerAuthBlockedReason(block){let verdict=block.httpStatus===401?"authentication failed":"access denied";return`${PROVIDER_AUTH_BLOCKED_REASON_PREFIX}HTTP ${block.httpStatus} ${verdict} for ${block.provider}/${block.model}`}function planName(provider){return provider==="github-copilot"?"your Copilot plan":"your account or plan"}function providerAuthRecoveryHint(block){let fix=block.httpStatus===401?`Run /login ${block.provider} to sign in again, or check the API key or token for ${block.provider}`:`Run /login ${block.provider} to refresh the account, or check that ${block.model} is enabled for ${planName(block.provider)}`;return[`Goal continuation blocked: ${providerAuthBlockedReason(block)}.`,"Retrying would get the same rejection, so the goal stopped instead of retrying.",`${fix}, and check any proxy or gateway in front of it. Then send any message to resume.`].join(" ")}function continuationCapRecoveryHint(blockedReason){return isMechanicalContinuationBlock(blockedReason)?`Goal continuation blocked: ${blockedReason}. ${RESUME_GUIDANCE}`:`Goal continuation blocked: ${blockedReason}`}import{randomUUID as randomUUID5}from"node:crypto";import{appendFile as appendFile2,mkdir as mkdir6,writeFile as writeFile5}from"node:fs/promises";import{dirname as dirname18,join as join27}from"node:path";var GoalAlreadyExistsError=class extends Error{constructor(message){super(message),this.name="GoalAlreadyExistsError"}},GoalNotFoundError=class extends Error{constructor(message){super(message),this.name="GoalNotFoundError"}},InvalidGoalStoreError=class extends Error{constructor(message){super(message),this.name="InvalidGoalStoreError"}},UnsupportedGoalStoreVersionError=class extends Error{constructor(message){super(message),this.name="UnsupportedGoalStoreVersionError"}};var import_proper_lockfile2=__toESM(require_proper_lockfile(),1);import{createHash as createHash9}from"node:crypto";import{mkdir as mkdir5}from"node:fs/promises";import{basename as basename9,dirname as dirname17,join as join26}from"node:path";import{randomUUID as randomUUID4}from"node:crypto";import{mkdir as mkdir4,readdir,readFile as readFile5,rename as rename5,rm as rm5,writeFile as writeFile4}from"node:fs/promises";import{homedir as homedir3}from"node:os";import{dirname as dirname16,join as join25,sep as sep8}from"node:path";var GOAL_STATUS_VALUES=["active","paused","blocked","complete"],MODEL_SETTABLE_GOAL_STATUS_VALUES=["complete","blocked"];function isRecord24(value2){return typeof value2=="object"&&value2!==null}var MAX_OBJECTIVE_LENGTH=4e3,WHITESPACE_LOOKBACK=200;function validateObjective(value2,fullTextFileName){let objective=value2.trim();if(objective.length===0)throw new Error("objective must not be empty");let codePoints=[...objective];if(codePoints.length<=MAX_OBJECTIVE_LENGTH)return{objective,truncated:!1};let marker=truncationMarker(fullTextFileName),payloadBudget=MAX_OBJECTIVE_LENGTH-[...marker].length;return{objective:`${codePoints.slice(0,nearestWhitespaceCut(codePoints,payloadBudget)??payloadBudget).join("")}${marker}`,truncated:!0,fullTextFileName}}function truncationMarker(fullTextFileName){return`\u2026 [truncated; full objective: ${fullTextFileName}]`}function objectiveTruncationNotice(fullTextFileName){return`Objective was truncated; full objective saved to ${fullTextFileName}.`}function isGoalStatus(value2){return GOAL_STATUS_VALUES.some(status=>status===value2)}function isNonNegativeSafeInteger(value2){return typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=0}function resolveTokenBudget(current,update){return update===void 0?current:update===null?void 0:validateTokenBudget(update)}function validateTokenBudget(value2){if(!isNonNegativeSafeInteger(value2))throw new Error("token budget must be a non-negative integer");return value2}function nearestWhitespaceCut(codePoints,payloadBudget){for(let index=payloadBudget-1;index>=Math.max(0,payloadBudget-WHITESPACE_LOOKBACK);index-=1)if(/\s/u.test(codePoints[index]??""))return index}var STORE_VERSION=1,CURRENT_STORE_DIRECTORY="goal",LEGACY_STORE_DIRECTORY="pi-goal",LEGACY_BUDGET_LIMITED_STATUSES=["budgetLimited","budget_limited"];function encodedThreadId(ref){return encodeURIComponent(ref.threadId)}function goalFilePath(ref){return join25(ref.baseDir,`${encodedThreadId(ref)}.json`)}async function readGoalFile(ref){try{return parseGoalFile(await readFile5(goalFilePath(ref),"utf8")).goal}catch(error2){if(isMissingFile(error2))return null;throw error2}}async function migrateLegacyGoalFile(ref){try{return await readFile5(goalFilePath(ref),"utf8"),null}catch(error2){if(!isMissingFile(error2))throw error2}let legacyCandidates=await readLegacyGoalCandidates(ref);if(legacyCandidates.length>1)throw new Error(`multiple legacy goals found for no-session store: ${legacyCandidates.map(({path:path15})=>path15).join(", ")}`);let candidate=legacyCandidates[0];if(candidate===void 0)return null;let published=await publishMigratedGoalFile(ref,candidate.goal);return await retireLegacyGoalFile(candidate.path),published?candidate.goal:null}async function readLegacyGoalCandidates(ref){let legacyBaseDir=legacyBaseDirFor(ref.baseDir);if(legacyBaseDir===void 0)return[];let cwdKey=noSessionCwdKey(ref.baseDir);if(cwdKey===void 0){let candidate=await readLegacyGoalCandidate(goalFilePath({...ref,baseDir:legacyBaseDir}));return candidate===null?[]:[candidate]}let standaloneAgentDir=process.env.PI_CODING_AGENT_DIR??join25(homedir3(),".pi","agent"),baseDirs=new Set([legacyBaseDir,join25(standaloneAgentDir,"extensions",LEGACY_STORE_DIRECTORY,"no-session",cwdKey)]),candidatePaths=[];for(let baseDir of baseDirs){let entries;try{entries=await readdir(baseDir,{withFileTypes:!0})}catch(error2){if(isMissingFile(error2))continue;throw error2}for(let entry of entries)entry.isFile()&&entry.name.endsWith(".json")&&candidatePaths.push(join25(baseDir,entry.name))}let candidates=[];for(let path15 of candidatePaths.sort()){let candidate=await readLegacyGoalCandidate(path15);candidate!==null&&candidates.push(candidate)}return candidates}async function readLegacyGoalCandidate(path15){let goal;try{goal=parseGoalFile(await readFile5(path15,"utf8"),{legacy:!0}).goal}catch(error2){if(isMissingFile(error2)||isIgnoredLegacyStoreError(error2))return null;throw error2}return goal===null?(await retireLegacyGoalFile(path15),null):{path:path15,goal}}async function retireLegacyGoalFile(path15){try{await rename5(path15,`${path15}.migrated`)}catch{}}function isIgnoredLegacyStoreError(error2){return error2 instanceof InvalidGoalStoreError||error2 instanceof UnsupportedGoalStoreVersionError||error2 instanceof SyntaxError}function legacyBaseDirFor(baseDir){let segments2=pathSegments(baseDir),goalIndex=segments2.lastIndexOf(CURRENT_STORE_DIRECTORY);if(goalIndex!==-1)return segments2[goalIndex]=LEGACY_STORE_DIRECTORY,segments2.join(sep8)}function noSessionCwdKey(baseDir){let segments2=pathSegments(baseDir),goalIndex=segments2.lastIndexOf(CURRENT_STORE_DIRECTORY);if(!(goalIndex===-1||segments2[goalIndex+1]!=="no-session"))return segments2[goalIndex+2]}function pathSegments(path15){return path15.split(/[\\/]/)}async function writeGoalFile(ref,goal){let filePath=goalFilePath(ref);await mkdir4(dirname16(filePath),{recursive:!0}),await writeGoalFileAtomic(filePath,`${JSON.stringify({version:STORE_VERSION,goal},null,2)}
1058
1053
  `)}async function writeGoalFileAtomic(filePath,contents){let tempPath=join25(dirname16(filePath),`.goal-${randomUUID4()}.tmp`);try{await writeFile4(tempPath,contents,{encoding:"utf8",mode:384}),await rename5(tempPath,filePath)}catch(error2){try{await rm5(tempPath,{force:!0})}catch(cleanupError){throw new AggregateError([error2,cleanupError],"goal store write failed and its temporary file could not be removed")}throw error2}}async function publishMigratedGoalFile(ref,goal){let filePath=goalFilePath(ref);await mkdir4(dirname16(filePath),{recursive:!0});let contents=`${JSON.stringify({version:STORE_VERSION,goal},null,2)}
1059
1054
  `;try{return await writeFile4(filePath,contents,{encoding:"utf8",mode:384,flag:"wx"}),!0}catch(error2){if(isFileSystemError(error2,"EEXIST"))return!1;throw error2}}function parseGoalFile(raw,{legacy=!1}={}){let parsed=parseGoalFileJson(raw);if(!isRecord24(parsed))throw new InvalidGoalStoreError("goal store must be a JSON object");if(parsed.version!==STORE_VERSION)throw new UnsupportedGoalStoreVersionError("unsupported goal store version");let goal=legacy?normalizeLegacyGoal(parsed.goal):parsed.goal;if(goal!==null&&!isGoal(goal))throw new InvalidGoalStoreError("goal store contains an invalid goal");return{version:STORE_VERSION,goal:goal===null?null:sanitizeContinuationState(goal)}}function parseGoalFileJson(raw){let parsed;try{parsed=JSON.parse(raw)}catch(error2){if(!(error2 instanceof SyntaxError))throw error2;let recovered2=recoverGoalFileWithStaleClosingBraces(raw);if(recovered2===void 0)throw error2;try{parsed=JSON.parse(recovered2)}catch{throw error2}}return parsed}function normalizeLegacyGoal(value2){if(!isRecord24(value2))return value2;let normalized2={...value2};return delete normalized2.tokenBudget,typeof normalized2.status=="string"&&LEGACY_BUDGET_LIMITED_STATUSES.includes(normalized2.status)&&(normalized2.status="active"),normalized2}function recoverGoalFileWithStaleClosingBraces(raw){let rootStart=0;for(;rootStart<raw.length&&/[\t\n\r ]/.test(raw[rootStart]??"");)rootStart+=1;if(raw[rootStart]!=="{")return;let depth=0,inString=!1,escaped=!1;for(let index=rootStart;index<raw.length;index+=1){let character=raw[index];if(inString){escaped?escaped=!1:character==="\\"?escaped=!0:character==='"'&&(inString=!1);continue}if(character==='"')inString=!0;else if(character==="{"||character==="[")depth+=1;else if(character==="}"||character==="]"){if(depth-=1,depth<0)return;if(depth===0){let hasStaleClosingBrace=!1;for(let suffixIndex=index+1;suffixIndex<raw.length;suffixIndex+=1){let suffix=raw[suffixIndex];if(suffix==="}")hasStaleClosingBrace=!0;else if(suffix!==" "&&suffix!==" "&&suffix!==`
1060
1055
  `&&suffix!=="\r")return}return hasStaleClosingBrace?raw.slice(0,index+1):void 0}}}}function isGoal(value2){return isRecord24(value2)?typeof value2.id=="string"&&typeof value2.threadId=="string"&&typeof value2.objective=="string"&&isGoalStatus(value2.status)&&(value2.tokenBudget===void 0||isNonNegativeSafeInteger(value2.tokenBudget))&&hasValidBlockedFields(value2,value2.status)&&isNonNegativeSafeInteger(value2.tokensUsed)&&isNonNegativeSafeInteger(value2.timeUsedSeconds)&&isNonNegativeSafeInteger(value2.createdAt)&&isNonNegativeSafeInteger(value2.updatedAt)&&(value2.lastStartedAt===void 0||isNonNegativeSafeInteger(value2.lastStartedAt))&&(value2.completedAt===void 0||isNonNegativeSafeInteger(value2.completedAt)):!1}function hasValidBlockedFields(value2,status){return status==="blocked"?typeof value2.blockedReason=="string"&&value2.blockedReason.trim().length>0&&isNonNegativeSafeInteger(value2.blockedAt):value2.blockedReason===void 0&&value2.blockedAt===void 0}function sanitizeContinuationState(goal){let next={...goal};return isNonNegativeSafeInteger(next.consecutiveContinuations)||delete next.consecutiveContinuations,isNonNegativeSafeInteger(next.unattendedContinuations)||delete next.unattendedContinuations,typeof next.lastContinuationSignature!="string"&&delete next.lastContinuationSignature,next}function isMissingFile(error2){return isFileSystemError(error2,"ENOENT")}function isFileSystemError(error2,code){return error2 instanceof Error&&"code"in error2&&error2.code===code}var GOAL_LOCK_OPTIONS={realpath:!1,stale:1e4,update:2e3,retries:0},GOAL_LOCK_WAIT_BUDGET_MS=15e3,GoalStoreBusyError=class extends Error{constructor(path15,waitedMs,cause){super(`Goal store is busy: lock on ${path15} was held for ${waitedMs}ms. Another process may be updating the goal; close unused sessions if contention persists.`,{cause}),this.name="GoalStoreBusyError",this.path=path15,this.waitedMs=waitedMs}},GoalStoreLockCompromisedError=class extends Error{constructor(path15,cause){super(`Goal store lock on ${path15} was compromised: another process reclaimed it. The stale write was rejected to preserve the newer goal state.`,{cause}),this.name="GoalStoreLockCompromisedError",this.path=path15}};function goalLockFilePath(ref){let filePath=goalFilePath(ref),digest3=createHash9("sha256").update(basename9(filePath)).digest("hex").slice(0,40);return join26(dirname17(filePath),`.goal-lock-${digest3}`)}async function acquireGoalLock(filePath,lockfilePath){await mkdir5(dirname17(filePath),{recursive:!0});let compromise,startedAt=Date.now(),attempt2=0;for(;;)try{return{release:await import_proper_lockfile2.default.lock(filePath,{...GOAL_LOCK_OPTIONS,lockfilePath,onCompromised:error2=>{compromise={error:error2}}}),isCompromised:()=>compromise}}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=GOAL_LOCK_WAIT_BUDGET_MS)throw new GoalStoreBusyError(filePath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,GOAL_LOCK_WAIT_BUDGET_MS-waitedMs);attempt2+=1,await new Promise(resolve47=>setTimeout(resolve47,delayMs))}}function withGoalFileLock(ref,fn){let filePath=goalFilePath(ref);return serializeByKey(filePath,async()=>{let{release:release4,isCompromised}=await acquireGoalLock(filePath,goalLockFilePath(ref)),assertHeld=()=>{let compromise=isCompromised();if(compromise)throw new GoalStoreLockCompromisedError(filePath,compromise)};try{return await fn({assertHeld,write:async goal=>{assertHeld(),await writeGoalFile(ref,goal)}})}finally{try{await release4()}catch{}}})}function transitionGoalStatus(current,status,source2,reason,updatedAt){if(assertGoalTransition(current.status,status,source2),status==="complete"&&reason!==void 0)throw new Error("reason must not be provided when status is complete");let next={...current,status,updatedAt};return status==="blocked"?applyBlockedFields(next,current,reason,updatedAt):(delete next.blockedReason,delete next.blockedAt),status==="active"&&current.status!=="active"?next.lastStartedAt=updatedAt:status!=="active"&&delete next.lastStartedAt,status==="complete"?next.completedAt=current.completedAt??updatedAt:delete next.completedAt,next}function assertGoalTransition(current,next,source2){if(!(current===next||isAllowedTransition(current,next,source2)))throw new Error(`illegal goal transition: ${current} -> ${next}`)}function isAllowedTransition(current,next,source2){return source2==="model"?current==="active"&&(next==="blocked"||next==="complete")||current==="blocked"&&next==="complete":current==="active"&&next==="paused"||current==="paused"&&next==="active"||current==="blocked"&&next==="active"||current==="complete"&&next==="active"}function applyBlockedFields(next,current,reason,updatedAt){if(current.status==="blocked")return;let blockedReason=reason?.trim();if(blockedReason===void 0||blockedReason.length===0)throw new Error("reason is required when status is blocked");next.blockedReason=blockedReason,next.blockedAt=updatedAt}function goalHistoryFilePath(ref){return join27(ref.baseDir,`${encodedThreadId(ref)}.history.jsonl`)}function objectiveFullTextFileName(ref){return`${encodedThreadId(ref)}.objective-full.txt`}function objectiveFullTextFilePath(ref){return join27(ref.baseDir,objectiveFullTextFileName(ref))}async function readGoal(ref){return readGoalFile(ref)}async function migrateLegacyGoal(ref){return withGoalFileLock(ref,()=>migrateLegacyGoalFile(ref))}async function createGoal(ref,objective,tokenBudget){return withGoalFileLock(ref,async held=>{let validatedObjective=validateObjective(objective,objectiveFullTextFileName(ref)),current=await readGoalFile(ref);if(current!==null&&current.status!=="complete")throw new GoalAlreadyExistsError("cannot create a new goal because this thread already has a goal");validatedObjective.truncated&&(held.assertHeld(),await writeFullObjectiveText(ref,objective)),current?.status==="complete"&&(held.assertHeld(),await archiveGoal(ref,current));let now2=nowSeconds(),goal={id:randomUUID5(),threadId:ref.threadId,objective:validatedObjective.objective,status:"active",tokensUsed:0,timeUsedSeconds:0,consecutiveContinuations:0,unattendedContinuations:0,createdAt:now2,updatedAt:now2,lastStartedAt:now2,...tokenBudget===void 0?{}:{tokenBudget:validateTokenBudget(tokenBudget)}};return await held.write(goal),goal})}async function updateGoal(ref,update,source2="model"){return withGoalFileLock(ref,async held=>{let current=await readGoalFile(ref);if(!current)throw new GoalNotFoundError("cannot update goal: no goal exists");let validatedObjective=update.objective===void 0?void 0:validateObjective(update.objective,objectiveFullTextFileName(ref)),objective=validatedObjective?.objective??current.objective,tokenBudget=resolveTokenBudget(current.tokenBudget,update.tokenBudget),now2=nextUpdatedAt(current.updatedAt),hasObjectiveUpdate=update.objective!==void 0,replacesGoal=hasObjectiveUpdate&&(objective!==current.objective||current.status==="complete"),requestedStatus=update.status??(hasObjectiveUpdate?"active":void 0);if(replacesGoal){let status=requestedStatus??"active";if(status==="blocked")throw new Error("objective replacement cannot create a blocked goal");let next2={id:randomUUID5(),threadId:ref.threadId,objective,status,tokensUsed:0,timeUsedSeconds:0,consecutiveContinuations:0,unattendedContinuations:0,createdAt:now2,updatedAt:now2,...tokenBudget===void 0?{}:{tokenBudget}};return status==="active"&&(next2.lastStartedAt=now2),status==="complete"&&(next2.completedAt=now2),validatedObjective?.truncated&&(held.assertHeld(),await writeFullObjectiveText(ref,update.objective??"")),await held.write(next2),next2}let next=transitionGoalStatus({...current,objective},requestedStatus??current.status,source2,update.reason,now2);return next.status!==current.status&&(next.consecutiveContinuations=0,next.unattendedContinuations=0,delete next.lastContinuationSignature),tokenBudget===void 0?delete next.tokenBudget:next.tokenBudget=tokenBudget,validatedObjective?.truncated&&(held.assertHeld(),await writeFullObjectiveText(ref,update.objective??"")),await held.write(next),next})}async function archiveGoal(ref,goal){let filePath=goalHistoryFilePath(ref);await mkdir6(dirname18(filePath),{recursive:!0}),await appendFile2(filePath,`${JSON.stringify(goal)}
@@ -1112,7 +1107,7 @@ ${messages.join(`
1112
1107
  `)}`}function safeDiagnosticDetails(diagnostic2){return{code:diagnostic2.code,...diagnostic2.event===void 0?{}:{event:diagnostic2.event},message:diagnostic2.message,path:diagnostic2.path,severity:diagnostic2.severity,sourcePath:diagnostic2.source.sourcePath}}function buildSessionStartHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{cwd:ctx.cwd,event:"SessionStart",hook_event_name:"SessionStart",reason:event.reason,sessionId:ctx.sessionManager.getSessionId(),session_id:ctx.sessionManager.getSessionId(),...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function buildPreCompactHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{cwd:ctx.cwd,event:"PreCompact",hook_event_name:"PreCompact",reason:event.reason,request_id:event.requestId,session_id:ctx.sessionManager.getSessionId(),will_retry:event.willRetry,...event.customInstructions===void 0?{}:{custom_instructions:event.customInstructions},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function buildNotificationHookInput(input,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{cwd:ctx.cwd,event:"Notification",hook_event_name:"Notification",kind:input.kind,message:input.message,session_id:ctx.sessionManager.getSessionId(),...input.title===void 0?{}:{title:input.title},...input.source===void 0?{}:{notification_source:input.source},...input.requestId===void 0?{}:{request_id:input.requestId},...input.status===void 0?{}:{status:input.status},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}async function dispatchNotificationHookEvent(options){return dispatchLifecycleHookEvent({cwd:options.cwd,handlers:options.handlers,input:options.input,matcherInputs:["Notification"],...options.signal===void 0?{}:{signal:options.signal},trustState:options.trustState})}function notificationResultDetails(result3){return{cancel:!1,contexts:result3?.summaries.flatMap(summary=>summary.output.additionalContext===void 0?[]:[summary.output.additionalContext])??[],diagnostics:result3===void 0?[]:[...result3.diagnostics,...commandFailureDiagnostics("Notification",result3)]}}function buildPostCompactHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile();return{accepted:event.accepted,cwd:ctx.cwd,event:"PostCompact",hook_event_name:"PostCompact",reason:event.reason,request_id:event.requestId,session_id:ctx.sessionManager.getSessionId(),will_retry:event.willRetry,...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}async function dispatchLifecycleHookEvent(options){let selection=selectLifecycleHandlers(options);if(selection.handlers.length===0&&selection.diagnostics.length===0)return;let trustedHandlers=selection.handlers.map(handler=>stripLifecycleMatcher(handler)),hooks={};for(let handler of trustedHandlers)hooks[hookTrustId(handler)]=createHookTrustEntry(handler,{platform:process.platform,updatedAt:"2026-06-29T00:00:00.000Z"});let result3=await dispatchHookEvent({cwd:options.cwd,handlers:trustedHandlers,input:options.input,...options.signal===void 0?{}:{signal:options.signal},trustOptions:{platform:process.platform},trustState:{hooks,version:1}});return{...result3,diagnostics:[...selection.diagnostics,...result3.diagnostics]}}function sessionStartResultDetails(result3){return lifecycleResultDetails("SessionStart",result3)}function preCompactResultDetails(result3){let details=lifecycleResultDetails("PreCompact",result3);if(details.cancel)return details;let blocker=result3?.summaries.find(summary=>{let output2=readLifecycleHookOutput("PreCompact",summary.run.stdout);return output2?.decision==="block"||output2?.decision==="deny"});if(blocker===void 0)return details;let output=readLifecycleHookOutput("PreCompact",blocker.run.stdout);return{...details,cancel:!0,...output?.reason===void 0?{}:{reason:output.reason}}}function postCompactResultDetails(result3){return lifecycleResultDetails("PostCompact",result3)}function sessionBeforeCompactResult(details){return details.cancel?{cancel:!0}:void 0}function recordLifecycleHookResult(pi,event,details,options){if(details.contexts.length===0&&details.diagnostics.length===0&&details.reason===void 0)return;let content=details.contexts.length>0?details.contexts.join(`
1113
1108
 
1114
1109
  `):details.reason??`${event} hook diagnostics.`;pi.sendMessage({customType:HOOK_CUSTOM_MESSAGE_TYPE,content,display:!1,details:{event,diagnostics:details.diagnostics.map(safeDiagnosticDetails),...options?.compactionRequestId===void 0?{}:{compactionRequestId:options.compactionRequestId}}},{triggerTurn:!1})}function selectLifecycleHandlers(options){let matched=[],diagnostics=[];for(let handler of options.handlers){if(handler.event!==options.input.event)continue;if(isInitialRuntimeSessionStart(handler,options.input)){diagnostics.push(diagnostic({code:"unsupported_event",event:"SessionStart",message:"Runtime SessionStart hooks are loaded for reload or the next session only.",path:"hooks.SessionStart",severity:"warning"},handler.source));continue}let match=handler.event==="Notification"?{diagnostics:[],matched:!0}:matchesLifecycleMatcher(handler,options.matcherInputs);diagnostics.push(...match.diagnostics),match.matched&&matched.push(handler)}let trustRecords=listHookTrustRecords(matched,options.trustState,{platform:process.platform}),trusted=matched.filter((_handler,index)=>trustRecords[index]?.executable===!0);return{diagnostics,handlers:trusted}}function isInitialRuntimeSessionStart(handler,input){return input.event==="SessionStart"&&input.reason==="startup"&&handler.source.discoveredAt==="runtime"}function matchesLifecycleMatcher(handler,inputs){let matcher=handler.matcher?.trim();if(matcher===void 0||matcher.length===0||matcher==="*")return{diagnostics:[],matched:!0};let literalMatched=matcher.split(/[|,]/).map(part=>part.trim()).filter(part=>part.length>0).some(part=>inputs.includes(part));try{let regex2=new RegExp(matcher);return{diagnostics:[],matched:literalMatched||inputs.some(input=>regex2.test(input))}}catch(error2){if(error2 instanceof SyntaxError)return{diagnostics:[diagnostic({code:"invalid_matcher",event:handler.event,message:`Hook matcher is not a valid JavaScript regular expression: ${error2.message}`,path:`hooks.${handler.event}[${handler.groupIndex}].matcher`,severity:"warning"},handler.source)],matched:literalMatched};throw error2}}function stripLifecycleMatcher(handler){return{config:handler.config,event:handler.event,groupIndex:handler.groupIndex,handlerIndex:handler.handlerIndex,source:handler.source}}function lifecycleResultDetails(event,result3){if(result3===void 0)return{cancel:!1,contexts:[],diagnostics:[]};let diagnostics=[...result3.diagnostics,...commandFailureDiagnostics(event,result3)],contexts=[];for(let summary of result3.summaries){let output=readLifecycleHookOutput(event,summary.run.stdout);output?.additionalContext!==void 0&&event!=="PreCompact"&&contexts.push(output.additionalContext),event==="PreCompact"&&diagnostics.push(...preCompactUnsupportedDiagnostics(summary.handler,output))}let reason=event==="PreCompact"&&result3.decision.kind==="block"?result3.decision.reason:void 0;return{cancel:event==="PreCompact"&&result3.decision.kind==="block",contexts,diagnostics,...reason===void 0?{}:{reason}}}function commandFailureDiagnostics(event,result3){return result3.summaries.flatMap(summary=>{if(summary.run.exitCode===0||summary.run.exitCode===2&&event==="PreCompact")return[];let status=summary.run.exitCode===null?"without an exit code":`with exit code ${summary.run.exitCode}`;return[diagnostic({code:"invalid_root",event,message:`Hook command failed ${status}.`,path:"process.exitCode",severity:"warning"},summary.handler.source)]})}function preCompactUnsupportedDiagnostics(handler,output){if(output===void 0)return[];let diagnostics=[];return output.additionalContext!==void 0&&diagnostics.push(diagnostic({code:"unsupported_field",event:"PreCompact",message:"PreCompact additionalContext is diagnostic-only in builtin hooks v1.",path:"stdout.hookSpecificOutput.additionalContext",severity:"warning"},handler.source)),output.customInstructions!==void 0&&diagnostics.push(diagnostic({code:"unsupported_field",event:"PreCompact",message:"PreCompact customInstructions cannot mutate compaction in builtin hooks v1.",path:"stdout.hookSpecificOutput.customInstructions",severity:"warning"},handler.source)),diagnostics}function readLifecycleHookOutput(event,stdout){let trimmed=stdout.trim();if(trimmed.length===0)return;let parsed;try{parsed=JSON.parse(trimmed)}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}if(!isRecord31(parsed))return;let specific=isRecord31(parsed.hookSpecificOutput)?parsed.hookSpecificOutput:void 0;if(!(specific?.hookEventName!==void 0&&specific.hookEventName!==event))return{...textField(specific?.additionalContext??parsed.additionalContext,"additionalContext"),...textField(specific?.customInstructions??parsed.customInstructions,"customInstructions"),...textField(parsed.decision,"decision"),...textField(specific?.permissionDecisionReason??parsed.reason,"reason")}}function textField(value2,key){if(typeof value2!="string")return{};let trimmed=value2.trim();return trimmed.length===0?{}:{[key]:trimmed}}function isRecord31(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}var STOP_STATE_CUSTOM_TYPE="senpi.hooks.stop-state",STOP_DIAGNOSTICS_CUSTOM_TYPE="senpi.hooks.stop-diagnostics",STOP_OUTPUT_CUSTOM_TYPE="senpi.hooks.stop-output",STOP_REENTRY_LIMIT=8;function buildStopHookInput(event,ctx){let transcriptPath=ctx.sessionManager.getSessionFile(),stopReason=findLastAssistantStopReason(event.messages);return{cwd:ctx.cwd,event:"Stop",hook_event_name:"Stop",session_id:ctx.sessionManager.getSessionId(),...stopReason===void 0?{}:{stopReason},...transcriptPath===void 0?{}:{transcript_path:transcriptPath}}}function createStopTurnTracker(){let activeTurnKey,turnIndex=0;return{reset(){turnIndex+=1,activeTurnKey=void 0},turnKey(ctx){if(activeTurnKey!==void 0)return activeTurnKey;let leafId=ctx.sessionManager.getLeafId()??ctx.sessionManager.getSessionId();return activeTurnKey=`${turnIndex}:${leafId}`,activeTurnKey}}}function applyStopHookResult(pi,ctx,result3,turnKey){let sessionId=ctx.sessionManager.getSessionId(),previous=latestStopState(ctx,sessionId,turnKey);if(previous.count>=STOP_REENTRY_LIMIT)return appendStopState(pi,{count:previous.count,sessionId,turnKey}),appendStopDiagnostics(pi,[diagnostic({code:"unsupported_event",event:"Stop",message:"Stop hook reentry limit reached.",path:"hooks.Stop",severity:"warning"},limitDiagnosticSource(result3))]),Promise.resolve();let unsupportedDiagnostics=unsupportedStopOutputDiagnostics(result3);if((unsupportedDiagnostics.length>0||result3.diagnostics.length>0)&&appendStopDiagnostics(pi,[...result3.diagnostics,...unsupportedDiagnostics]),appendStopOutputs(pi,stopOutputRecords(result3)),result3.decision.kind!=="block")return appendStopState(pi,{count:previous.count,sessionId,turnKey}),Promise.resolve();let count=previous.count+1;appendStopState(pi,{count,sessionId,turnKey});let followUp=stopFollowUpText(result3);return followUp===void 0?(appendStopDiagnostics(pi,[diagnostic({code:"unsupported_field",event:"Stop",message:"Stop hook blocked without follow-up context.",path:"stdout.reason",severity:"warning"},result3.decision.source)]),Promise.resolve()):(pi.sendUserMessage(followUp,{deliverAs:"followUp"}),waitForFollowUpQueue(ctx))}async function waitForFollowUpQueue(ctx){for(let attempt2=0;attempt2<64;attempt2+=1)if(await Promise.resolve(),ctx.hasPendingMessages())return}function latestStopState(ctx,sessionId,turnKey){let entries=ctx.sessionManager.getEntries();for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(!(entry?.type!=="custom"||entry.customType!==STOP_STATE_CUSTOM_TYPE)&&isStopState(entry.data)&&entry.data.sessionId===sessionId&&entry.data.turnKey===turnKey)return entry.data}return{count:0,sessionId,turnKey}}function appendStopState(pi,state){pi.appendEntry(STOP_STATE_CUSTOM_TYPE,state)}function appendStopDiagnostics(pi,diagnostics){diagnostics.length!==0&&pi.appendEntry(STOP_DIAGNOSTICS_CUSTOM_TYPE,diagnostics.map(safeStopDiagnosticDetails))}function safeStopDiagnosticDetails(diagnostic2){return diagnostic2.code==="invalid_event_config"&&diagnostic2.event==="Stop"&&diagnostic2.path==="stdout.hookSpecificOutput.hookEventName"?{...safeDiagnosticDetails(diagnostic2),message:"Hook output event does not match Stop."}:safeDiagnosticDetails(diagnostic2)}function appendStopOutputs(pi,records){records.length!==0&&pi.appendEntry(STOP_OUTPUT_CUSTOM_TYPE,records)}function stopOutputRecords(result3){return result3.summaries.flatMap(summary=>{let fields=stopOutputFieldPaths(summary);return fields.length===0?[]:[{event:"Stop",exitCode:summary.run.exitCode,fields,sourcePath:summary.handler.source.sourcePath}]})}function unsupportedStopOutputDiagnostics(result3){let diagnostics=[];for(let summary of result3.summaries)diagnostics.push(...unsupportedSummaryDiagnostics(summary));return diagnostics}function unsupportedSummaryDiagnostics(summary){let diagnostics=[];summary.output.systemMessage!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.systemMessage","Stop does not support systemMessage.")),summary.output.suppressOutput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.suppressOutput","Stop does not support suppressOutput.")),summary.output.stopReason!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.stopReason","Stop output stopReason is diagnostic-only.")),summary.output.updatedInput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.updatedInput","Stop does not support updatedInput.")),summary.output.updatedToolOutput!==void 0&&diagnostics.push(unsupportedField(summary,"stdout.updatedToolOutput","Stop does not support updatedToolOutput."));for(let path15 of rawUnsupportedStopFieldPaths(summary))diagnostics.push(unsupportedField(summary,path15,`Stop does not support ${path15.replace("stdout.","")}.`));return diagnostics}function stopOutputFieldPaths(summary){let fields=[];if(summary.output.decision!==void 0&&fields.push("stdout.decision"),summary.output.reason!==void 0&&fields.push("stdout.reason"),summary.output.additionalContext!==void 0){let raw=rawStdoutObject(summary.run.stdout),specific=raw===void 0?void 0:rawHookSpecificOutput(raw);fields.push(specific!==void 0&&Object.hasOwn(specific,"additionalContext")?"stdout.hookSpecificOutput.additionalContext":"stdout.additionalContext")}return summary.output.continue!==void 0&&fields.push("stdout.continue"),summary.output.stopReason!==void 0&&fields.push("stdout.stopReason"),summary.output.suppressOutput!==void 0&&fields.push("stdout.suppressOutput"),summary.output.systemMessage!==void 0&&fields.push("stdout.systemMessage"),fields.push(...rawUnsupportedStopFieldPaths(summary)),fields}function rawUnsupportedStopFieldPaths(summary){let raw=rawStdoutObject(summary.run.stdout);if(raw===void 0)return[];let fields=[];pushFieldIfPresent(fields,raw,"updatedInput","stdout.updatedInput"),pushFieldIfPresent(fields,raw,"updatedToolOutput","stdout.updatedToolOutput");let specific=rawHookSpecificOutput(raw);return specific!==void 0&&(pushFieldIfPresent(fields,specific,"updatedInput","stdout.hookSpecificOutput.updatedInput"),pushFieldIfPresent(fields,specific,"updatedToolOutput","stdout.hookSpecificOutput.updatedToolOutput")),fields}function pushFieldIfPresent(fields,record7,key,path15){Object.hasOwn(record7,key)&&fields.push(path15)}function rawStdoutObject(stdout){let trimmed=stdout.trim();if(trimmed.length!==0)try{let parsed=JSON.parse(trimmed);return isRecord32(parsed)?parsed:void 0}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}}function rawHookSpecificOutput(raw){let value2=raw.hookSpecificOutput;return isRecord32(value2)?value2:void 0}function unsupportedField(summary,path15,message){return diagnostic({code:"unsupported_field",event:"Stop",message,path:path15,severity:"warning"},summary.handler.source)}function stopFollowUpText(result3){if(result3.decision.kind!=="block")return;let blocker=blockingSummary(result3);if(!(blocker===void 0||blocker.run.exitCode===2))return blocker.output.additionalContext??result3.decision.reason}function blockingSummary(result3){if(result3.decision.kind!=="block")return;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny"))}function limitDiagnosticSource(result3){return result3.matchedHandlers[0]?.source??result3.executableHandlers[0]?.source??{discoveredAt:"runtime",displayOrder:0,scope:"managed",sourcePath:"<builtin:hooks>"}}function isStopState(value2){return typeof value2!="object"||value2===null||Array.isArray(value2)||!("sessionId"in value2)||!("turnKey"in value2)||!("count"in value2)?!1:typeof value2.sessionId=="string"&&typeof value2.turnKey=="string"&&typeof value2.count=="number"&&Number.isInteger(value2.count)&&value2.count>=0}function isRecord32(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function findLastAssistantStopReason(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message?.role==="assistant")return message.stopReason}}var STOP_DRAIN_GRACE_MS=2e3,USER_TURN_WAKE_SOURCE="ask-user";function registerStopLifecycle(pi,deps){let turnTracker=createStopTurnTracker(),backgroundWork=new Map,pending,drainTimer;async function dispatchStop({ctx,input}){let state=deps.refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input,signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust});await applyStopHookResult(pi,ctx,result3,turnTracker.turnKey(ctx))}function clearDrainTimer(){drainTimer!==void 0&&(clearTimeout(drainTimer),drainTimer=void 0)}function dropPending(){clearDrainTimer(),pending=void 0}function dispatchPendingIfQuiet(){drainTimer=void 0;let stop=pending;stop===void 0||backgroundWork.size>0||!stop.ctx.isIdle()||stop.ctx.hasPendingMessages()||(pending=void 0,dispatchStop(stop).catch(error2=>{isStaleExtensionContextError(error2)||stop.ctx.ui.notify(`Stop hook dispatch failed: ${error2 instanceof Error?error2.message:String(error2)}`,"error")}))}return pi.events.on(WAKE_SOURCE_STATE_EVENT,data=>{!isWakeSourceStateEvent(data)||data.source===USER_TURN_WAKE_SOURCE||(data.activeCount>0?backgroundWork.set(data.source,data.activeCount):backgroundWork.delete(data.source),clearDrainTimer(),!(backgroundWork.size>0||pending===void 0)&&(drainTimer=setTimeout(dispatchPendingIfQuiet,STOP_DRAIN_GRACE_MS),drainTimer.unref()))}),pi.on("agent_end",async(event,ctx)=>{let stop={ctx,input:buildStopHookInput(event,ctx)};if(backgroundWork.size>0){pending=stop;return}dropPending(),await dispatchStop(stop)}),pi.on("agent_start",()=>dropPending()),pi.on("session_shutdown",()=>dropPending()),{resetTurn:()=>turnTracker.reset()}}var PRE_TOOL_BLOCK_REASON="PreToolUse hook blocked the tool call.",POST_TOOL_BLOCK_REASON="PostToolUse hook flagged the tool result.";function buildPreToolUseHookInput(event,ctx){return{event:"PreToolUse",toolName:event.toolName,toolInput:event.input,cwd:ctx.cwd,session_id:ctx.sessionManager.getSessionId(),hook_event_name:"PreToolUse",tool_name:event.toolName,tool_input:event.input,tool_use_id:event.toolCallId}}function buildPostToolUseHookInput(event,ctx){return{event:"PostToolUse",toolName:event.toolName,toolInput:event.input,toolOutput:{content:event.content,details:event.details,is_error:event.isError},cwd:ctx.cwd,session_id:ctx.sessionManager.getSessionId(),hook_event_name:"PostToolUse",tool_name:event.toolName,tool_input:event.input,tool_response:{content:event.content,details:event.details,is_error:event.isError},tool_use_id:event.toolCallId}}function applyPreToolUseResult(event,result3){if(result3.decision.kind==="block")return{block:!0,reason:preToolBlockReasonFromResult(result3)};if(result3.decision.kind==="ask")return{block:!0,reason:result3.decision.fallback.reason};result3.decision.kind==="allow"&&isRecord33(result3.decision.updatedInput)&&replaceToolInput(event.input,result3.decision.updatedInput)}function applyPostToolUseResult(event,result3,preToolContexts=[]){return result3.decision.kind==="block"?{content:[{type:"text",text:postToolBlockReasonFromResult(result3)},...preToolContexts.map(contextTextPart),...toolContextsFromResult(result3).map(contextTextPart)],details:event.details,isError:!0}:collectPostToolUseReplacement(event,result3,preToolContexts)}function toolContextsFromResult(result3){return result3.summaries.flatMap(summary=>summary.output.additionalContext===void 0?[]:[summary.output.additionalContext])}function preToolBlockReasonFromResult(result3){if(result3.decision.kind!=="block")return PRE_TOOL_BLOCK_REASON;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny")||!1)?.run.exitCode===2?PRE_TOOL_BLOCK_REASON:result3.decision.reason??PRE_TOOL_BLOCK_REASON}function postToolBlockReasonFromResult(result3){if(result3.decision.kind!=="block")return POST_TOOL_BLOCK_REASON;let sourcePath=result3.decision.source.sourcePath;return result3.summaries.find(summary=>summary.handler.source.sourcePath===sourcePath&&(summary.output.decision==="block"||summary.output.decision==="deny")||!1)?.run.exitCode===2?POST_TOOL_BLOCK_REASON:result3.decision.reason??POST_TOOL_BLOCK_REASON}function collectPostToolUseReplacement(event,result3,preToolContexts){let content=[...event.content],details=event.details,replaced=!1,postToolContexts=[];for(let summary of result3.summaries){let updated=normalizeUpdatedToolOutput(summary.output.updatedToolOutput);updated!==void 0&&(content=[...updated.content],details=updated.details,replaced=!0);let context=summary.output.additionalContext;context!==void 0&&postToolContexts.push(context)}for(let context of postToolContexts)content.push(contextTextPart(context));for(let context of preToolContexts)content.push(contextTextPart(context));if(!(!replaced&&postToolContexts.length===0&&preToolContexts.length===0))return{content,...details===void 0?{}:{details}}}function normalizeUpdatedToolOutput(value2){if(typeof value2=="string")return{content:[{type:"text",text:value2}]};if(isContentArray(value2))return{content:value2};if(!isRecord33(value2))return;let content=value2.content;if(typeof content=="string")return{content:[{type:"text",text:content}],details:value2.details};if(isContentArray(content))return{content,details:value2.details}}function replaceToolInput(target,replacement){for(let key of Object.keys(target))delete target[key];Object.assign(target,replacement)}function contextTextPart(text2){return{type:"text",text:text2}}function isContentArray(value2){return Array.isArray(value2)&&value2.every(isContentPart)}function isContentPart(value2){return isRecord33(value2)?value2.type==="text"?typeof value2.text=="string":value2.type==="image"&&typeof value2.mimeType=="string"&&typeof value2.data=="string":!1}function isRecord33(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}var import_proper_lockfile3=__toESM(require_proper_lockfile(),1);import{randomUUID as randomUUID7}from"node:crypto";import{chmodSync as chmodSync8,existsSync as existsSync13,mkdirSync as mkdirSync10,readFileSync as readFileSync23,renameSync as renameSync9,rmSync as rmSync6,statSync as statSync8,writeFileSync as writeFileSync11}from"node:fs";import{readFile as readFile8}from"node:fs/promises";import{dirname as dirname19,join as join32}from"node:path";var FileHookStateStorage=class{constructor(options){let agentDir=options.agentDir??getAgentDir();this.globalStatePath=join32(agentDir,"hooks-state.json"),this.projectStatePath=join32(options.cwd,CONFIG_DIR_NAME,"hooks-state.json")}async readAsync(scope){let path15=statePathForScope(scope,this.globalStatePath,this.projectStatePath);try{return readHookTrustStateJson(await readFile8(path15,"utf8"))}catch(error2){if(errorCode2(error2)==="ENOENT")return emptyHookTrustState();throw error2}}read(scope){let path15=statePathForScope(scope,this.globalStatePath,this.projectStatePath),snapshot=parseHookTrustStateJson(existsSync13(path15)?readFileSync23(path15,"utf-8"):void 0);if(snapshot!==void 0)return snapshot;if(!existsSync13(dirname19(path15)))return emptyHookTrustState();let release4;try{release4=acquireHookStateLockSync(path15)}catch(error2){let code=errorCode2(error2);if(code==="ELOCKED"||code==="EPERM"||code==="EACCES"||code==="EROFS")return emptyHookTrustState();throw error2}return runWithHookStateLockRelease(release4,()=>readHookTrustStateJson(existsSync13(path15)?readFileSync23(path15,"utf-8"):void 0))}update(scope,updater){return withHookStateFileLock(statePathForScope(scope,this.globalStatePath,this.projectStatePath),path15=>{let stateExists=existsSync13(path15),current=readHookTrustStateJson(stateExists?readFileSync23(path15,"utf-8"):void 0),mode=stateExists?statSync8(path15).mode&511:384,next=updater(current),tempPath=`${path15}.${process.pid}.${randomUUID7()}.tmp`;try{writeFileSync11(tempPath,serializeHookTrustState(next),{encoding:"utf-8",mode}),chmodSync8(tempPath,mode),renameSync9(tempPath,path15)}catch(publicationError){try{rmSync6(tempPath,{force:!0})}catch(cleanupError){throw new AggregateError([publicationError,cleanupError],"Failed to publish and clean up hook trust state snapshot")}throw publicationError}return next})}};function statePathForScope(scope,globalStatePath,projectStatePath){return scope==="global"?globalStatePath:projectStatePath}function serializeHookTrustState(state){let sortedHooks={};for(let key of Object.keys(state.hooks).sort()){let entry=state.hooks[key];entry!==void 0&&(sortedHooks[key]=entry)}return`${JSON.stringify({version:1,hooks:sortedHooks},null,2)}
1115
- `}function acquireHookStateLockSync(path15){let stateDir=dirname19(path15);mkdirSync10(stateDir,{recursive:!0});let maxAttempts=10,delayMs=20,lastError;for(let attempt2=1;attempt2<=maxAttempts;attempt2++)try{return import_proper_lockfile3.default.lockSync(stateDir,{realpath:!1,lockfilePath:`${path15}.lock`})}catch(error2){if(errorCode2(error2)!=="ELOCKED"||attempt2===maxAttempts)throw error2;lastError=error2;let start=Date.now();for(;Date.now()-start<delayMs;)Date.now()}throw lastError instanceof Error?lastError:new Error("Failed to acquire hook state lock")}function errorCode2(error2){if(!isRecord34(error2))return;let code=error2.code;return typeof code=="string"?code:void 0}function isRecord34(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function withHookStateFileLock(path15,fn){let release4=acquireHookStateLockSync(path15);return runWithHookStateLockRelease(release4,()=>fn(path15))}function runWithHookStateLockRelease(release4,operation){let result3;try{result3=operation()}catch(operationError2){try{release4()}catch(releaseError){throw new AggregateError(operationError2 instanceof AggregateError?[...operationError2.errors,releaseError]:[operationError2,releaseError],"Hook state operation and lock release both failed")}throw operationError2}return release4(),result3}function hooksExtension(pi){let pendingPromptContexts=[],pendingPreToolContexts=new Map,refreshState=ctx=>{let sources=ctx.getLoadedHookSources?.()??fallbackHookSources(ctx.cwd),parsed=loadHookConfigSources({agentDir:sources.agentDir,cwd:sources.cwd,fileSystem:{readTextFile(path15){return existsSync14(path15)?readFileSync24(path15,"utf-8"):void 0}},globalHookSourcePaths:sources.globalHookSourcePaths,globalHooksPath:sources.globalHooksPath,globalSettingsHooks:sources.globalSettingsHooks,preSessionHookSourcePaths:sources.preSessionHookSourcePaths,projectHookSourcePaths:sources.projectHookSourcePaths,projectHooksPath:sources.projectHooksPath,projectSettingsHooks:sources.projectSettingsHooks,runtimeHookSourcePaths:sources.runtimeHookSourcePaths}),storage=new FileHookStateStorage({agentDir:sources.agentDir,cwd:sources.cwd}),trust=mergeTrustStates(storage.read("global"),ctx.isProjectTrusted()?storage.read("project"):emptyHookTrustState());return{parsed,trust,storage}},stopLifecycle=registerStopLifecycle(pi,{refreshState});for(let channel of[ASK_USER_ASKED_EVENT,ASK_USER_SETTLED_EVENT])pi.events.on(channel,async data=>{let event=data,{ctx,request:request2,variant}=event,response="response"in event?event.response:void 0,headers=request2.questions.map(question=>question.header).join(", "),input=buildNotificationHookInput({kind:response===void 0?"ask-user-asked":response.status==="timed_out"?"ask-user-timeout":"ask-user-settled",message:response===void 0?`Question asked (${headers})`:response.status==="timed_out"?`Question timed out (${headers}): ${formatResultText(variant,response,request2.questions)}`:`Question ${response.status} (${headers})`,requestId:request2.requestId,source:"ask-user",status:response?.status??"pending",title:headers},ctx),sources=ctx.getLoadedHookSources?.()??fallbackHookSources(ctx.cwd),parsed=await loadHookConfigSourcesAsync(sources),handlers=parsed.executableHandlers.filter(handler=>handler.event==="Notification");if(handlers.length===0)return;let storage=new FileHookStateStorage({agentDir:sources.agentDir,cwd:sources.cwd}),[globalTrust,projectTrust]=await Promise.all([storage.readAsync("global"),ctx.isProjectTrusted()?storage.readAsync("project"):emptyHookTrustState()]),result3=await dispatchNotificationHookEvent({cwd:ctx.cwd,handlers,input,...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:mergeTrustStates(globalTrust,projectTrust)}),details=notificationResultDetails(result3);recordLifecycleHookResult(pi,"Notification",{...details,diagnostics:[...parsed.diagnostics,...details.diagnostics]})});pi.on("session_start",async(event,ctx)=>{let state=refreshState(ctx),input=buildSessionStartHookInput(event,ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input,matcherInputs:["SessionStart",event.reason],...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:state.trust});recordLifecycleHookResult(pi,"SessionStart",sessionStartResultDetails(result3))}),pi.on("input",async(event,ctx)=>{if(event.source==="extension")return;stopLifecycle.resetTurn(),pendingPromptContexts.splice(0);let state=refreshState(ctx),input=buildUserPromptHookInput({cwd:ctx.cwd,permissionMode:"default",prompt:event.text,sessionId:ctx.sessionManager.getSessionId(),transcriptPath:ctx.sessionManager.getSessionFile()}),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input,signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust});if(result3.decision.kind==="block"){let reason=promptBlockReasonFromResult(result3);return ctx.ui.notify(reason,"warning"),pi.sendMessage({customType:HOOK_CUSTOM_MESSAGE_TYPE,content:reason,display:!1,details:{decision:"block",event:"UserPromptSubmit",sourcePath:result3.decision.source.sourcePath}},{triggerTurn:!1}),{action:"handled"}}if(ctx.isIdle()){let pending=promptContextFromResult(result3);pending!==void 0&&pendingPromptContexts.push(pending)}return{action:"continue"}});let onBeforeAgentStart=async event=>{if(event.preview===!0)return;let pending=pendingPromptContexts.shift();if(pending===void 0)return;let messageContent=formatPromptContextMessage(pending),systemPrompt=appendSystemMessages(event.systemPrompt,pending.systemMessages);if(messageContent===void 0&&systemPrompt===event.systemPrompt)return;let result3={};return messageContent!==void 0&&(result3.message={customType:HOOK_CUSTOM_MESSAGE_TYPE,content:messageContent,display:!1,details:{event:"UserPromptSubmit",diagnostics:pending.diagnostics.map(safeDiagnosticDetails)}}),systemPrompt!==event.systemPrompt&&(result3.systemPrompt=systemPrompt),result3};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("tool_call",async(event,ctx)=>{pendingPreToolContexts.delete(event.toolCallId);let state=refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPreToolUseHookInput(event,ctx),onRunningHandlersChange:running=>{running.length!==0&&ctx.updateToolHookStatus?.(runningHookHandlersStatusLabel(running))},signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust}),toolResult=applyPreToolUseResult(event,result3);if(toolResult?.block)return pendingPreToolContexts.delete(event.toolCallId),toolResult;let contexts=toolContextsFromResult(result3);return contexts.length>0&&pendingPreToolContexts.set(event.toolCallId,contexts),toolResult}),pi.on("tool_result",async(event,ctx)=>{let preToolContexts=pendingPreToolContexts.get(event.toolCallId)??[];pendingPreToolContexts.delete(event.toolCallId);let state=refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPostToolUseHookInput(event,ctx),onRunningHandlersChange:running=>{running.length!==0&&ctx.updateToolHookStatus?.(runningHookHandlersStatusLabel(running))},signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust});return applyPostToolUseResult(event,result3,preToolContexts)}),pi.on("session_before_compact",async(event,ctx)=>{let state=refreshState(ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPreCompactHookInput(event,ctx),matcherInputs:["PreCompact",event.reason],signal:event.signal,trustState:state.trust}),details=preCompactResultDetails(result3);return recordLifecycleHookResult(pi,"PreCompact",details,{compactionRequestId:event.requestId}),sessionBeforeCompactResult(details)}),pi.on("session_compact",async(event,ctx)=>{if(!event.accepted)return;let state=refreshState(ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPostCompactHookInput(event,ctx),matcherInputs:["PostCompact",event.reason],...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:state.trust});recordLifecycleHookResult(pi,"PostCompact",postCompactResultDetails(result3))}),registerHooksCommand(pi,refreshState)}function mergeTrustStates(globalState,projectState){return{version:1,hooks:{...globalState.hooks,...projectState.hooks}}}function fallbackHookSources(cwd){return{agentDir:cwd,cwd,globalHookSourcePaths:[],globalHooksPath:`${cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]}}import{mkdir as mkdir7,writeFile as writeFile6}from"node:fs/promises";import{join as join33}from"node:path";var BASE_CSS="html{background:var(--background);color:var(--foreground);font-family:var(--font-sans);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;scrollbar-width:none}html::-webkit-scrollbar{display:none}body{margin:0}code,kbd,pre,samp{font-family:var(--font-mono)}",DARK_VARS={"--background":"#0a0a0a","--foreground":"#f5f5f5","--muted-foreground":"#818181","--chart-1":"#60a5fa","--font-sans":'-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',"--font-mono":'"SF Mono", "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace',"--radius":"0.625rem"},LIGHT_VARS={...DARK_VARS,"--background":"#ffffff","--foreground":"#0a0a0a","--muted-foreground":"#525252","--chart-1":"#1d4ed8"};function rootRule(appearance,variables){let declarations=Object.entries(variables).map(([name,value2])=>`${name}:${value2};`).join("");return`:root{color-scheme:${appearance};${declarations}}`}var BOOTSTRAP_SCRIPT=`(function(){var s=document.getElementById("t3-theme");if(!s)return;var b=${JSON.stringify(BASE_CSS)};try{var m=window.matchMedia("(prefers-color-scheme: light)");var a=function(){s.textContent=m.matches?${JSON.stringify(rootRule("light",LIGHT_VARS))}:${JSON.stringify(rootRule("dark",DARK_VARS))}+b;};a();if(m.addEventListener)m.addEventListener("change",a);}catch(e){}})();`;function bootstrapMarkup(markup){let defaultCss=`${rootRule("dark",DARK_VARS)}@media (prefers-color-scheme: light){${rootRule("light",LIGHT_VARS)}}${BASE_CSS}`;return[/<meta\s[^>]*charset/i.test(markup.slice(0,4096))?"":'<meta charset="utf-8">',/<meta\s[^>]*name\s*=\s*["']?viewport/i.test(markup)?"":'<meta name="viewport" content="width=device-width, initial-scale=1">',`<style id="t3-theme">${defaultCss}</style>`,`<script>${BOOTSTRAP_SCRIPT}</script>`].join("")}var blankNonMarkup=html=>{let scan2=html.replace(/<!--[\s\S]*?(?:-->|$)|<(script|style|textarea|title|xmp|iframe|noembed|noframes|noscript)\b[\s\S]*?(?:<\/\1\s*>|$)|<plaintext\b[\s\S]*$/gi,match=>" ".repeat(match.length)),parts=[],depth=0,start=0,at=0;for(let match of scan2.matchAll(/<(\/?)template(?:\s[^>]*)?\/?>/gi))if(!match[1])depth++===0&&(start=match.index);else if(depth>0&&--depth===0){let end=match.index+match[0].length;parts.push(scan2.slice(at,start)," ".repeat(end-start)),at=end}return depth>0&&(parts.push(scan2.slice(at,start)," ".repeat(scan2.length-start)),at=scan2.length),parts.push(scan2.slice(at)),parts.join("")},HTML_RENDER_CONTENT_SECURITY_POLICY=["default-src 'none'","script-src 'unsafe-inline' 'unsafe-eval' data: blob:","style-src 'unsafe-inline' data:","img-src data: blob:","font-src data:","media-src data: blob:","worker-src blob:","connect-src 'none'","frame-src 'none'","form-action 'none'","base-uri 'none'"].join("; "),POLICY_META=`<meta http-equiv="Content-Security-Policy" content="${HTML_RENDER_CONTENT_SECURITY_POLICY}">`,PREAMBLE=`\uFEFF<!doctype html>${POLICY_META}`,LEADING_ASCII_DOCTYPE=/^\uFEFF?[\t\n\f\r ]*<!doctype[ -=?-~]*>/i;function injectHtmlRenderBootstrap(html){return PREAMBLE+injectThemeBootstrap(html).replace(LEADING_ASCII_DOCTYPE,"")}function injectThemeBootstrap(html){let scan2=blankNonMarkup(html),markup=bootstrapMarkup(scan2),headOpen=/<head(?:\s[^>]*)?>/i.exec(scan2);if(headOpen){let at=headOpen.index+headOpen[0].length;return html.slice(0,at)+markup+html.slice(at)}let htmlOpen=/<html(?:\s[^>]*)?>/i.exec(scan2);if(htmlOpen){let at=htmlOpen.index+htmlOpen[0].length;return`${html.slice(0,at)}<head>${markup}</head>${html.slice(at)}`}let doctype=/^\s*<!doctype[^>]*>/i.exec(html);if(doctype){let at=doctype[0].length;return`${html.slice(0,at)}<head>${markup}</head>${html.slice(at)}`}return`<!doctype html><head>${markup}</head>${html}`}import{readFile as readFile9,stat as stat4}from"node:fs/promises";var MIB=1024*1024,MAX_IMAGE_BYTES=10*MIB,MAX_PAGE_BYTES=25*MIB;var HtmlRenderImageTooLargeError=class extends Error{constructor(path15,sizeBytes){super(`${path15} is ${(sizeBytes/MIB).toFixed(1)} MiB; each local image must be at most 10 MiB.`),this.name="HtmlRenderImageTooLargeError"}},HtmlRenderPageTooLargeError=class extends Error{constructor(sizeBytes){super(`With its images inlined the page is ${(sizeBytes/MIB).toFixed(1)} MiB; the limit is 25 MiB. Use smaller images.`),this.name="HtmlRenderPageTooLargeError"}},IMAGE_MIME_TYPES={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon"},IMAGE_EXTENSIONS=Object.keys(IMAGE_MIME_TYPES).join("|"),ABSOLUTE_PATH=String.raw`(?:/(?!/)|[a-z]:[\\/])`,LOCAL_IMAGE_PATTERN=new RegExp(String.raw`(["'\x60])(${ABSOLUTE_PATH}(?:(?!\1)[^\r\n]){0,2048}?\.(?:${IMAGE_EXTENSIONS}))\1`+String.raw`|url\(\s*(${ABSOLUTE_PATH}[^\s"'\x60()]{0,2048}?\.(?:${IMAGE_EXTENSIONS}))\s*\)`,"gid"),findLocalImages=html=>Array.from(html.matchAll(LOCAL_IMAGE_PATTERN)).flatMap(match=>{let span=match.indices?.[2]??match.indices?.[3];return span?[{start:span[0],end:span[1],path:html.slice(span[0],span[1])}]:[]}),filePathFor=reference2=>/^[a-z]:/i.test(reference2)?reference2.replaceAll("\\\\","\\"):reference2,dataUriPrefix=path15=>`data:${IMAGE_MIME_TYPES[path15.slice(path15.lastIndexOf(".")+1).toLowerCase()]??"application/octet-stream"};base64,`,latin1=(bytes,start,end)=>String.fromCharCode(...bytes.subarray(start,end)),after=(text2,token,from)=>{let at=text2.indexOf(token,from);return at===-1?-1:at+token.length},afterDoctype=(text2,from)=>{let inSubset=!1,at=from;for(;at!==-1&&at<text2.length;){let char=text2[at];if(char==='"'||char==="'")at=after(text2,char,at+1);else if(inSubset&&text2.startsWith("<!--",at))at=after(text2,"-->",at+4);else if(inSubset&&text2.startsWith("<?",at))at=after(text2,"?>",at+2);else{if(char===">"&&!inSubset)return at+1;char==="["?inSubset=!0:char==="]"&&(inSubset=!1),at+=1}}return-1},hasSvgRoot=text2=>{let at=0;for(;at!==-1;){for(;/\s/.test(text2.charAt(at));)at+=1;if(text2.startsWith("<?",at))at=after(text2,"?>",at+2);else if(text2.startsWith("<!--",at))at=after(text2,"-->",at+4);else if(text2.slice(at,at+9).toLowerCase()==="<!doctype")at=afterDoctype(text2,at+9);else return/^<svg[ \t\r\n/>]/.test(text2.slice(at,at+5))}return!1},isImageBytes=bytes=>{let head=latin1(bytes,0,12);return head.startsWith("\x89PNG")||head.startsWith("\xFF\xD8\xFF")||head.startsWith("GIF8")||head.startsWith("\0\0\0")||head.startsWith("BM")&&head.slice(6,10)==="\0\0\0\0"||head.startsWith("RIFF")&&head.slice(8,12)==="WEBP"||/^ftyp(?:avif|avis|mif1)$/.test(head.slice(4,12))?!0:hasSvgRoot(new TextDecoder().decode(bytes.subarray(0,4096)))};async function inlineLocalImages(html){let references=findLocalImages(html),uniquePaths2=[...new Set(references.map(reference2=>reference2.path))],files=await Promise.all(uniquePaths2.map(async path15=>{try{let info=await stat4(filePathFor(path15));return{path:path15,size:info.isFile()?Number(info.size):void 0}}catch{return{path:path15,size:void 0}}})),oversized=files.find(file=>file.size!==void 0&&file.size>MAX_IMAGE_BYTES);if(oversized?.size!==void 0)throw new HtmlRenderImageTooLargeError(oversized.path,oversized.size);let images=new Map,readBytes=0;for(let file of files.filter(entry=>entry.size!==void 0)){let bytes=new Uint8Array(await readFile9(filePathFor(file.path)));if(isImageBytes(bytes)){if(bytes.byteLength>MAX_IMAGE_BYTES)throw new HtmlRenderImageTooLargeError(file.path,bytes.byteLength);if(readBytes+=Math.ceil(bytes.byteLength/3)*4,readBytes>MAX_PAGE_BYTES)throw new HtmlRenderPageTooLargeError(readBytes);images.set(file.path,bytes)}}let parts=[],cursor=0;for(let reference2 of references){let bytes=images.get(reference2.path);bytes!==void 0&&(parts.push(html.slice(cursor,reference2.start),dataUriPrefix(reference2.path)+Buffer.from(bytes).toString("base64")),cursor=reference2.end)}parts.push(html.slice(cursor));let inlined=parts.join("");if(Buffer.byteLength(inlined)>MAX_PAGE_BYTES)throw new HtmlRenderPageTooLargeError(Buffer.byteLength(inlined));let missing=files.filter(file=>!images.has(file.path)).map(file=>file.path);return{html:inlined,missing}}var MAX_HTML_CHARACTERS=512e3,Params=typebox_exports.Object({html:typebox_exports.String({description:"A complete, self-contained HTML document.",minLength:1,maxLength:MAX_HTML_CHARACTERS}),title:typebox_exports.String({description:"Short name for the page.",minLength:1,maxLength:200}),height:typebox_exports.Optional(typebox_exports.Integer({description:"Frame height hint in CSS pixels, 80-2000. Defaults to the page's natural height."}))}),OUTPUT_DIR=".senpi/html-pages",clampHeight=height=>height===void 0?void 0:Math.min(2e3,Math.max(80,Math.round(height))),showHtmlPageTool={name:"show_html_page",label:"Show HTML Page",description:"Show a finished self-contained HTML page (chart, table, diagram, mockup) to the reader. No network: inline every script, style and image (data: URIs). A <script src>, stylesheet link, font, image or fetch that points at a URL (a CDN included) is refused, and the page comes out blank or broken. Local images written as absolute file paths are inlined automatically after a byte check. In the desktop thread this renders inline above your reply; elsewhere it is written to a file you can open in the desktop.",promptSnippet:"show_html_page: show a self-contained HTML page (chart/table/diagram) to the reader",promptGuidelines:["No network: inline every script, style and image (data: URIs); a CDN <script src> or remote font is refused and leaves the page blank.","Absolute-path local images are inlined after a magic-byte check; a renamed non-image is refused."],parameters:Params,async execute(_toolCallId,params,_signal,_onUpdate,ctx){let inlined=await inlineLocalImages(params.html),prepared=injectHtmlRenderBootstrap(inlined.html),height=clampHeight(params.height),dir=join33(ctx.cwd,OUTPUT_DIR);await mkdir7(dir,{recursive:!0});let safeName=params.title.replace(/[\\/:*?"<>|\p{Cc}]+/gu," ").replace(/\s+/g," ").trim().slice(0,60)||"page",path15=join33(dir,`${safeName}-${Date.now().toString(36)}.html`);await writeFile6(path15,prepared,"utf8");let missing=inlined.missing.length===0?void 0:inlined.missing;return{content:[{type:"text",text:`Wrote the page to ${path15}. Open it in the desktop to see it rendered with your theme. `+(missing===void 0?"Local images were inlined.":`Some local images could not be read and were left as written: ${missing.join(", ")}.`)}],details:{path:path15,title:params.title,height,prepared:!0,...missing?{missingImages:missing}:{},html:params.html}}}};function htmlRenderExtension(pi){pi.registerTool(showHtmlPageTool)}import{existsSync as existsSync16}from"node:fs";import{dirname as dirname21}from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";var OPENAI_BASE_URL="https://api.openai.com/v1",SETUP_REASON='Image generation is not configured. Store an OpenAI API key for provider "openai", configure an OpenAI-compatible gateway in models.json and optionally pin it with PI_IMAGE_GEN_PROVIDER, or set OPENAI_API_KEY.';function nonEmpty(value2){let trimmed=value2?.trim();return trimmed||void 0}function resolvedHeaders(headers){if(!headers)return;let resolved={};for(let[name,value2]of Object.entries(headers))typeof value2=="string"&&value2.trim().length>0&&(resolved[name]=value2);return Object.keys(resolved).length>0?resolved:void 0}function isPlaceholderKey(apiKey){return/^SK-SENTINEL-DO-NOT-LOG/i.test(apiKey)}function credentialParts(auth){let apiKey=nonEmpty(auth?.apiKey);if(!apiKey||isPlaceholderKey(apiKey))return;let headers=resolvedHeaders(auth?.headers);return{apiKey,...headers?{headers}:{}}}function isStoredApiKey(value2){return typeof value2=="object"&&value2!==null&&"type"in value2&&value2.type==="api_key"}function isGatewayApi(api){return api==="openai-completions"||api==="openai-responses"}function compareText(left,right){return left<right?-1:left>right?1:0}function compareProviderIds(left,right){let leftMatches=/openai/i.test(left),rightMatches=/openai/i.test(right);return leftMatches!==rightMatches?leftMatches?-1:1:compareText(left,right)}function groupGatewayModels(models){let groups=new Map,ordered=[...models].sort((left,right)=>compareText(left.provider,right.provider)||compareText(left.id,right.id));for(let model of ordered)model.provider==="openai"||!isGatewayApi(model.api)||!nonEmpty(model.baseUrl)||groups.has(model.provider)||groups.set(model.provider,model);return groups}async function resolveStoredOpenAi(registry){if(!isStoredApiKey(registry.authStorage.get("openai")))return;let resolved;try{resolved=await registry.getProviderAuth("openai")}catch{return}let credentials=credentialParts(resolved?.auth);if(credentials)return{kind:"native-openai",...credentials,baseUrl:OPENAI_BASE_URL,provenance:"store",providerId:"openai"}}async function resolveGateway(providerId,model,registry){let baseUrl=nonEmpty(model.baseUrl);if(!baseUrl)return;let resolved;try{resolved=await registry.getApiKeyAndHeaders(model)}catch{return}if(!resolved.ok)return;let credentials=credentialParts(resolved);if(credentials)return{kind:"gateway",...credentials,baseUrl,provenance:"provider-config",providerId}}async function resolveImageGenAuth(deps){let native=await resolveStoredOpenAi(deps.modelRegistry);if(native)return native;let groups=groupGatewayModels(deps.modelRegistry.getAll()),env=deps.env??process.env,pinnedProvider=nonEmpty(env.PI_IMAGE_GEN_PROVIDER);if(pinnedProvider){let pinnedModel=groups.get(pinnedProvider);if(pinnedModel){let pinned=await resolveGateway(pinnedProvider,pinnedModel,deps.modelRegistry);if(pinned)return pinned}}let providerIds=[...groups.keys()].filter(providerId=>providerId!==pinnedProvider).sort(compareProviderIds);for(let providerId of providerIds){let model=groups.get(providerId);if(!model)continue;let gateway=await resolveGateway(providerId,model,deps.modelRegistry);if(gateway)return gateway}let envApiKey=nonEmpty(env.OPENAI_API_KEY);return envApiKey&&!isPlaceholderKey(envApiKey)?{kind:"native-openai",apiKey:envApiKey,baseUrl:OPENAI_BASE_URL,provenance:"env"}:{kind:"none",reason:SETUP_REASON}}var NATIVE_BYPASS_MESSAGE="Image generation is handled by the provider's native server-side tool for the current model. Call the native image_generation tool instead of generate_image.",nativeBypass=!1,registryOverride;function setNativeBypass(enabled){nativeBypass=enabled}function isNativeBypass(){return nativeBypass}function imageGenRegistryOverride(){return registryOverride}import{existsSync as existsSync15}from"node:fs";import{mkdir as mkdir8,rm as rm6,writeFile as writeFile7}from"node:fs/promises";import{dirname as dirname20}from"node:path";var DEFAULT_IMAGE_MODEL="gpt-image-2.5-sunburst",IMAGE_MODEL_NAMES={"gpt-image-2.5-sunburst":"GPT Image 2.5 Sunburst","gpt-image-2.5-flare":"GPT Image 2.5 Flare","gpt-image-2":"GPT Image 2"},Params2=typebox_exports.Object({prompt:typebox_exports.String({minLength:1,maxLength:32e3,description:"Detailed description of the desired image, including the end state for edits."}),model:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("gpt-image-2.5-sunburst"),typebox_exports.Literal("gpt-image-2.5-flare"),typebox_exports.Literal("gpt-image-2")],{default:DEFAULT_IMAGE_MODEL,description:"Sunburst (default) is the most capable: highest quality, precise edits, reference fidelity, best for final assets; Flare is the small model optimized for speed, with quality comparable to gpt-image-2; gpt-image-2 is the previous generation."})),size:typebox_exports.Optional(typebox_exports.String({default:"auto",description:"auto, 1024x1024, 1536x1024, 1024x1536, or any WIDTHxHEIGHT with both divisible by 16, aspect between 1:3 and 3:1, max 3840x2160 (e.g. 2048x2048, 2048x1152, 3840x2160)"})),quality:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")],{default:"auto",description:"Rendering quality. Defaults to auto. xhigh/max are gpt-image-2.5 only, slower and costlier."})),reference_image_paths:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}),{minItems:1,maxItems:5,description:"Local PNG/JPEG/WEBP images to edit or use as references (1-5 files, each at most 50 MB). Paths may be absolute or relative to the working directory."})),mask_image_path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Inpainting mask (PNG with an alpha channel, same size as the first reference image): transparent areas are repainted. Requires reference_image_paths."})),background:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("transparent"),typebox_exports.Literal("opaque")],{default:"auto",description:"Output background. transparent needs output_format png or webp and keeps the alpha channel; auto lets the model decide."})),output_format:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("png"),typebox_exports.Literal("jpeg"),typebox_exports.Literal("webp")],{default:"png",description:"File format. png (default) is lossless and supports transparency; jpeg is fastest; webp is small and supports transparency."})),output_compression:typebox_exports.Optional(typebox_exports.Integer({minimum:0,maximum:100,description:"Compression level 0-100 for jpeg or webp output only (100 = best quality)."})),moderation:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("low")],{default:"auto",description:"Content filter strictness: auto (standard) or low (less restrictive)."})),n:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:10,default:1,description:"How many variants of this one prompt to generate; distinct assets need distinct calls."})),output_path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Where to write the image, relative to the working directory. The extension must match output_format (.png, .jpg/.jpeg, .webp) or be omitted. Defaults to generated-images/."}))},{additionalProperties:!1});function failure(message,reason,base){let details={...base,paths:[],generated:0,revisedPrompts:[],error:message,reason};return{content:[{type:"text",text:message}],details}}import{isAbsolute as isAbsolute4,relative as relative9,resolve as resolve14}from"node:path";var GENERATED_IMAGE_DIRECTORY="generated-images",DEFAULT_DIRECTORY=GENERATED_IMAGE_DIRECTORY,MAX_TOOL_CALL_ID_CHARS=64,EXTENSIONS={png:[".png"],jpeg:[".jpg",".jpeg"],webp:[".webp"]};function sanitizeImageStem(identifier){let sanitized=identifier.replace(/[^A-Za-z0-9_-]/g,"_").slice(0,MAX_TOOL_CALL_ID_CHARS);return sanitized.length>0?sanitized:"image"}function sanitizeToolCallId(toolCallId){return sanitizeImageStem(toolCallId)}function resolveTargets(cwd,toolCallId,count,outputPath,outputFormat="png"){let allowed=EXTENSIONS[outputFormat],defaultExtension=allowed[0]??".png",requested=outputPath?.trim(),base,extension;if(requested===void 0||requested.length===0)base=resolve14(cwd,DEFAULT_DIRECTORY,`${sanitizeToolCallId(toolCallId)}${defaultExtension}`),extension=defaultExtension;else{let absolute=isAbsolute4(requested)?requested:resolve14(cwd,requested),extensionMatch=/\.[^./\\]+$/.exec(absolute);if(extensionMatch&&!allowed.includes(extensionMatch[0].toLowerCase()))return{ok:!1,error:`Error: output_path must end in ${allowed.join(" or ")} for output_format ${outputFormat} (got "${requested}").`};extension=extensionMatch?extensionMatch[0]:defaultExtension,base=extensionMatch?absolute:`${absolute}${defaultExtension}`}if(count===1)return{ok:!0,paths:[base]};let stem=base.slice(0,-extension.length);return{ok:!0,paths:Array.from({length:count},(_,index)=>`${stem}-${String(index+1).padStart(2,"0")}${extension}`)}}function outputFormatOf(mimeType){if(mimeType==="image/png")return"png";if(mimeType==="image/jpeg")return"jpeg";if(mimeType==="image/webp")return"webp"}function withFormatExtension(path15,outputFormat){let extension=EXTENSIONS[outputFormat][0]??".png",extensionMatch=/\.[^./\\]+$/.exec(path15),current=extensionMatch?.[0].toLowerCase();return current!==void 0&&EXTENSIONS[outputFormat].includes(current)?path15:extensionMatch?`${path15.slice(0,-extensionMatch[0].length)}${extension}`:`${path15}${extension}`}function displayPath2(cwd,absolute){let relativePath=relative9(cwd,absolute);return relativePath&&!relativePath.startsWith("..")&&!isAbsolute4(relativePath)?relativePath:absolute}import{constants as constants2}from"node:fs";import{open as open2}from"node:fs/promises";import{resolve as resolve15}from"node:path";var MAX_REFERENCE_BYTES=50*1024*1024,PNG_SIGNATURE2=Buffer.from([137,80,78,71,13,10,26,10]),JPEG_SIGNATURE=Buffer.from([255,216,255]),RIFF_SIGNATURE=Buffer.from("RIFF"),WEBP_SIGNATURE=Buffer.from("WEBP");function imageMimeType(bytes){if(bytes.subarray(0,8).equals(PNG_SIGNATURE2))return"image/png";if(bytes.subarray(0,3).equals(JPEG_SIGNATURE))return"image/jpeg";if(bytes.subarray(0,4).equals(RIFF_SIGNATURE)&&bytes.subarray(8,12).equals(WEBP_SIGNATURE))return"image/webp"}async function loadImageFile(cwd,path15,label3){try{let file=await open2(resolve15(cwd,path15),constants2.O_RDONLY|constants2.O_NONBLOCK);try{let stat15=await file.stat();if(!stat15.isFile())throw new Error("must be a regular file");if(stat15.size>MAX_REFERENCE_BYTES)throw new Error("must be at most 50 MB");let bytes=await file.readFile();if(bytes.length>MAX_REFERENCE_BYTES)throw new Error("must be at most 50 MB");let mimeType=imageMimeType(bytes);if(mimeType===void 0)throw new Error("must be a PNG, JPEG, or WEBP image (invalid magic bytes)");return{ok:!0,image:{type:"image",data:bytes.toString("base64"),mimeType}}}finally{await file.close()}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:`Error: ${label3} "${path15}": ${reason}`}}}async function loadReferenceImages(cwd,paths){if(paths===void 0)return{ok:!0,images:[]};if(paths.length<1||paths.length>5)return{ok:!1,error:`Error: reference_image_paths must contain 1 to 5 paths (got ${paths.length}).`};let images=[];for(let path15 of paths){let loaded2=await loadImageFile(cwd,path15,"reference image");if(!loaded2.ok)return loaded2;images.push(loaded2.image)}return{ok:!0,images}}async function loadMaskImage(cwd,path15,referenceCount){if(path15!==void 0)return referenceCount===0?{ok:!1,error:"Error: mask_image_path requires at least one reference_image_paths entry to edit."}:loadImageFile(cwd,path15,"mask image")}function sourceLabel(auth){return auth.kind==="none"?"none":auth.provenance==="env"?"env:OPENAI_API_KEY":`${auth.provenance}:${auth.providerId??auth.kind}`}function synthesizeModel(auth,id){return{type:"image",id,name:IMAGE_MODEL_NAMES[id],api:"openai-images",provider:auth.providerId??"openai",baseUrl:auth.baseUrl,input:["text","image"],output:["image"],cost:getImageModel("openai",id).cost}}function collectImages(images){let collected=[],pendingText;for(let block of images.output){if(block.type==="text"){let text2=block.text.trim();pendingText=text2.length>0?text2:void 0;continue}collected.push({data:block.data,mimeType:block.mimeType,...pendingText===void 0?{}:{revisedPrompt:pendingText}}),pendingText=void 0}return collected}async function writeImages(paths,images){let written=[];for(let[index,image]of images.entries()){let target=paths[index];if(target===void 0)break;try{await mkdir8(dirname20(target),{recursive:!0}),await writeFile7(target,Buffer.from(image.data,"base64"),{flag:"wx"}),written.push(target)}catch(error2){for(let path15 of written)await rm6(path15,{force:!0}).catch(()=>{});let reason=error2 instanceof Error?error2.message:String(error2);return`Error: failed to write generated image to ${target}: ${reason}`}}}var GENERATE_IMAGE_TOOL_NAME="generate_image",generateImageTool={name:GENERATE_IMAGE_TOOL_NAME,label:"Generate Image",description:"Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default, the most capable; Flare when speed matters more than quality) and save it as a png, jpeg, or webp file, optionally with a transparent background. Pass reference_image_paths to edit or reference existing images. Generate directly when the request is clear instead of asking for confirmation. Returns the saved file paths.",promptSnippet:"Generate or edit images from prompts and optional reference images, saving them as png/jpeg/webp files.",exposure:"search",searchGroup:"imagegen",searchKeywords:["generate image","image generation","edit image","create a picture","illustration","mockup","gpt-image","transparent png"],parameters:Params2,async execute(toolCallId,params,signal,_onUpdate,ctx){let size=params.size??"auto",quality=params.quality??"auto",requested=params.n??1,modelId=params.model??DEFAULT_IMAGE_MODEL,background=params.background??"auto",outputFormat=params.output_format??"png",context={model:modelId,size,quality,background,outputFormat,requested,source:"none"},prompt=params.prompt.trim();if(prompt.length===0)return failure("Error: prompt must contain non-whitespace text.","invalid_params",context);if(isNativeBypass())return failure(NATIVE_BYPASS_MESSAGE,"provider_native_bypass",context);let auth=await resolveImageGenAuth({modelRegistry:imageGenRegistryOverride()??ctx.modelRegistry});if(auth.kind==="none")return failure(auth.reason,"missing_config",context);let source2=sourceLabel(auth),parsedSize=parseOpenAIImageSize(size);if(!parsedSize.ok)return failure(`Error: ${parsedSize.error}`,"invalid_params",{...context,source:source2});let references=await loadReferenceImages(ctx.cwd,params.reference_image_paths);if(!references.ok)return failure(references.error,"invalid_params",{...context,source:source2});let mask=await loadMaskImage(ctx.cwd,params.mask_image_path,references.images.length);if(mask!==void 0&&!mask.ok)return failure(mask.error,"invalid_params",{...context,source:source2});let outputOptions=parseOpenAIImageOutputOptions({background,outputFormat,outputCompression:params.output_compression,hasMask:mask!==void 0,imageCount:references.images.length});if(!outputOptions.ok)return failure(`Error: ${outputOptions.error}`,"invalid_params",{...context,source:source2});let targets2=resolveTargets(ctx.cwd,toolCallId,requested,params.output_path,outputFormat);if(!targets2.ok)return failure(targets2.error,"invalid_params",{...context,source:source2});for(let target of targets2.paths)if(existsSync15(target))return failure(`Error: ${displayPath2(ctx.cwd,target)} already exists. Choose another output_path.`,"invalid_params",{...context,source:source2});let images=await generateImages(synthesizeModel(auth,modelId),{input:[{type:"text",text:prompt},...references.images]},{...auth.apiKey===void 0?{}:{apiKey:auth.apiKey},...auth.headers===void 0?{}:{headers:auth.headers},...signal===void 0?{}:{signal},size,quality,n:requested,...params.background===void 0?{}:{background},outputFormat,...params.output_compression===void 0?{}:{outputCompression:params.output_compression},...params.moderation===void 0?{}:{moderation:params.moderation},...mask===void 0?{}:{mask:mask.image}});if(images.stopReason!=="stop"){let message=images.errorMessage??`Image generation ${images.stopReason}.`;return failure(`Error: ${message}`,"provider_error",{...context,source:source2})}let generated=collectImages(images);if(generated.length===0)return failure("Error: the provider returned no images.","provider_error",{...context,source:source2});let delivered=generated.map(image=>outputFormatOf(image.mimeType)??outputFormat),savedFormat=delivered[0]??outputFormat,paths=targets2.paths.map((target,index)=>{let format2=delivered[index];return format2===void 0||format2===outputFormat?target:withFormatExtension(target,format2)}),renamedCollision=paths.find((target,index)=>target!==targets2.paths[index]&&existsSync15(target));if(renamedCollision!==void 0)return failure(`Error: the provider returned ${savedFormat} instead of ${outputFormat} and ${displayPath2(ctx.cwd,renamedCollision)} already exists. Choose another output_path.`,"write_failed",{...context,source:source2});let writeError=await writeImages(paths,generated);if(writeError!==void 0)return failure(writeError,"write_failed",{...context,source:source2});let savedPaths=paths.slice(0,generated.length).map(target=>displayPath2(ctx.cwd,target)),revisedPrompts=generated.flatMap(image=>image.revisedPrompt?[image.revisedPrompt]:[]),details={paths:savedPaths,model:modelId,source:source2,size,quality,background,outputFormat:savedFormat,requested,generated:generated.length,revisedPrompts,...images.background===void 0?{}:{transparentBackground:images.background==="transparent"}};return{content:[{type:"text",text:[`Generated ${generated.length} image${generated.length===1?"":"s"}:`,...savedPaths.map(path15=>`- ${path15}`),...savedFormat===outputFormat?[]:[`Note: the provider returned ${savedFormat} instead of the requested ${outputFormat}; saved with the matching extension.`],...images.background===void 0?[]:[`Background: ${images.background}`],...revisedPrompts.map(revised=>`Revised prompt: ${revised}`),"The saved file is the deliverable; refer to it by path instead of re-embedding image data."].join(`
1110
+ `}function acquireHookStateLockSync(path15){let stateDir=dirname19(path15);mkdirSync10(stateDir,{recursive:!0});let maxAttempts=10,delayMs=20,lastError;for(let attempt2=1;attempt2<=maxAttempts;attempt2++)try{return import_proper_lockfile3.default.lockSync(stateDir,{realpath:!1,lockfilePath:`${path15}.lock`})}catch(error2){if(errorCode2(error2)!=="ELOCKED"||attempt2===maxAttempts)throw error2;lastError=error2;let start=Date.now();for(;Date.now()-start<delayMs;)Date.now()}throw lastError instanceof Error?lastError:new Error("Failed to acquire hook state lock")}function errorCode2(error2){if(!isRecord34(error2))return;let code=error2.code;return typeof code=="string"?code:void 0}function isRecord34(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function withHookStateFileLock(path15,fn){let release4=acquireHookStateLockSync(path15);return runWithHookStateLockRelease(release4,()=>fn(path15))}function runWithHookStateLockRelease(release4,operation){let result3;try{result3=operation()}catch(operationError2){try{release4()}catch(releaseError){throw new AggregateError(operationError2 instanceof AggregateError?[...operationError2.errors,releaseError]:[operationError2,releaseError],"Hook state operation and lock release both failed")}throw operationError2}return release4(),result3}function hooksExtension(pi){let pendingPromptContexts=[],pendingPreToolContexts=new Map,refreshState=ctx=>{let sources=ctx.getLoadedHookSources?.()??fallbackHookSources(ctx.cwd),parsed=loadHookConfigSources({agentDir:sources.agentDir,cwd:sources.cwd,fileSystem:{readTextFile(path15){return existsSync14(path15)?readFileSync24(path15,"utf-8"):void 0}},globalHookSourcePaths:sources.globalHookSourcePaths,globalHooksPath:sources.globalHooksPath,globalSettingsHooks:sources.globalSettingsHooks,preSessionHookSourcePaths:sources.preSessionHookSourcePaths,projectHookSourcePaths:sources.projectHookSourcePaths,projectHooksPath:sources.projectHooksPath,projectSettingsHooks:sources.projectSettingsHooks,runtimeHookSourcePaths:sources.runtimeHookSourcePaths}),storage=new FileHookStateStorage({agentDir:sources.agentDir,cwd:sources.cwd}),trust=mergeTrustStates(storage.read("global"),ctx.isProjectTrusted()?storage.read("project"):emptyHookTrustState());return{parsed,trust,storage}},stopLifecycle=registerStopLifecycle(pi,{refreshState});for(let channel of[ASK_USER_ASKED_EVENT,ASK_USER_SETTLED_EVENT])pi.events.on(channel,async data=>{let event=data,{ctx,request:request2,variant}=event,response="response"in event?event.response:void 0,headers=request2.questions.map(question=>question.header).join(", "),input=buildNotificationHookInput({kind:response===void 0?"ask-user-asked":response.status==="timed_out"?"ask-user-timeout":"ask-user-settled",message:response===void 0?`Question asked (${headers})`:response.status==="timed_out"?`Question timed out (${headers}): ${formatResultText(variant,response,request2.questions,request2.required===!0)}`:`Question ${response.status} (${headers})`,requestId:request2.requestId,source:"ask-user",status:response?.status??"pending",title:headers},ctx),sources=ctx.getLoadedHookSources?.()??fallbackHookSources(ctx.cwd),parsed=await loadHookConfigSourcesAsync(sources),handlers=parsed.executableHandlers.filter(handler=>handler.event==="Notification");if(handlers.length===0)return;let storage=new FileHookStateStorage({agentDir:sources.agentDir,cwd:sources.cwd}),[globalTrust,projectTrust]=await Promise.all([storage.readAsync("global"),ctx.isProjectTrusted()?storage.readAsync("project"):emptyHookTrustState()]),result3=await dispatchNotificationHookEvent({cwd:ctx.cwd,handlers,input,...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:mergeTrustStates(globalTrust,projectTrust)}),details=notificationResultDetails(result3);recordLifecycleHookResult(pi,"Notification",{...details,diagnostics:[...parsed.diagnostics,...details.diagnostics]})});pi.on("session_start",async(event,ctx)=>{let state=refreshState(ctx),input=buildSessionStartHookInput(event,ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input,matcherInputs:["SessionStart",event.reason],...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:state.trust});recordLifecycleHookResult(pi,"SessionStart",sessionStartResultDetails(result3))}),pi.on("input",async(event,ctx)=>{if(event.source==="extension")return;stopLifecycle.resetTurn(),pendingPromptContexts.splice(0);let state=refreshState(ctx),input=buildUserPromptHookInput({cwd:ctx.cwd,permissionMode:"default",prompt:event.text,sessionId:ctx.sessionManager.getSessionId(),transcriptPath:ctx.sessionManager.getSessionFile()}),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input,signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust});if(result3.decision.kind==="block"){let reason=promptBlockReasonFromResult(result3);return ctx.ui.notify(reason,"warning"),pi.sendMessage({customType:HOOK_CUSTOM_MESSAGE_TYPE,content:reason,display:!1,details:{decision:"block",event:"UserPromptSubmit",sourcePath:result3.decision.source.sourcePath}},{triggerTurn:!1}),{action:"handled"}}if(ctx.isIdle()){let pending=promptContextFromResult(result3);pending!==void 0&&pendingPromptContexts.push(pending)}return{action:"continue"}});let onBeforeAgentStart=async event=>{if(event.preview===!0)return;let pending=pendingPromptContexts.shift();if(pending===void 0)return;let messageContent=formatPromptContextMessage(pending),systemPrompt=appendSystemMessages(event.systemPrompt,pending.systemMessages);if(messageContent===void 0&&systemPrompt===event.systemPrompt)return;let result3={};return messageContent!==void 0&&(result3.message={customType:HOOK_CUSTOM_MESSAGE_TYPE,content:messageContent,display:!1,details:{event:"UserPromptSubmit",diagnostics:pending.diagnostics.map(safeDiagnosticDetails)}}),systemPrompt!==event.systemPrompt&&(result3.systemPrompt=systemPrompt),result3};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("tool_call",async(event,ctx)=>{pendingPreToolContexts.delete(event.toolCallId);let state=refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPreToolUseHookInput(event,ctx),onRunningHandlersChange:running=>{running.length!==0&&ctx.updateToolHookStatus?.(runningHookHandlersStatusLabel(running))},signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust}),toolResult=applyPreToolUseResult(event,result3);if(toolResult?.block)return pendingPreToolContexts.delete(event.toolCallId),toolResult;let contexts=toolContextsFromResult(result3);return contexts.length>0&&pendingPreToolContexts.set(event.toolCallId,contexts),toolResult}),pi.on("tool_result",async(event,ctx)=>{let preToolContexts=pendingPreToolContexts.get(event.toolCallId)??[];pendingPreToolContexts.delete(event.toolCallId);let state=refreshState(ctx),result3=await dispatchHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPostToolUseHookInput(event,ctx),onRunningHandlersChange:running=>{running.length!==0&&ctx.updateToolHookStatus?.(runningHookHandlersStatusLabel(running))},signal:ctx.signal,trustOptions:{platform:process.platform},trustState:state.trust});return applyPostToolUseResult(event,result3,preToolContexts)}),pi.on("session_before_compact",async(event,ctx)=>{let state=refreshState(ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPreCompactHookInput(event,ctx),matcherInputs:["PreCompact",event.reason],signal:event.signal,trustState:state.trust}),details=preCompactResultDetails(result3);return recordLifecycleHookResult(pi,"PreCompact",details,{compactionRequestId:event.requestId}),sessionBeforeCompactResult(details)}),pi.on("session_compact",async(event,ctx)=>{if(!event.accepted)return;let state=refreshState(ctx),result3=await dispatchLifecycleHookEvent({cwd:ctx.cwd,handlers:state.parsed.executableHandlers,input:buildPostCompactHookInput(event,ctx),matcherInputs:["PostCompact",event.reason],...ctx.signal===void 0?{}:{signal:ctx.signal},trustState:state.trust});recordLifecycleHookResult(pi,"PostCompact",postCompactResultDetails(result3))}),registerHooksCommand(pi,refreshState)}function mergeTrustStates(globalState,projectState){return{version:1,hooks:{...globalState.hooks,...projectState.hooks}}}function fallbackHookSources(cwd){return{agentDir:cwd,cwd,globalHookSourcePaths:[],globalHooksPath:`${cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]}}import{mkdir as mkdir7,writeFile as writeFile6}from"node:fs/promises";import{join as join33}from"node:path";var BASE_CSS="html{background:var(--background);color:var(--foreground);font-family:var(--font-sans);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;scrollbar-width:none}html::-webkit-scrollbar{display:none}body{margin:0}code,kbd,pre,samp{font-family:var(--font-mono)}",DARK_VARS={"--background":"#0a0a0a","--foreground":"#f5f5f5","--muted-foreground":"#818181","--chart-1":"#60a5fa","--font-sans":'-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',"--font-mono":'"SF Mono", "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace',"--radius":"0.625rem"},LIGHT_VARS={...DARK_VARS,"--background":"#ffffff","--foreground":"#0a0a0a","--muted-foreground":"#525252","--chart-1":"#1d4ed8"};function rootRule(appearance,variables){let declarations=Object.entries(variables).map(([name,value2])=>`${name}:${value2};`).join("");return`:root{color-scheme:${appearance};${declarations}}`}var BOOTSTRAP_SCRIPT=`(function(){var s=document.getElementById("t3-theme");if(!s)return;var b=${JSON.stringify(BASE_CSS)};try{var m=window.matchMedia("(prefers-color-scheme: light)");var a=function(){s.textContent=m.matches?${JSON.stringify(rootRule("light",LIGHT_VARS))}:${JSON.stringify(rootRule("dark",DARK_VARS))}+b;};a();if(m.addEventListener)m.addEventListener("change",a);}catch(e){}})();`;function bootstrapMarkup(markup){let defaultCss=`${rootRule("dark",DARK_VARS)}@media (prefers-color-scheme: light){${rootRule("light",LIGHT_VARS)}}${BASE_CSS}`;return[/<meta\s[^>]*charset/i.test(markup.slice(0,4096))?"":'<meta charset="utf-8">',/<meta\s[^>]*name\s*=\s*["']?viewport/i.test(markup)?"":'<meta name="viewport" content="width=device-width, initial-scale=1">',`<style id="t3-theme">${defaultCss}</style>`,`<script>${BOOTSTRAP_SCRIPT}</script>`].join("")}var blankNonMarkup=html=>{let scan2=html.replace(/<!--[\s\S]*?(?:-->|$)|<(script|style|textarea|title|xmp|iframe|noembed|noframes|noscript)\b[\s\S]*?(?:<\/\1\s*>|$)|<plaintext\b[\s\S]*$/gi,match=>" ".repeat(match.length)),parts=[],depth=0,start=0,at=0;for(let match of scan2.matchAll(/<(\/?)template(?:\s[^>]*)?\/?>/gi))if(!match[1])depth++===0&&(start=match.index);else if(depth>0&&--depth===0){let end=match.index+match[0].length;parts.push(scan2.slice(at,start)," ".repeat(end-start)),at=end}return depth>0&&(parts.push(scan2.slice(at,start)," ".repeat(scan2.length-start)),at=scan2.length),parts.push(scan2.slice(at)),parts.join("")},HTML_RENDER_CONTENT_SECURITY_POLICY=["default-src 'none'","script-src 'unsafe-inline' 'unsafe-eval' data: blob:","style-src 'unsafe-inline' data:","img-src data: blob:","font-src data:","media-src data: blob:","worker-src blob:","connect-src 'none'","frame-src 'none'","form-action 'none'","base-uri 'none'"].join("; "),POLICY_META=`<meta http-equiv="Content-Security-Policy" content="${HTML_RENDER_CONTENT_SECURITY_POLICY}">`,PREAMBLE=`\uFEFF<!doctype html>${POLICY_META}`,LEADING_ASCII_DOCTYPE=/^\uFEFF?[\t\n\f\r ]*<!doctype[ -=?-~]*>/i;function injectHtmlRenderBootstrap(html){return PREAMBLE+injectThemeBootstrap(html).replace(LEADING_ASCII_DOCTYPE,"")}function injectThemeBootstrap(html){let scan2=blankNonMarkup(html),markup=bootstrapMarkup(scan2),headOpen=/<head(?:\s[^>]*)?>/i.exec(scan2);if(headOpen){let at=headOpen.index+headOpen[0].length;return html.slice(0,at)+markup+html.slice(at)}let htmlOpen=/<html(?:\s[^>]*)?>/i.exec(scan2);if(htmlOpen){let at=htmlOpen.index+htmlOpen[0].length;return`${html.slice(0,at)}<head>${markup}</head>${html.slice(at)}`}let doctype=/^\s*<!doctype[^>]*>/i.exec(html);if(doctype){let at=doctype[0].length;return`${html.slice(0,at)}<head>${markup}</head>${html.slice(at)}`}return`<!doctype html><head>${markup}</head>${html}`}import{readFile as readFile9,stat as stat4}from"node:fs/promises";var MIB=1024*1024,MAX_IMAGE_BYTES=10*MIB,MAX_PAGE_BYTES=25*MIB;var HtmlRenderImageTooLargeError=class extends Error{constructor(path15,sizeBytes){super(`${path15} is ${(sizeBytes/MIB).toFixed(1)} MiB; each local image must be at most 10 MiB.`),this.name="HtmlRenderImageTooLargeError"}},HtmlRenderPageTooLargeError=class extends Error{constructor(sizeBytes){super(`With its images inlined the page is ${(sizeBytes/MIB).toFixed(1)} MiB; the limit is 25 MiB. Use smaller images.`),this.name="HtmlRenderPageTooLargeError"}},IMAGE_MIME_TYPES={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon"},IMAGE_EXTENSIONS=Object.keys(IMAGE_MIME_TYPES).join("|"),ABSOLUTE_PATH=String.raw`(?:/(?!/)|[a-z]:[\\/])`,LOCAL_IMAGE_PATTERN=new RegExp(String.raw`(["'\x60])(${ABSOLUTE_PATH}(?:(?!\1)[^\r\n]){0,2048}?\.(?:${IMAGE_EXTENSIONS}))\1`+String.raw`|url\(\s*(${ABSOLUTE_PATH}[^\s"'\x60()]{0,2048}?\.(?:${IMAGE_EXTENSIONS}))\s*\)`,"gid"),findLocalImages=html=>Array.from(html.matchAll(LOCAL_IMAGE_PATTERN)).flatMap(match=>{let span=match.indices?.[2]??match.indices?.[3];return span?[{start:span[0],end:span[1],path:html.slice(span[0],span[1])}]:[]}),filePathFor=reference2=>/^[a-z]:/i.test(reference2)?reference2.replaceAll("\\\\","\\"):reference2,dataUriPrefix=path15=>`data:${IMAGE_MIME_TYPES[path15.slice(path15.lastIndexOf(".")+1).toLowerCase()]??"application/octet-stream"};base64,`,latin1=(bytes,start,end)=>String.fromCharCode(...bytes.subarray(start,end)),after=(text2,token,from)=>{let at=text2.indexOf(token,from);return at===-1?-1:at+token.length},afterDoctype=(text2,from)=>{let inSubset=!1,at=from;for(;at!==-1&&at<text2.length;){let char=text2[at];if(char==='"'||char==="'")at=after(text2,char,at+1);else if(inSubset&&text2.startsWith("<!--",at))at=after(text2,"-->",at+4);else if(inSubset&&text2.startsWith("<?",at))at=after(text2,"?>",at+2);else{if(char===">"&&!inSubset)return at+1;char==="["?inSubset=!0:char==="]"&&(inSubset=!1),at+=1}}return-1},hasSvgRoot=text2=>{let at=0;for(;at!==-1;){for(;/\s/.test(text2.charAt(at));)at+=1;if(text2.startsWith("<?",at))at=after(text2,"?>",at+2);else if(text2.startsWith("<!--",at))at=after(text2,"-->",at+4);else if(text2.slice(at,at+9).toLowerCase()==="<!doctype")at=afterDoctype(text2,at+9);else return/^<svg[ \t\r\n/>]/.test(text2.slice(at,at+5))}return!1},isImageBytes=bytes=>{let head=latin1(bytes,0,12);return head.startsWith("\x89PNG")||head.startsWith("\xFF\xD8\xFF")||head.startsWith("GIF8")||head.startsWith("\0\0\0")||head.startsWith("BM")&&head.slice(6,10)==="\0\0\0\0"||head.startsWith("RIFF")&&head.slice(8,12)==="WEBP"||/^ftyp(?:avif|avis|mif1)$/.test(head.slice(4,12))?!0:hasSvgRoot(new TextDecoder().decode(bytes.subarray(0,4096)))};async function inlineLocalImages(html){let references=findLocalImages(html),uniquePaths2=[...new Set(references.map(reference2=>reference2.path))],files=await Promise.all(uniquePaths2.map(async path15=>{try{let info=await stat4(filePathFor(path15));return{path:path15,size:info.isFile()?Number(info.size):void 0}}catch{return{path:path15,size:void 0}}})),oversized=files.find(file=>file.size!==void 0&&file.size>MAX_IMAGE_BYTES);if(oversized?.size!==void 0)throw new HtmlRenderImageTooLargeError(oversized.path,oversized.size);let images=new Map,readBytes=0;for(let file of files.filter(entry=>entry.size!==void 0)){let bytes=new Uint8Array(await readFile9(filePathFor(file.path)));if(isImageBytes(bytes)){if(bytes.byteLength>MAX_IMAGE_BYTES)throw new HtmlRenderImageTooLargeError(file.path,bytes.byteLength);if(readBytes+=Math.ceil(bytes.byteLength/3)*4,readBytes>MAX_PAGE_BYTES)throw new HtmlRenderPageTooLargeError(readBytes);images.set(file.path,bytes)}}let parts=[],cursor=0;for(let reference2 of references){let bytes=images.get(reference2.path);bytes!==void 0&&(parts.push(html.slice(cursor,reference2.start),dataUriPrefix(reference2.path)+Buffer.from(bytes).toString("base64")),cursor=reference2.end)}parts.push(html.slice(cursor));let inlined=parts.join("");if(Buffer.byteLength(inlined)>MAX_PAGE_BYTES)throw new HtmlRenderPageTooLargeError(Buffer.byteLength(inlined));let missing=files.filter(file=>!images.has(file.path)).map(file=>file.path);return{html:inlined,missing}}var MAX_HTML_CHARACTERS=512e3,Params=typebox_exports.Object({html:typebox_exports.String({description:"A complete, self-contained HTML document.",minLength:1,maxLength:MAX_HTML_CHARACTERS}),title:typebox_exports.String({description:"Short name for the page.",minLength:1,maxLength:200}),height:typebox_exports.Optional(typebox_exports.Integer({description:"Frame height hint in CSS pixels, 80-2000. Defaults to the page's natural height."}))}),OUTPUT_DIR=".senpi/html-pages",clampHeight=height=>height===void 0?void 0:Math.min(2e3,Math.max(80,Math.round(height))),showHtmlPageTool={name:"show_html_page",label:"Show HTML Page",description:"Show a finished self-contained HTML page (chart, table, diagram, mockup) to the reader. No network: inline every script, style and image (data: URIs). A <script src>, stylesheet link, font, image or fetch that points at a URL (a CDN included) is refused, and the page comes out blank or broken. Local images written as absolute file paths are inlined automatically after a byte check. In the desktop thread this renders inline above your reply; elsewhere it is written to a file you can open in the desktop.",promptSnippet:"show_html_page: show a self-contained HTML page (chart/table/diagram) to the reader",promptGuidelines:["No network: inline every script, style and image (data: URIs); a CDN <script src> or remote font is refused and leaves the page blank.","Absolute-path local images are inlined after a magic-byte check; a renamed non-image is refused."],parameters:Params,async execute(_toolCallId,params,_signal,_onUpdate,ctx){let inlined=await inlineLocalImages(params.html),prepared=injectHtmlRenderBootstrap(inlined.html),height=clampHeight(params.height),dir=join33(ctx.cwd,OUTPUT_DIR);await mkdir7(dir,{recursive:!0});let safeName=params.title.replace(/[\\/:*?"<>|\p{Cc}]+/gu," ").replace(/\s+/g," ").trim().slice(0,60)||"page",path15=join33(dir,`${safeName}-${Date.now().toString(36)}.html`);await writeFile6(path15,prepared,"utf8");let missing=inlined.missing.length===0?void 0:inlined.missing;return{content:[{type:"text",text:`Wrote the page to ${path15}. Open it in the desktop to see it rendered with your theme. `+(missing===void 0?"Local images were inlined.":`Some local images could not be read and were left as written: ${missing.join(", ")}.`)}],details:{path:path15,title:params.title,height,prepared:!0,...missing?{missingImages:missing}:{},html:params.html}}}};function htmlRenderExtension(pi){pi.registerTool(showHtmlPageTool)}import{existsSync as existsSync16}from"node:fs";import{dirname as dirname21}from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";var OPENAI_BASE_URL="https://api.openai.com/v1",SETUP_REASON='Image generation is not configured. Store an OpenAI API key for provider "openai", configure an OpenAI-compatible gateway in models.json and optionally pin it with PI_IMAGE_GEN_PROVIDER, or set OPENAI_API_KEY.';function nonEmpty(value2){let trimmed=value2?.trim();return trimmed||void 0}function resolvedHeaders(headers){if(!headers)return;let resolved={};for(let[name,value2]of Object.entries(headers))typeof value2=="string"&&value2.trim().length>0&&(resolved[name]=value2);return Object.keys(resolved).length>0?resolved:void 0}function isPlaceholderKey(apiKey){return/^SK-SENTINEL-DO-NOT-LOG/i.test(apiKey)}function credentialParts(auth){let apiKey=nonEmpty(auth?.apiKey);if(!apiKey||isPlaceholderKey(apiKey))return;let headers=resolvedHeaders(auth?.headers);return{apiKey,...headers?{headers}:{}}}function isStoredApiKey(value2){return typeof value2=="object"&&value2!==null&&"type"in value2&&value2.type==="api_key"}function isGatewayApi(api){return api==="openai-completions"||api==="openai-responses"}function compareText(left,right){return left<right?-1:left>right?1:0}function compareProviderIds(left,right){let leftMatches=/openai/i.test(left),rightMatches=/openai/i.test(right);return leftMatches!==rightMatches?leftMatches?-1:1:compareText(left,right)}function groupGatewayModels(models){let groups=new Map,ordered=[...models].sort((left,right)=>compareText(left.provider,right.provider)||compareText(left.id,right.id));for(let model of ordered)model.provider==="openai"||!isGatewayApi(model.api)||!nonEmpty(model.baseUrl)||groups.has(model.provider)||groups.set(model.provider,model);return groups}async function resolveStoredOpenAi(registry){if(!isStoredApiKey(registry.authStorage.get("openai")))return;let resolved;try{resolved=await registry.getProviderAuth("openai")}catch{return}let credentials=credentialParts(resolved?.auth);if(credentials)return{kind:"native-openai",...credentials,baseUrl:OPENAI_BASE_URL,provenance:"store",providerId:"openai"}}async function resolveGateway(providerId,model,registry){let baseUrl=nonEmpty(model.baseUrl);if(!baseUrl)return;let resolved;try{resolved=await registry.getApiKeyAndHeaders(model)}catch{return}if(!resolved.ok)return;let credentials=credentialParts(resolved);if(credentials)return{kind:"gateway",...credentials,baseUrl,provenance:"provider-config",providerId}}async function resolveImageGenAuth(deps){let native=await resolveStoredOpenAi(deps.modelRegistry);if(native)return native;let groups=groupGatewayModels(deps.modelRegistry.getAll()),env=deps.env??process.env,pinnedProvider=nonEmpty(env.PI_IMAGE_GEN_PROVIDER);if(pinnedProvider){let pinnedModel=groups.get(pinnedProvider);if(pinnedModel){let pinned=await resolveGateway(pinnedProvider,pinnedModel,deps.modelRegistry);if(pinned)return pinned}}let providerIds=[...groups.keys()].filter(providerId=>providerId!==pinnedProvider).sort(compareProviderIds);for(let providerId of providerIds){let model=groups.get(providerId);if(!model)continue;let gateway=await resolveGateway(providerId,model,deps.modelRegistry);if(gateway)return gateway}let envApiKey=nonEmpty(env.OPENAI_API_KEY);return envApiKey&&!isPlaceholderKey(envApiKey)?{kind:"native-openai",apiKey:envApiKey,baseUrl:OPENAI_BASE_URL,provenance:"env"}:{kind:"none",reason:SETUP_REASON}}var NATIVE_BYPASS_MESSAGE="Image generation is handled by the provider's native server-side tool for the current model. Call the native image_generation tool instead of generate_image.",nativeBypass=!1,registryOverride;function setNativeBypass(enabled){nativeBypass=enabled}function isNativeBypass(){return nativeBypass}function imageGenRegistryOverride(){return registryOverride}import{existsSync as existsSync15}from"node:fs";import{mkdir as mkdir8,rm as rm6,writeFile as writeFile7}from"node:fs/promises";import{dirname as dirname20}from"node:path";var DEFAULT_IMAGE_MODEL="gpt-image-2.5-sunburst",IMAGE_MODEL_NAMES={"gpt-image-2.5-sunburst":"GPT Image 2.5 Sunburst","gpt-image-2.5-flare":"GPT Image 2.5 Flare","gpt-image-2":"GPT Image 2"},Params2=typebox_exports.Object({prompt:typebox_exports.String({minLength:1,maxLength:32e3,description:"Detailed description of the desired image, including the end state for edits."}),model:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("gpt-image-2.5-sunburst"),typebox_exports.Literal("gpt-image-2.5-flare"),typebox_exports.Literal("gpt-image-2")],{default:DEFAULT_IMAGE_MODEL,description:"Sunburst (default) is the most capable: highest quality, precise edits, reference fidelity, best for final assets; Flare is the small model optimized for speed, with quality comparable to gpt-image-2; gpt-image-2 is the previous generation."})),size:typebox_exports.Optional(typebox_exports.String({default:"auto",description:"auto, 1024x1024, 1536x1024, 1024x1536, or any WIDTHxHEIGHT with both divisible by 16, aspect between 1:3 and 3:1, max 3840x2160 (e.g. 2048x2048, 2048x1152, 3840x2160)"})),quality:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")],{default:"auto",description:"Rendering quality. Defaults to auto. xhigh/max are gpt-image-2.5 only, slower and costlier."})),reference_image_paths:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}),{minItems:1,maxItems:5,description:"Local PNG/JPEG/WEBP images to edit or use as references (1-5 files, each at most 50 MB). Paths may be absolute or relative to the working directory."})),mask_image_path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Inpainting mask (PNG with an alpha channel, same size as the first reference image): transparent areas are repainted. Requires reference_image_paths."})),background:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("transparent"),typebox_exports.Literal("opaque")],{default:"auto",description:"Output background. transparent needs output_format png or webp and keeps the alpha channel; auto lets the model decide."})),output_format:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("png"),typebox_exports.Literal("jpeg"),typebox_exports.Literal("webp")],{default:"png",description:"File format. png (default) is lossless and supports transparency; jpeg is fastest; webp is small and supports transparency."})),output_compression:typebox_exports.Optional(typebox_exports.Integer({minimum:0,maximum:100,description:"Compression level 0-100 for jpeg or webp output only (100 = best quality)."})),moderation:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("low")],{default:"auto",description:"Content filter strictness: auto (standard) or low (less restrictive)."})),n:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:10,default:1,description:"How many variants of this one prompt to generate; distinct assets need distinct calls."})),output_path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Where to write the image, relative to the working directory. The extension must match output_format (.png, .jpg/.jpeg, .webp) or be omitted. Defaults to generated-images/."}))},{additionalProperties:!1});function failure(message,reason,base){let details={...base,paths:[],generated:0,revisedPrompts:[],error:message,reason};return{content:[{type:"text",text:message}],details}}import{isAbsolute as isAbsolute4,relative as relative9,resolve as resolve14}from"node:path";var GENERATED_IMAGE_DIRECTORY="generated-images",DEFAULT_DIRECTORY=GENERATED_IMAGE_DIRECTORY,MAX_TOOL_CALL_ID_CHARS=64,EXTENSIONS={png:[".png"],jpeg:[".jpg",".jpeg"],webp:[".webp"]};function sanitizeImageStem(identifier){let sanitized=identifier.replace(/[^A-Za-z0-9_-]/g,"_").slice(0,MAX_TOOL_CALL_ID_CHARS);return sanitized.length>0?sanitized:"image"}function sanitizeToolCallId(toolCallId){return sanitizeImageStem(toolCallId)}function resolveTargets(cwd,toolCallId,count,outputPath,outputFormat="png"){let allowed=EXTENSIONS[outputFormat],defaultExtension=allowed[0]??".png",requested=outputPath?.trim(),base,extension;if(requested===void 0||requested.length===0)base=resolve14(cwd,DEFAULT_DIRECTORY,`${sanitizeToolCallId(toolCallId)}${defaultExtension}`),extension=defaultExtension;else{let absolute=isAbsolute4(requested)?requested:resolve14(cwd,requested),extensionMatch=/\.[^./\\]+$/.exec(absolute);if(extensionMatch&&!allowed.includes(extensionMatch[0].toLowerCase()))return{ok:!1,error:`Error: output_path must end in ${allowed.join(" or ")} for output_format ${outputFormat} (got "${requested}").`};extension=extensionMatch?extensionMatch[0]:defaultExtension,base=extensionMatch?absolute:`${absolute}${defaultExtension}`}if(count===1)return{ok:!0,paths:[base]};let stem=base.slice(0,-extension.length);return{ok:!0,paths:Array.from({length:count},(_,index)=>`${stem}-${String(index+1).padStart(2,"0")}${extension}`)}}function outputFormatOf(mimeType){if(mimeType==="image/png")return"png";if(mimeType==="image/jpeg")return"jpeg";if(mimeType==="image/webp")return"webp"}function withFormatExtension(path15,outputFormat){let extension=EXTENSIONS[outputFormat][0]??".png",extensionMatch=/\.[^./\\]+$/.exec(path15),current=extensionMatch?.[0].toLowerCase();return current!==void 0&&EXTENSIONS[outputFormat].includes(current)?path15:extensionMatch?`${path15.slice(0,-extensionMatch[0].length)}${extension}`:`${path15}${extension}`}function displayPath2(cwd,absolute){let relativePath=relative9(cwd,absolute);return relativePath&&!relativePath.startsWith("..")&&!isAbsolute4(relativePath)?relativePath:absolute}import{constants as constants2}from"node:fs";import{open as open2}from"node:fs/promises";import{resolve as resolve15}from"node:path";var MAX_REFERENCE_BYTES=50*1024*1024,PNG_SIGNATURE2=Buffer.from([137,80,78,71,13,10,26,10]),JPEG_SIGNATURE=Buffer.from([255,216,255]),RIFF_SIGNATURE=Buffer.from("RIFF"),WEBP_SIGNATURE=Buffer.from("WEBP");function imageMimeType(bytes){if(bytes.subarray(0,8).equals(PNG_SIGNATURE2))return"image/png";if(bytes.subarray(0,3).equals(JPEG_SIGNATURE))return"image/jpeg";if(bytes.subarray(0,4).equals(RIFF_SIGNATURE)&&bytes.subarray(8,12).equals(WEBP_SIGNATURE))return"image/webp"}async function loadImageFile(cwd,path15,label3){try{let file=await open2(resolve15(cwd,path15),constants2.O_RDONLY|constants2.O_NONBLOCK);try{let stat15=await file.stat();if(!stat15.isFile())throw new Error("must be a regular file");if(stat15.size>MAX_REFERENCE_BYTES)throw new Error("must be at most 50 MB");let bytes=await file.readFile();if(bytes.length>MAX_REFERENCE_BYTES)throw new Error("must be at most 50 MB");let mimeType=imageMimeType(bytes);if(mimeType===void 0)throw new Error("must be a PNG, JPEG, or WEBP image (invalid magic bytes)");return{ok:!0,image:{type:"image",data:bytes.toString("base64"),mimeType}}}finally{await file.close()}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return{ok:!1,error:`Error: ${label3} "${path15}": ${reason}`}}}async function loadReferenceImages(cwd,paths){if(paths===void 0)return{ok:!0,images:[]};if(paths.length<1||paths.length>5)return{ok:!1,error:`Error: reference_image_paths must contain 1 to 5 paths (got ${paths.length}).`};let images=[];for(let path15 of paths){let loaded2=await loadImageFile(cwd,path15,"reference image");if(!loaded2.ok)return loaded2;images.push(loaded2.image)}return{ok:!0,images}}async function loadMaskImage(cwd,path15,referenceCount){if(path15!==void 0)return referenceCount===0?{ok:!1,error:"Error: mask_image_path requires at least one reference_image_paths entry to edit."}:loadImageFile(cwd,path15,"mask image")}function sourceLabel(auth){return auth.kind==="none"?"none":auth.provenance==="env"?"env:OPENAI_API_KEY":`${auth.provenance}:${auth.providerId??auth.kind}`}function synthesizeModel(auth,id){return{type:"image",id,name:IMAGE_MODEL_NAMES[id],api:"openai-images",provider:auth.providerId??"openai",baseUrl:auth.baseUrl,input:["text","image"],output:["image"],cost:getImageModel("openai",id).cost}}function collectImages(images){let collected=[],pendingText;for(let block of images.output){if(block.type==="text"){let text2=block.text.trim();pendingText=text2.length>0?text2:void 0;continue}collected.push({data:block.data,mimeType:block.mimeType,...pendingText===void 0?{}:{revisedPrompt:pendingText}}),pendingText=void 0}return collected}async function writeImages(paths,images){let written=[];for(let[index,image]of images.entries()){let target=paths[index];if(target===void 0)break;try{await mkdir8(dirname20(target),{recursive:!0}),await writeFile7(target,Buffer.from(image.data,"base64"),{flag:"wx"}),written.push(target)}catch(error2){for(let path15 of written)await rm6(path15,{force:!0}).catch(()=>{});let reason=error2 instanceof Error?error2.message:String(error2);return`Error: failed to write generated image to ${target}: ${reason}`}}}var GENERATE_IMAGE_TOOL_NAME="generate_image",generateImageTool={name:GENERATE_IMAGE_TOOL_NAME,label:"Generate Image",description:"Generate or edit an image with OpenAI gpt-image-2.5 (Sunburst by default, the most capable; Flare when speed matters more than quality) and save it as a png, jpeg, or webp file, optionally with a transparent background. Pass reference_image_paths to edit or reference existing images. Generate directly when the request is clear instead of asking for confirmation. Returns the saved file paths.",promptSnippet:"Generate or edit images from prompts and optional reference images, saving them as png/jpeg/webp files.",exposure:"search",searchGroup:"imagegen",searchKeywords:["generate image","image generation","edit image","create a picture","illustration","mockup","gpt-image","transparent png"],parameters:Params2,async execute(toolCallId,params,signal,_onUpdate,ctx){let size=params.size??"auto",quality=params.quality??"auto",requested=params.n??1,modelId=params.model??DEFAULT_IMAGE_MODEL,background=params.background??"auto",outputFormat=params.output_format??"png",context={model:modelId,size,quality,background,outputFormat,requested,source:"none"},prompt=params.prompt.trim();if(prompt.length===0)return failure("Error: prompt must contain non-whitespace text.","invalid_params",context);if(isNativeBypass())return failure(NATIVE_BYPASS_MESSAGE,"provider_native_bypass",context);let auth=await resolveImageGenAuth({modelRegistry:imageGenRegistryOverride()??ctx.modelRegistry});if(auth.kind==="none")return failure(auth.reason,"missing_config",context);let source2=sourceLabel(auth),parsedSize=parseOpenAIImageSize(size);if(!parsedSize.ok)return failure(`Error: ${parsedSize.error}`,"invalid_params",{...context,source:source2});let references=await loadReferenceImages(ctx.cwd,params.reference_image_paths);if(!references.ok)return failure(references.error,"invalid_params",{...context,source:source2});let mask=await loadMaskImage(ctx.cwd,params.mask_image_path,references.images.length);if(mask!==void 0&&!mask.ok)return failure(mask.error,"invalid_params",{...context,source:source2});let outputOptions=parseOpenAIImageOutputOptions({background,outputFormat,outputCompression:params.output_compression,hasMask:mask!==void 0,imageCount:references.images.length});if(!outputOptions.ok)return failure(`Error: ${outputOptions.error}`,"invalid_params",{...context,source:source2});let targets2=resolveTargets(ctx.cwd,toolCallId,requested,params.output_path,outputFormat);if(!targets2.ok)return failure(targets2.error,"invalid_params",{...context,source:source2});for(let target of targets2.paths)if(existsSync15(target))return failure(`Error: ${displayPath2(ctx.cwd,target)} already exists. Choose another output_path.`,"invalid_params",{...context,source:source2});let images=await generateImages(synthesizeModel(auth,modelId),{input:[{type:"text",text:prompt},...references.images]},{...auth.apiKey===void 0?{}:{apiKey:auth.apiKey},...auth.headers===void 0?{}:{headers:auth.headers},...signal===void 0?{}:{signal},size,quality,n:requested,...params.background===void 0?{}:{background},outputFormat,...params.output_compression===void 0?{}:{outputCompression:params.output_compression},...params.moderation===void 0?{}:{moderation:params.moderation},...mask===void 0?{}:{mask:mask.image}});if(images.stopReason!=="stop"){let message=images.errorMessage??`Image generation ${images.stopReason}.`;return failure(`Error: ${message}`,"provider_error",{...context,source:source2})}let generated=collectImages(images);if(generated.length===0)return failure("Error: the provider returned no images.","provider_error",{...context,source:source2});let delivered=generated.map(image=>outputFormatOf(image.mimeType)??outputFormat),savedFormat=delivered[0]??outputFormat,paths=targets2.paths.map((target,index)=>{let format2=delivered[index];return format2===void 0||format2===outputFormat?target:withFormatExtension(target,format2)}),renamedCollision=paths.find((target,index)=>target!==targets2.paths[index]&&existsSync15(target));if(renamedCollision!==void 0)return failure(`Error: the provider returned ${savedFormat} instead of ${outputFormat} and ${displayPath2(ctx.cwd,renamedCollision)} already exists. Choose another output_path.`,"write_failed",{...context,source:source2});let writeError=await writeImages(paths,generated);if(writeError!==void 0)return failure(writeError,"write_failed",{...context,source:source2});let savedPaths=paths.slice(0,generated.length).map(target=>displayPath2(ctx.cwd,target)),revisedPrompts=generated.flatMap(image=>image.revisedPrompt?[image.revisedPrompt]:[]),details={paths:savedPaths,model:modelId,source:source2,size,quality,background,outputFormat:savedFormat,requested,generated:generated.length,revisedPrompts,...images.background===void 0?{}:{transparentBackground:images.background==="transparent"}};return{content:[{type:"text",text:[`Generated ${generated.length} image${generated.length===1?"":"s"}:`,...savedPaths.map(path15=>`- ${path15}`),...savedFormat===outputFormat?[]:[`Note: the provider returned ${savedFormat} instead of the requested ${outputFormat}; saved with the matching extension.`],...images.background===void 0?[]:[`Background: ${images.background}`],...revisedPrompts.map(revised=>`Revised prompt: ${revised}`),"The saved file is the deliverable; refer to it by path instead of re-embedding image data."].join(`
1116
1111
  `)},...generated.map(image=>({type:"image",data:image.data,mimeType:image.mimeType}))],details,...images.usage===void 0?{}:{usage:images.usage}}}};var IMAGEGEN_BASE_DIR=dirname21(fileURLToPath3(import.meta.url)),loggedMissingSkill=!1,IMAGE_GEN_SECTION=`
1117
1112
  ## Image Generation
1118
1113
 
@@ -2350,10 +2345,10 @@ ${TASK_MANAGEMENT_SECTION}`;if(event.preview)return{systemPrompt};let branchEntr
2350
2345
  `)}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 words4=normalized2.match(WORD_PATTERN)??[],grams=new Set;for(let i=0;i+3<=words4.length;i++)grams.add(`${words4[i]} ${words4[i+1]} ${words4[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 lstatSync6,readdirSync as readdirSync6,readFileSync as readFileSync34}from"node:fs";import{homedir as homedir11}from"node:os";import{dirname as dirname35,join as join59,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 flags2=Array.from(new Set(flagText)).join("");return{regex:new RegExp(condition.slice(match[0].length),flags2)}}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=`
2351
2346
  ---`,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(`
2352
2347
  `)){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,`
2353
- `);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(path15){try{return lstatSync6(path15).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(join59(current,SENPI_DIR_NAME)))return current;let parent=dirname35(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,source2){let rules=[],warnings=[];for(let fileName of listMarkdownFilesSync(dir)){let path15=join59(dir,fileName),name=fileName.slice(0,fileName.length-MARKDOWN_EXTENSION.length),markdown;try{markdown=readFileSync34(path15,"utf-8")}catch{warnings.push(`rule "${name}" at ${path15} could not be read, skipping`);continue}let parsed=parseRuleFile(markdown,{name,path:path15,source:source2});if("skipped"in parsed){warnings.push(parsed.warning);continue}rules.push(parsed)}return{rules,warnings}}function discoverTtsrRulesSync(cwd,homeDir){let resolvedHome=homeDir??homedir11(),globalDir=join59(resolvedHome,SENPI_DIR_NAME,TTSR_DIR_NAME),projectRoot2=findProjectRootSync(cwd,resolvedHome),projectDir=join59(projectRoot2,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("/"),basename30=slashIndex===-1?normalized2:normalized2.slice(slashIndex+1);if(basename30!==normalized2&&matcher(basename30))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 matches2=[];for(let[name,entry]of this.#rules)this.#canTrigger(name)&&this.#matchesScope(entry,context)&&this.#matchesGlobalPaths(entry,context)&&this.#matchesCondition(entry,buffer)&&matches2.push(entry.rule);return matches2}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=/^(?:```|~~~)/,INDENTED_CODE=/^(?: {2,}|\t)(?![ \t]*(?:[-*+]|\d+[.)])[ \t])/,CODE_LINE_ENDINGS=new Set(["{","}","[","]","(",";",",",">"]);function createNearDuplicateState(){return{history:new FixedRing(NEAR_DUPLICATE_LOOKBACK),window:new FixedRing(NEAR_DUPLICATE_WINDOW),lineLength:0,lineWordChars:0,lineHasContent:!1,lineStartOffset:0,lineText:"",lineLastChar:"",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 isCodeShapedLine(state){return INDENTED_CODE.test(state.lineText)||CODE_LINE_ENDINGS.has(state.lineLastChar)}function foldLine(state){let fence=FENCE_PATTERN.test(state.lineText.trimStart());(state.insideFence||fence)&&(state.fenced=!0),fence&&(state.insideFence=!state.insideFence),!(!state.fenced&&isCodeShapedLine(state))&&(state.length===0&&(state.startOffset=state.lineStartOffset),state.length+=state.lineLength+1,state.wordChars+=state.lineWordChars,state.retained.length<NEAR_DUPLICATE_TEXT_RETENTION_MAX&&(state.retained+=`${state.lineText}
2348
+ `);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(path15){try{return lstatSync6(path15).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(join59(current,SENPI_DIR_NAME)))return current;let parent=dirname35(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,source2){let rules=[],warnings=[];for(let fileName of listMarkdownFilesSync(dir)){let path15=join59(dir,fileName),name=fileName.slice(0,fileName.length-MARKDOWN_EXTENSION.length),markdown;try{markdown=readFileSync34(path15,"utf-8")}catch{warnings.push(`rule "${name}" at ${path15} could not be read, skipping`);continue}let parsed=parseRuleFile(markdown,{name,path:path15,source:source2});if("skipped"in parsed){warnings.push(parsed.warning);continue}rules.push(parsed)}return{rules,warnings}}function discoverTtsrRulesSync(cwd,homeDir){let resolvedHome=homeDir??homedir11(),globalDir=join59(resolvedHome,SENPI_DIR_NAME,TTSR_DIR_NAME),projectRoot2=findProjectRootSync(cwd,resolvedHome),projectDir=join59(projectRoot2,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 TTSR_LOOP_STOPPED_ENTRY_TYPE="ttsr-loop-stopped",TTSR_LOOP_STOPPED_EVENT="ttsr:loop-stopped";function ttsrLoopStoppedNotice(rule){return`The ${rule} stream rule flagged the reply again after its correction, so no further correction was sent. Send any message to continue.`}function nudgedRules(entry){if(entry.type!=="custom_message"||entry.customType!==TTSR_INJECTION_CUSTOM_TYPE)return[];let details=entry.details;return typeof details!="object"||details===null||!("rules"in details)?[]:Array.isArray(details.rules)?details.rules:[]}function ruleAlreadyCorrected(entries,rule){for(let index=entries.length-1;index>=0;index--){let entry=entries[index];if(entry.type==="message"&&entry.message.role==="user")return!1;if(nudgedRules(entry).includes(rule))return!0}return!1}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("/"),basename30=slashIndex===-1?normalized2:normalized2.slice(slashIndex+1);if(basename30!==normalized2&&matcher(basename30))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 matches2=[];for(let[name,entry]of this.#rules)this.#canTrigger(name)&&this.#matchesScope(entry,context)&&this.#matchesGlobalPaths(entry,context)&&this.#matchesCondition(entry,buffer)&&matches2.push(entry.rule);return matches2}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=/^(?:```|~~~)/,INDENTED_CODE=/^(?: {2,}|\t)(?![ \t]*(?:[-*+]|\d+[.)])[ \t])/,CODE_LINE_ENDINGS=new Set(["{","}","[","]","(",";",",",">"]);function createNearDuplicateState(){return{history:new FixedRing(NEAR_DUPLICATE_LOOKBACK),window:new FixedRing(NEAR_DUPLICATE_WINDOW),lineLength:0,lineWordChars:0,lineHasContent:!1,lineStartOffset:0,lineText:"",lineLastChar:"",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 isCodeShapedLine(state){return INDENTED_CODE.test(state.lineText)||CODE_LINE_ENDINGS.has(state.lineLastChar)}function foldLine(state){let fence=FENCE_PATTERN.test(state.lineText.trimStart());(state.insideFence||fence)&&(state.fenced=!0),fence&&(state.insideFence=!state.insideFence),!(!state.fenced&&isCodeShapedLine(state))&&(state.length===0&&(state.startOffset=state.lineStartOffset),state.length+=state.lineLength+1,state.wordChars+=state.lineWordChars,state.retained.length<NEAR_DUPLICATE_TEXT_RETENTION_MAX&&(state.retained+=`${state.lineText}
2354
2349
  `))}function resetLine(state,startOffset){state.lineLength=0,state.lineWordChars=0,state.lineHasContent=!1,state.lineStartOffset=startOffset,state.lineText="",state.lineLastChar=""}function updateNearDuplicates(state,entry){if(entry.value.charCodeAt(0)===CharCode.LineFeed){let result3=null;return state.lineHasContent?foldLine(state):state.length>0&&(result3=completeParagraph(state)),resetLine(state,entry.startOffset+1),result3}let codePoint=entry.value.codePointAt(0)??0;return isAsciiWhitespace(codePoint)||(state.lineHasContent=!0,state.lineLastChar=entry.value),(isAsciiAlphanumeric(codePoint)||codePoint>127&&!isBoxDrawing(codePoint))&&(state.lineWordChars+=1),state.lineLength+=entry.width,state.lineText.length<NEAR_DUPLICATE_TEXT_RETENTION_MAX&&(state.lineText+=entry.value),null}var PARAGRAPH_MIN_CHARS=64,PARAGRAPH_MIN_WORD_CHARS=24,PARAGRAPH_REPEAT_THRESHOLD=3,PARAGRAPH_RING_CAPACITY=64,PARAGRAPH_TEXT_RETENTION_MAX=512,SAMPLE_LENGTH3=80,HASH_A_OFFSET2=2166136261,HASH_A_PRIME2=16777619,HASH_B_OFFSET2=5381,HASH_B_MULTIPLIER2=31;function createParagraphRepeatState(){return{ring:new FixedRing(PARAGRAPH_RING_CAPACITY),lineHashA:HASH_A_OFFSET2,lineHashB:HASH_B_OFFSET2,lineLength:0,lineWordChars:0,lineHasContent:!1,lineStartOffset:0,lineText:"",hashA:HASH_A_OFFSET2,hashB:HASH_B_OFFSET2,length:0,wordChars:0,startOffset:0,retained:""}}function isSameParagraph(a,b){return a.hashA===b.hashA&&a.hashB===b.hashB&&a.utf16Length===b.utf16Length}function completeParagraph2(state){let paragraph={hashA:state.hashA,hashB:state.hashB,utf16Length:state.length,startOffset:state.startOffset,text:state.retained.length>0?state.retained:void 0},eligible=state.length>=PARAGRAPH_MIN_CHARS&&state.wordChars>=PARAGRAPH_MIN_WORD_CHARS;if(state.hashA=HASH_A_OFFSET2,state.hashB=HASH_B_OFFSET2,state.length=0,state.wordChars=0,state.startOffset=0,state.retained="",!eligible)return null;let occurrences=1,first,second;for(let back=state.ring.size-1;back>=0;back--){let previous=state.ring.getBack(back);previous===void 0||!isSameParagraph(previous,paragraph)||(occurrences+=1,first===void 0?first=previous:second===void 0&&(second=previous))}return state.ring.push(paragraph),occurrences<PARAGRAPH_REPEAT_THRESHOLD||first===void 0||second===void 0?null:{rule:"collapse-repetition",reason:`paragraph repeated ${occurrences} times within one message (${paragraph.utf16Length} chars)`,anomalyStartOffset:first.startOffset,garbageStartOffset:second.startOffset,detail:{mechanism:"paragraph-repeat",occurrences,paragraphChars:paragraph.utf16Length,sample:(first.text??"").slice(0,SAMPLE_LENGTH3)}}}function updateParagraphRepeats(state,entry){if(entry.value.charCodeAt(0)===CharCode.LineFeed){let result3=null;return state.lineHasContent?(state.length===0&&(state.startOffset=state.lineStartOffset),state.hashA=Math.imul(state.hashA^state.lineHashA,HASH_A_PRIME2),state.hashB=Math.imul(state.hashB,HASH_B_MULTIPLIER2)+state.lineHashB|0,state.length+=state.lineLength+1,state.wordChars+=state.lineWordChars,state.retained.length<PARAGRAPH_TEXT_RETENTION_MAX&&(state.retained+=`${state.lineText}
2355
2350
  `)):state.length>0&&(result3=completeParagraph2(state)),state.lineHashA=HASH_A_OFFSET2,state.lineHashB=HASH_B_OFFSET2,state.lineLength=0,state.lineWordChars=0,state.lineHasContent=!1,state.lineStartOffset=entry.startOffset+1,state.lineText="",result3}for(let i=0;i<entry.value.length;i++){let code=entry.value.charCodeAt(i);state.lineHashA=Math.imul(state.lineHashA^code,HASH_A_PRIME2),state.lineHashB=Math.imul(state.lineHashB,HASH_B_MULTIPLIER2)+code|0}let codePoint=entry.value.codePointAt(0)??0;return isAsciiWhitespace(codePoint)||(state.lineHasContent=!0),(isAsciiAlphanumeric(codePoint)||codePoint>127&&!isBoxDrawing(codePoint))&&(state.lineWordChars+=1),state.lineLength+=entry.width,state.lineText.length<PARAGRAPH_TEXT_RETENTION_MAX&&(state.lineText+=entry.value),null}var PERIOD_MIN=2,PERIOD_MAX=64,PERIOD_SPAN_MIN=256,PERIOD_REPS_MIN=8,SLOT_COUNT=PERIOD_MAX+1,BASE64_EXTRA_CODES=new Set([43,47,61]),TABULAR_SEPARATOR_CODES=new Set([46,44,58,59,45,47,124]),CODE_PUNCT_CODES=new Set("{}()[]<>,;.:=+-*/&|^%$#@~`'\"\\_".split("").map(ch=>ch.charCodeAt(0)));function everyCodeUnit(text2,predicate){for(let i=0;i<text2.length;i++)if(!predicate(text2.charCodeAt(i)))return!1;return!0}function isDigitOrHexLetter(code){return code>=48&&code<=57||code>=65&&code<=70||code>=97&&code<=102}function isWhitespaceOnlyUnit(unit){return everyCodeUnit(unit,isAsciiWhitespace)}function isDecorativeUnit(unit){return everyCodeUnit(unit,code=>isAsciiWhitespace(code)||isDecorativeScalar(code))}function isBase64CompatibleUnit(unit){return everyCodeUnit(unit,code=>isAsciiAlphanumeric(code)||BASE64_EXTRA_CODES.has(code))}function isNumericTabularUnit(unit){return everyCodeUnit(unit,code=>isAsciiWhitespace(code)||TABULAR_SEPARATOR_CODES.has(code)||isDigitOrHexLetter(code))}function isCodeLikeUnit(unit){return everyCodeUnit(unit,code=>isAsciiWhitespace(code)||CODE_PUNCT_CODES.has(code))}function isEligibleUnit(unit){return!isWhitespaceOnlyUnit(unit)&&!isDecorativeUnit(unit)&&!isBase64CompatibleUnit(unit)&&!isNumericTabularUnit(unit)&&!isCodeLikeUnit(unit)}function createShortPeriodState(){return{matched:new Array(SLOT_COUNT).fill(0),blockStart:new Array(SLOT_COUNT).fill(0),unitChecked:new Array(SLOT_COUNT).fill(!1)}}function readUnit(ring,period){let text2="",width=0;for(let back=period-1;back>=0;back--){let scalar=ring.getBack(back);if(scalar===void 0)break;text2=scalar.value+text2,width+=scalar.width}return{text:text2,width}}function updateShortPeriods(state,entry,ring){for(let period=PERIOD_MIN;period<=PERIOD_MAX;period++){let back=ring.getBack(period);if(back===void 0||back.value!==entry.value){state.matched[period]=0,state.unitChecked[period]=!1;continue}if(state.matched[period]===0&&(state.blockStart[period]=back.startOffset),state.matched[period]+=1,state.unitChecked[period]||state.matched[period]<PERIOD_SPAN_MIN||state.matched[period]<PERIOD_REPS_MIN*period)continue;state.unitChecked[period]=!0;let unit=readUnit(ring,period);if(!isEligibleUnit(unit.text))continue;let matched=state.matched[period];return{rule:"collapse-repetition",reason:`short-period recurrence with period ${period} spanning ${matched} scalars`,anomalyStartOffset:state.blockStart[period],garbageStartOffset:state.blockStart[period]+unit.width,detail:{mechanism:"short-period",period,span:matched,repetitions:Math.floor(matched/period)+1}}}return null}var TAIL_RING_CAPACITY=512;function createCollapseState(){return{scanner:new ScalarScanner,tailRing:new FixedRing(TAIL_RING_CAPACITY),run:createDominantRunState(),whitespace:createWhitespaceFloodState(),periods:createShortPeriodState(),lines:createLineCycleState(),paragraphs:createParagraphRepeatState(),nearDuplicates:createNearDuplicateState(),latched:null}}function checkDelta(state,delta,context){if(state.latched!==null)return state.latched;let watchParagraphs=context.source!=="tool";for(let entry of state.scanner.push(delta)){state.tailRing.push(entry);let match=updateDominantRun(state.run,entry)??updateWhitespaceFlood(state.whitespace,entry)??updateShortPeriods(state.periods,entry,state.tailRing)??updateLineCycles(state.lines,entry)??(watchParagraphs?updateParagraphRepeats(state.paragraphs,entry):null)??(watchParagraphs?updateNearDuplicates(state.nearDuplicates,entry):null);if(match!==null)return state.latched=match,match}return null}var collapseDetector={createState:createCollapseState,checkDelta};var START_TOKEN_OFFSET_LIMIT=32,PREAMBLE_OFFSET_LIMIT=160,PREAMBLE_MAX_TRIMMED=96,HEAD_LIMIT=160,WINDOW_LIMIT=160,VOCAB_LOOKBACK=128,INDENT_CODE_SPACES=4,FENCE_TICK_RUN=3,PREAMBLE_PATTERN=/^(?:Thinking|Reasoning|Analysis)[.:]*$/,BACKTICK="`",TILDE="~",DOUBLE_QUOTE='"',SINGLE_QUOTE="'",BLOCKQUOTE_MARK=">",NEWLINE=`
2356
- `,SPACE=" ",TAB=" ",DISCUSSION_VOCAB=["token","tokens","tokenizer","delimiter","special","literal","example","documentation","sequence","sentinel","vocabulary"],StreamContextTracker=class{#head="";#window="";#tickChar="";#tickCount=0;#inFence=!1;#fenceChar="";#inInline=!1;#lineIndent=0;#lineHasContent=!1;#lineIsBlockquote=!1;#lineIsIndented=!1;#lastNonWs="";observeGround(value2){if(this.#tickChar!==""){if(value2===this.#tickChar){this.#tickCount+=1,this.#appendText(value2),this.#lastNonWs=value2,this.#lineHasContent=!0;return}this.#resolveTicks()}if(value2===BACKTICK||value2===TILDE){this.#tickChar=value2,this.#tickCount=1,this.#appendText(value2),this.#lastNonWs=value2,this.#lineHasContent=!0;return}if(value2===NEWLINE){this.#lineIndent=0,this.#lineHasContent=!1,this.#lineIsBlockquote=!1,this.#lineIsIndented=!1,this.#appendText(value2);return}let code=value2.charCodeAt(0),whitespace=value2.length===1&&isAsciiWhitespace(code);this.#lineHasContent||(value2===SPACE?this.#lineIndent+=1:value2===TAB?this.#lineIsIndented=!0:whitespace||(this.#lineHasContent=!0,this.#lineIndent>=INDENT_CODE_SPACES&&(this.#lineIsIndented=!0),value2===BLOCKQUOTE_MARK&&(this.#lineIsBlockquote=!0))),whitespace||(this.#lastNonWs=value2),this.#appendText(value2)}observeText(text2){text2.length!==0&&(this.#tickChar!==""&&this.#resolveTicks(),this.#lineHasContent=!0,this.#lastNonWs=text2.slice(-1),this.#appendText(text2))}classify(tokenStartOffset){return this.#isQuotationLike()?"quotation":this.#isStartLike(tokenStartOffset)?"start":"normal"}#isQuotationLike(){if(this.#inFence||this.#inInline||this.#lineIsBlockquote||this.#lineIsIndented||this.#lastNonWs===DOUBLE_QUOTE||this.#lastNonWs===SINGLE_QUOTE)return!0;let tail=this.#window.slice(-VOCAB_LOOKBACK).toLowerCase();return DISCUSSION_VOCAB.some(word=>tail.includes(word))}#isStartLike(tokenStartOffset){if(tokenStartOffset<START_TOKEN_OFFSET_LIMIT&&this.#isWhitespaceOnly(this.#head.slice(0,tokenStartOffset)))return!0;if(tokenStartOffset<PREAMBLE_OFFSET_LIMIT&&tokenStartOffset<=this.#head.length){let trimmed=this.#head.slice(0,tokenStartOffset).trim();if(trimmed.length<=PREAMBLE_MAX_TRIMMED&&PREAMBLE_PATTERN.test(trimmed))return!0}return!1}#isWhitespaceOnly(text2){for(let i=0;i<text2.length;i+=1)if(!isAsciiWhitespace(text2.charCodeAt(i)))return!1;return!0}#resolveTicks(){let count=this.#tickCount,char=this.#tickChar;if(this.#tickChar="",this.#tickCount=0,count>=FENCE_TICK_RUN){this.#inFence?this.#fenceChar===char&&(this.#inFence=!1,this.#fenceChar=""):(this.#inFence=!0,this.#fenceChar=char);return}char===BACKTICK&&!this.#inFence&&(this.#inInline=!this.#inInline)}#appendText(text2){this.#head.length<HEAD_LIMIT&&(this.#head=(this.#head+text2).slice(0,HEAD_LIMIT)),this.#window+=text2,this.#window.length>WINDOW_LIMIT*2&&(this.#window=this.#window.slice(-WINDOW_LIMIT))}};function isAsciiUpper(value2){let code=value2.charCodeAt(0);return code>=65&&code<=90}function isAsciiLower(value2){let code=value2.charCodeAt(0);return code>=97&&code<=122}function isAsciiDigit(value2){let code=value2.charCodeAt(0);return code>=48&&code<=57}function isAsciiLetter(value2){return isAsciiUpper(value2)||isAsciiLower(value2)}function isNameChar(value2){return isAsciiLetter(value2)||isAsciiDigit(value2)||value2==="_"}function isBracketNameChar(value2){return isAsciiUpper(value2)||isAsciiDigit(value2)||value2==="_"}var CandidateParser=class{#mode="ground";#buffer="";#nameLength=0;#startOffset=0;feed(value2,offset){return this.#mode==="ground"?value2==="<"?(this.#begin("angleOpen",value2,offset),[]):value2==="["?(this.#begin("bracketFirst",value2,offset),[]):[{kind:"ground",value:value2,offset}]:this.#advance(value2,offset)}get pendingLength(){return this.#mode==="ground"?0:this.#buffer.length}#begin(mode,value2,offset){this.#mode=mode,this.#buffer=value2,this.#nameLength=0,this.#startOffset=offset}#advance(value2,offset){let mode=this.#mode;return mode==="angleOpen"?value2==="|"?(this.#buffer+=value2,this.#mode="ctrlFirst",[]):value2==="/"?(this.#buffer+=value2,this.#mode="sgmlFirst",[]):isAsciiLetter(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="sgmlName",[]):this.#rejectWith(value2,offset):mode==="ctrlFirst"?isAsciiLetter(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="ctrlName",[]):this.#rejectWith(value2,offset):mode==="ctrlName"?value2==="|"?(this.#buffer+=value2,this.#mode="ctrlClose",[]):isNameChar(value2)?this.#nameLength>=32?this.#rejectWith(value2,offset):(this.#buffer+=value2,this.#nameLength+=1,[]):this.#rejectWith(value2,offset):mode==="ctrlClose"?value2===">"?[this.#emit("ctrl",2,-1,value2,offset)]:this.#rejectWith(value2,offset):mode==="sgmlFirst"?isAsciiLetter(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="sgmlName",[]):this.#rejectWith(value2,offset):mode==="sgmlName"?value2===">"?[this.#emit("sgml",1,0,value2,offset)]:isNameChar(value2)?this.#nameLength>=16?this.#rejectWith(value2,offset):(this.#buffer+=value2,this.#nameLength+=1,[]):this.#rejectWith(value2,offset):mode==="bracketFirst"?isAsciiUpper(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="bracketName",[]):this.#rejectWith(value2,offset):value2==="]"?this.#nameLength<2?this.#rejectWith(value2,offset):[this.#emit("bracket",1,0,value2,offset)]:isBracketNameChar(value2)?this.#nameLength>=16?this.#rejectWith(value2,offset):(this.#buffer+=value2,this.#nameLength+=1,[]):this.#rejectWith(value2,offset)}#emit(family,nameStart,nameTrimEnd,closer,offset){let name=this.#buffer.slice(nameStart,nameTrimEnd===0?void 0:nameTrimEnd),token={family,name,tokenId:`${family}:${name}`,text:this.#buffer+closer,startOffset:this.#startOffset,endOffset:offset+1};return this.#mode="ground",this.#buffer="",this.#nameLength=0,{kind:"token",token}}#rejectWith(value2,offset){let outcomes2=[{kind:"reject",text:this.#buffer,startOffset:this.#startOffset}];return this.#mode="ground",this.#buffer="",this.#nameLength=0,value2==="<"?(this.#begin("angleOpen",value2,offset),outcomes2):value2==="["?(this.#begin("bracketFirst",value2,offset),outcomes2):(outcomes2.push({kind:"ground",value:value2,offset}),outcomes2)}};var MAX_RUN_GAP_WHITESPACE=32,GAP_TRACK_CAP=33,RUN_THRESHOLD_START=3,RUN_THRESHOLD_NORMAL=4,RUN_THRESHOLD_QUOTATION=8,EVIDENCE_TTL_CHARS=2048,NO_PAYLOAD_OFFSET=-1;function thresholdFor(context){return context==="start"?RUN_THRESHOLD_START:context==="quotation"?RUN_THRESHOLD_QUOTATION:RUN_THRESHOLD_NORMAL}function noteNonWhitespace(state,offset){let evidence=state.pendingEvidence;evidence!==void 0&&evidence.firstPayloadOffset===NO_PAYLOAD_OFFSET&&(state.pendingEvidence={...evidence,gapLength:state.whitespaceSinceToken,firstPayloadOffset:offset})}function processGround(state,value2,offset){value2.length===1&&isAsciiWhitespace(value2.charCodeAt(0))?state.whitespaceSinceToken<GAP_TRACK_CAP&&(state.whitespaceSinceToken+=1):(state.whitespaceOnlySinceToken=!1,noteNonWhitespace(state,offset)),state.tracker.observeGround(value2)}function processReject(state,text2,startOffset){state.whitespaceOnlySinceToken=!1,noteNonWhitespace(state,startOffset),state.tracker.observeText(text2)}function processToken(state,token){let context=state.tracker.classify(token.startOffset);noteNonWhitespace(state,token.startOffset);let run2=state.run;run2!==null&&run2.tokenId===token.tokenId&&state.whitespaceOnlySinceToken&&state.whitespaceSinceToken<=MAX_RUN_GAP_WHITESPACE?run2.count+=1:state.run={tokenId:token.tokenId,family:token.family,context,firstStartOffset:token.startOffset,count:1},state.pendingEvidence={tokenId:token.tokenId,family:token.family,startOffset:token.startOffset,endOffset:token.endOffset,quotationLike:context==="quotation",gapLength:0,firstPayloadOffset:NO_PAYLOAD_OFFSET,expiresAtOffset:token.endOffset+EVIDENCE_TTL_CHARS},state.whitespaceSinceToken=0,state.whitespaceOnlySinceToken=!0,state.tracker.observeText(token.text);let active=state.run;active!==null&&active.count>=thresholdFor(active.context)&&(state.latched={rule:"control-token-leak",reason:`${active.count}x ${active.tokenId} run in ${active.context} context`,anomalyStartOffset:active.firstStartOffset,garbageStartOffset:active.firstStartOffset,detail:{tokenId:active.tokenId,family:active.family,occurrences:active.count,context:active.context}})}function corroboratesControlLeak(evidence,collapseMatchAnomalyStartOffset,currentOffset){return currentOffset>evidence.expiresAtOffset||evidence.firstPayloadOffset===NO_PAYLOAD_OFFSET||evidence.gapLength>MAX_RUN_GAP_WHITESPACE?!1:evidence.firstPayloadOffset===collapseMatchAnomalyStartOffset}function createControlLeakDetector(){return{createState:()=>({scanner:new ScalarScanner,parser:new CandidateParser,tracker:new StreamContextTracker,run:null,whitespaceOnlySinceToken:!0,whitespaceSinceToken:0,pendingEvidence:void 0,latched:null,currentOffset:0}),checkDelta:(state,delta,_ctx)=>{if(state.latched!==null)return state.latched;for(let entry of state.scanner.push(delta)){for(let outcome of state.parser.feed(entry.value,entry.startOffset))outcome.kind==="ground"?processGround(state,outcome.value,outcome.offset):outcome.kind==="reject"?processReject(state,outcome.text,outcome.startOffset):processToken(state,outcome.token);if(state.latched!==null)break}return state.currentOffset=state.scanner.offset,state.latched},flush:state=>state.latched}}var StreamWatcher=class{#manager;#leakDetector=createControlLeakDetector();#disabledBuiltin;#tracks=new Map;constructor(manager,disabledBuiltinRules){this.#manager=manager,this.#disabledBuiltin=new Set(disabledBuiltinRules)}reset(){this.#tracks.clear(),this.#manager.resetBuffers()}handleDelta(source2,streamKey,delta,generation2,toolName){let track=this.#trackFor(source2,streamKey),detectorCtx={source:source2,streamKey,generation:generation2},leakMatch=this.#disabledBuiltin.has(CONTROL_LEAK_RULE_NAME)?null:this.#leakDetector.checkDelta(track.leak,delta,detectorCtx),collapseMatch=this.#disabledBuiltin.has(COLLAPSE_RULE_NAME)?null:collapseDetector.checkDelta(track.collapse,delta,detectorCtx),evidence=track.leak.pendingEvidence,corroborated=collapseMatch!==null&&evidence!==void 0&&corroboratesControlLeak(evidence,collapseMatch.anomalyStartOffset,track.leak.currentOffset)?collapseMatch:null,resolution=resolveDetection(leakMatch,collapseMatch,corroborated),ruleMatches=this.#manager.checkDelta(delta,{source:source2,streamKey,toolName});return{resolution,ruleMatches}}#trackFor(source2,streamKey){let key=`${source2}:${streamKey}`,track=this.#tracks.get(key);return track===void 0&&(track={collapse:createCollapseState(),leak:this.#leakDetector.createState()},this.#tracks.set(key,track)),track}};var INTERRUPT_KEYBINDING="app.interrupt";function isInterruptKey(data){try{return getKeybindings().matches(data,INTERRUPT_KEYBINDING)}catch{return!1}}function parseDisabledRules(raw){return typeof raw=="string"&&raw.length>0?raw.split(",").map(name=>name.trim()).filter(name=>name.length>0):[]}function ttsrExtension(pi){registerRuleActivationRenderer(pi),pi.registerFlag("ttsr-disabled",{type:"boolean",default:!1,description:"Disable TTSR stream-rule detection."}),pi.registerFlag("ttsr-rules-disabled",{type:"string",default:"",description:"Comma-separated TTSR rule names to disable."});let manager=null,watcher=null,genState=createGenerationState(),generation2=0,pendingRemediation=null,pendingRuleNudge=null,pendingNudge=null,settlingAgentEnd=null,disabled2=!1,repetitiveTurns=new RepetitiveTurnsLane;function cancelRemediation(){(pendingRemediation!==null||pendingNudge!==null||pendingRuleNudge!==null)&&(markUserCancelled(genState),pendingRemediation=null,pendingRuleNudge=null,pendingNudge=null,repetitiveTurns.disarm())}function resetGenerationState(){generation2+=1,genState=createGenerationState(),pendingRemediation=null,pendingRuleNudge=null,repetitiveTurns.resetTurn(),watcher?.reset()}function recordInjection(owner,observed,retryMode){appendRuleActivation(pi,{kind:"ttsr",owner,rules:observed,remediation:retryMode})}function ensureInitialized(ctx){if(manager!==null)return;disabled2=pi.getFlag("ttsr-disabled")===!0;let disabledRules=parseDisabledRules(pi.getFlag("ttsr-rules-disabled"));repetitiveTurns.configure(new Set(disabledRules));let settings={...DEFAULT_TTSR_SETTINGS,enabled:!disabled2,disabledRules};manager=new TtsrManager(settings,pattern=>compileRuleCondition(pattern).regex);let injectedNames=ctx.sessionManager.getEntries().flatMap(entry=>{if(entry.type!=="custom")return[];if(entry.customType===RULE_ACTIVATION_ENTRY_TYPE){let details=parseRuleActivationDetails(entry.data);return details?.kind==="ttsr"?[...details.rules]:[]}if(entry.customType!==TTSR_INJECTION_CUSTOM_TYPE)return[];let data=entry.data;if(typeof data!="object"||data===null||!("rules"in data))return[];let rules=data.rules;return Array.isArray(rules)?rules.filter(rule=>typeof rule=="string"):[]});manager.restoreInjected(injectedNames);for(let rule of BUILTIN_TTSR_RULES)manager.addRule(rule);let discovered=discoverTtsrRulesSync(ctx.cwd);for(let rule of discovered.rules)manager.addRule(rule);if(watcher=new StreamWatcher(manager,disabledRules),repetitiveTurns.restoreFromHistory(readPersistedAssistantTexts(ctx)),ctx.mode==="tui")try{ctx.ui.onTerminalInput(data=>{isInterruptKey(data)&&cancelRemediation()})}catch{return}}function publicState(){return{rules:manager?.getRules()??[],injectedRuleNames:manager?.getInjectedRuleNames()??[],disabled:disabled2}}registerTtsrCommands(pi,publicState),pi.on("session_start",(_event,ctx)=>{ensureInitialized(ctx)}),pi.on("session_abort",()=>{cancelRemediation()}),pi.on("input",()=>{cancelRemediation()}),pi.on("agent_end",event=>{if(settlingAgentEnd=event,event.abortSource==="user"){cancelRemediation();return}event.willRetry===!0&&resetGenerationState()}),pi.on("turn_start",(_event,ctx)=>{ensureInitialized(ctx),resetGenerationState()}),pi.on("turn_end",()=>{manager?.incrementMessageCount()}),pi.on("message_update",(event,ctx)=>{if(ensureInitialized(ctx),disabled2||manager===null||watcher===null)return;let streamDelta=getTtsrStreamDelta(event);if(streamDelta===null)return;let{source:source2,streamKey,delta,toolName}=streamDelta,outcome=watcher.handleDelta(source2,streamKey,delta,generation2,toolName);if(outcome.resolution!==null&&claimAbort(genState,outcome.resolution)){pendingRemediation={resolution:outcome.resolution,streamKind:source2},ctx.abort("system");return}if(source2==="text"){let canArm=pendingRuleNudge===null&&!genState.abortClaimed;if(repetitiveTurns.observeTextDelta(delta,canArm)&&!genState.abortClaimed){genState.abortClaimed=!0,genState.abortOwner="collapse-repetition",genState.selfAbortAt=Date.now(),ctx.abort("system");return}}let rule=outcome.ruleMatches.filter(rule2=>rule2.interruptMode==="always")[0];rule!==void 0&&pendingRuleNudge===null&&!genState.abortClaimed&&(genState.abortClaimed=!0,genState.abortOwner="collapse-repetition",genState.selfAbortAt=Date.now(),pendingRuleNudge={rule},ctx.abort("system"))}),pi.on("message_end",event=>{if(manager?.resetBuffers(),genState.userCancelled||event.message.role!=="assistant")return;let turnText=collectAssistantText(event.message);if(repetitiveTurns.armed){repetitiveTurns.commitArmedTurn(turnText),manager?.markInjectedByNames([REPETITIVE_TURNS_RULE_NAME]),recordInjection(REPETITIVE_TURNS_RULE_NAME,[REPETITIVE_TURNS_RULE_NAME],"nudge"),pendingNudge=buildNudgeMessage(REPETITIVE_TURNS_RULE_NAME,REPETITIVE_TURNS_RULE_CONTENT);return}if(pendingRuleNudge!==null){let pending=pendingRuleNudge;pendingRuleNudge=null,manager?.markInjectedByNames([pending.rule.name]),recordInjection(pending.rule.name,[pending.rule.name],"nudge"),pendingNudge=buildNudgeMessage(pending.rule.name,pending.rule.content);return}if(pendingRemediation!==null){turnText!==null&&repetitiveTurns.recordCompletedTurn(turnText);let pending=pendingRemediation;pendingRemediation=null;try{let outcome=buildStreamRemediation(pending,event.message);return recordInjection(outcome.owner,outcome.observedRules,outcome.retryMode),outcome.nudge!==null&&(pendingNudge=outcome.nudge),{message:{...event.message,...outcome.replacement}}}catch(error2){pi.appendEntry("ttsr-remediation-error",{message:error2 instanceof Error?error2.message:String(error2),at:Date.now()});return}}turnText!==null&&repetitiveTurns.recordCompletedTurn(turnText)}),pi.on("agent_settled",()=>{if(pendingNudge===null||genState.userCancelled||settlingAgentEnd?.abortSource==="user"){pendingNudge=null,settlingAgentEnd=null;return}let nudge=pendingNudge;pendingNudge=null,pi.sendMessage(nudge,{triggerTurn:!0})})}import{readFile as fsReadFile,stat as fsStat}from"node:fs/promises";import{basename as basename18,extname as extname3,isAbsolute as isAbsolute21,resolve as resolvePath2}from"node:path";var TOOL_NAME2="read_video",MAX_VIDEO_MEGABYTES=100,MAX_VIDEO_BYTES=MAX_VIDEO_MEGABYTES*1024*1024,EXT_TO_MIME={mp4:"video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",mov:"video/quicktime",webm:"video/webm",mkv:"video/x-matroska",avi:"video/x-msvideo",flv:"video/x-flv","3gp":"video/3gpp"};function detectVideoMimeType(path15){let ext=extname3(path15).slice(1).toLowerCase();return EXT_TO_MIME[ext]}function modelSupportsVideo(model){return model?.input?.includes("video")===!0}var readVideoSchema=typebox_exports.Object({path:typebox_exports.String({description:"Path to a video file (relative or absolute). Max 100MB."})});function videoInExtension(pi){pi.registerTool({name:TOOL_NAME2,label:"Read Video",description:`Read a video file (${Object.keys(EXT_TO_MIME).join(", ")}) and attach it to the conversation so you can watch it. Maximum file size ${MAX_VIDEO_MEGABYTES}MB. Use this to understand screen recordings, demo clips, or any behavior that is hard to describe in text. If you generate or edit a video via commands or scripts, read the result back before continuing.`,promptSnippet:"Attach a video file so the model can watch it (video-capable models only)",parameters:readVideoSchema,async execute(_toolCallId,params,signal,_onUpdate,ctx){if(signal?.aborted)throw new Error("Operation aborted");if(!modelSupportsVideo(ctx.model))throw new Error("The current model does not support video input. Tell the user to switch to a model with video input capability (e.g. kimi-coding/k3).");let absolutePath=isAbsolute21(params.path)?params.path:resolvePath2(ctx.cwd,params.path),mimeType=detectVideoMimeType(absolutePath);if(!mimeType)throw new Error(`"${params.path}" is not a supported video file. Supported extensions: ${Object.keys(EXT_TO_MIME).join(", ")}.`);let stats=await fsStat(absolutePath);if(!stats.isFile())throw new Error(`"${params.path}" is not a regular file.`);if(stats.size===0)throw new Error(`"${params.path}" is empty.`);if(stats.size>MAX_VIDEO_BYTES)throw new Error(`"${params.path}" is ${stats.size} bytes, which exceeds the maximum ${MAX_VIDEO_MEGABYTES}MB for video files. Create a smaller clip (e.g. with ffmpeg) and read that instead.`);let data=await fsReadFile(absolutePath);if(signal?.aborted)throw new Error("Operation aborted");return{content:[{type:"text",text:`Read video file "${basename18(absolutePath)}" [${mimeType}, ${stats.size} bytes]. The video is attached below.`},{type:"image",data:data.toString("base64"),mimeType}],details:void 0}}});function syncToolActivation(model){let active=pi.getActiveTools(),isActive2=active.includes(TOOL_NAME2),shouldBeActive=modelSupportsVideo(model);shouldBeActive&&!isActive2?pi.setActiveTools([...active,TOOL_NAME2]):!shouldBeActive&&isActive2&&pi.setActiveTools(active.filter(name=>name!==TOOL_NAME2))}pi.on("session_start",async(_event,ctx)=>{syncToolActivation(ctx.model)}),pi.on("model_select",async event=>{syncToolActivation(event.model)})}var URL_BUDGET=92,PREVIEW_LINES=4,PREVIEW_WIDTH=120;function renderWebfetchCall(args,theme2){let webfetchArgs=parseWebfetchArgs(args),head=theme2.fg("toolTitle",theme2.bold("webfetch ")),url=theme2.fg("accent",shorten3(webfetchArgs.url,URL_BUDGET)),format2=theme2.fg("muted",` [${webfetchArgs.format??"markdown"}]`),timeout=webfetchArgs.timeout===void 0?"":theme2.fg("dim",` ${webfetchArgs.timeout}s`);return new Text(head+url+format2+timeout,0,0)}function renderWebfetchResult(result3,options,theme2){if(options.isPartial){let details2=result3.details;return isWebfetchProgressDetails(details2)?new Text(theme2.fg("warning",formatProgress2(details2)),0,0):new Text(theme2.fg("warning","Fetching..."),0,0)}let details=result3.details,text2=result3.content.find(block=>block.type==="text")?.text??"";if(!isWebfetchDetails(details))return new Text(theme2.fg("muted",truncateToWidth(text2,PREVIEW_WIDTH)),0,0);let statusKey=details.status>=200&&details.status<300?"success":"warning",status=theme2.fg(statusKey,`${details.status} ${details.statusText||"OK"}`),format2=theme2.fg("accent",details.format),size=theme2.fg("muted",formatBytes(details.bytes)),converted=details.converted?theme2.fg("dim"," converted"):"",truncatedNote=details.outputTruncated?theme2.fg("warning"," truncated"):"",header2=`${status} ${theme2.fg("muted","\u2022")} ${format2} ${theme2.fg("muted","\u2022")} ${size}${converted}${truncatedNote}`;if(!options.expanded){let preview=previewText(text2,theme2);return new Text([header2,...preview].join(`
2351
+ `,SPACE=" ",TAB=" ",DISCUSSION_VOCAB=["token","tokens","tokenizer","delimiter","special","literal","example","documentation","sequence","sentinel","vocabulary"],StreamContextTracker=class{#head="";#window="";#tickChar="";#tickCount=0;#inFence=!1;#fenceChar="";#inInline=!1;#lineIndent=0;#lineHasContent=!1;#lineIsBlockquote=!1;#lineIsIndented=!1;#lastNonWs="";observeGround(value2){if(this.#tickChar!==""){if(value2===this.#tickChar){this.#tickCount+=1,this.#appendText(value2),this.#lastNonWs=value2,this.#lineHasContent=!0;return}this.#resolveTicks()}if(value2===BACKTICK||value2===TILDE){this.#tickChar=value2,this.#tickCount=1,this.#appendText(value2),this.#lastNonWs=value2,this.#lineHasContent=!0;return}if(value2===NEWLINE){this.#lineIndent=0,this.#lineHasContent=!1,this.#lineIsBlockquote=!1,this.#lineIsIndented=!1,this.#appendText(value2);return}let code=value2.charCodeAt(0),whitespace=value2.length===1&&isAsciiWhitespace(code);this.#lineHasContent||(value2===SPACE?this.#lineIndent+=1:value2===TAB?this.#lineIsIndented=!0:whitespace||(this.#lineHasContent=!0,this.#lineIndent>=INDENT_CODE_SPACES&&(this.#lineIsIndented=!0),value2===BLOCKQUOTE_MARK&&(this.#lineIsBlockquote=!0))),whitespace||(this.#lastNonWs=value2),this.#appendText(value2)}observeText(text2){text2.length!==0&&(this.#tickChar!==""&&this.#resolveTicks(),this.#lineHasContent=!0,this.#lastNonWs=text2.slice(-1),this.#appendText(text2))}classify(tokenStartOffset){return this.#isQuotationLike()?"quotation":this.#isStartLike(tokenStartOffset)?"start":"normal"}#isQuotationLike(){if(this.#inFence||this.#inInline||this.#lineIsBlockquote||this.#lineIsIndented||this.#lastNonWs===DOUBLE_QUOTE||this.#lastNonWs===SINGLE_QUOTE)return!0;let tail=this.#window.slice(-VOCAB_LOOKBACK).toLowerCase();return DISCUSSION_VOCAB.some(word=>tail.includes(word))}#isStartLike(tokenStartOffset){if(tokenStartOffset<START_TOKEN_OFFSET_LIMIT&&this.#isWhitespaceOnly(this.#head.slice(0,tokenStartOffset)))return!0;if(tokenStartOffset<PREAMBLE_OFFSET_LIMIT&&tokenStartOffset<=this.#head.length){let trimmed=this.#head.slice(0,tokenStartOffset).trim();if(trimmed.length<=PREAMBLE_MAX_TRIMMED&&PREAMBLE_PATTERN.test(trimmed))return!0}return!1}#isWhitespaceOnly(text2){for(let i=0;i<text2.length;i+=1)if(!isAsciiWhitespace(text2.charCodeAt(i)))return!1;return!0}#resolveTicks(){let count=this.#tickCount,char=this.#tickChar;if(this.#tickChar="",this.#tickCount=0,count>=FENCE_TICK_RUN){this.#inFence?this.#fenceChar===char&&(this.#inFence=!1,this.#fenceChar=""):(this.#inFence=!0,this.#fenceChar=char);return}char===BACKTICK&&!this.#inFence&&(this.#inInline=!this.#inInline)}#appendText(text2){this.#head.length<HEAD_LIMIT&&(this.#head=(this.#head+text2).slice(0,HEAD_LIMIT)),this.#window+=text2,this.#window.length>WINDOW_LIMIT*2&&(this.#window=this.#window.slice(-WINDOW_LIMIT))}};function isAsciiUpper(value2){let code=value2.charCodeAt(0);return code>=65&&code<=90}function isAsciiLower(value2){let code=value2.charCodeAt(0);return code>=97&&code<=122}function isAsciiDigit(value2){let code=value2.charCodeAt(0);return code>=48&&code<=57}function isAsciiLetter(value2){return isAsciiUpper(value2)||isAsciiLower(value2)}function isNameChar(value2){return isAsciiLetter(value2)||isAsciiDigit(value2)||value2==="_"}function isBracketNameChar(value2){return isAsciiUpper(value2)||isAsciiDigit(value2)||value2==="_"}var CandidateParser=class{#mode="ground";#buffer="";#nameLength=0;#startOffset=0;feed(value2,offset){return this.#mode==="ground"?value2==="<"?(this.#begin("angleOpen",value2,offset),[]):value2==="["?(this.#begin("bracketFirst",value2,offset),[]):[{kind:"ground",value:value2,offset}]:this.#advance(value2,offset)}get pendingLength(){return this.#mode==="ground"?0:this.#buffer.length}#begin(mode,value2,offset){this.#mode=mode,this.#buffer=value2,this.#nameLength=0,this.#startOffset=offset}#advance(value2,offset){let mode=this.#mode;return mode==="angleOpen"?value2==="|"?(this.#buffer+=value2,this.#mode="ctrlFirst",[]):value2==="/"?(this.#buffer+=value2,this.#mode="sgmlFirst",[]):isAsciiLetter(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="sgmlName",[]):this.#rejectWith(value2,offset):mode==="ctrlFirst"?isAsciiLetter(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="ctrlName",[]):this.#rejectWith(value2,offset):mode==="ctrlName"?value2==="|"?(this.#buffer+=value2,this.#mode="ctrlClose",[]):isNameChar(value2)?this.#nameLength>=32?this.#rejectWith(value2,offset):(this.#buffer+=value2,this.#nameLength+=1,[]):this.#rejectWith(value2,offset):mode==="ctrlClose"?value2===">"?[this.#emit("ctrl",2,-1,value2,offset)]:this.#rejectWith(value2,offset):mode==="sgmlFirst"?isAsciiLetter(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="sgmlName",[]):this.#rejectWith(value2,offset):mode==="sgmlName"?value2===">"?[this.#emit("sgml",1,0,value2,offset)]:isNameChar(value2)?this.#nameLength>=16?this.#rejectWith(value2,offset):(this.#buffer+=value2,this.#nameLength+=1,[]):this.#rejectWith(value2,offset):mode==="bracketFirst"?isAsciiUpper(value2)?(this.#buffer+=value2,this.#nameLength=1,this.#mode="bracketName",[]):this.#rejectWith(value2,offset):value2==="]"?this.#nameLength<2?this.#rejectWith(value2,offset):[this.#emit("bracket",1,0,value2,offset)]:isBracketNameChar(value2)?this.#nameLength>=16?this.#rejectWith(value2,offset):(this.#buffer+=value2,this.#nameLength+=1,[]):this.#rejectWith(value2,offset)}#emit(family,nameStart,nameTrimEnd,closer,offset){let name=this.#buffer.slice(nameStart,nameTrimEnd===0?void 0:nameTrimEnd),token={family,name,tokenId:`${family}:${name}`,text:this.#buffer+closer,startOffset:this.#startOffset,endOffset:offset+1};return this.#mode="ground",this.#buffer="",this.#nameLength=0,{kind:"token",token}}#rejectWith(value2,offset){let outcomes2=[{kind:"reject",text:this.#buffer,startOffset:this.#startOffset}];return this.#mode="ground",this.#buffer="",this.#nameLength=0,value2==="<"?(this.#begin("angleOpen",value2,offset),outcomes2):value2==="["?(this.#begin("bracketFirst",value2,offset),outcomes2):(outcomes2.push({kind:"ground",value:value2,offset}),outcomes2)}};var MAX_RUN_GAP_WHITESPACE=32,GAP_TRACK_CAP=33,RUN_THRESHOLD_START=3,RUN_THRESHOLD_NORMAL=4,RUN_THRESHOLD_QUOTATION=8,EVIDENCE_TTL_CHARS=2048,NO_PAYLOAD_OFFSET=-1;function thresholdFor(context){return context==="start"?RUN_THRESHOLD_START:context==="quotation"?RUN_THRESHOLD_QUOTATION:RUN_THRESHOLD_NORMAL}function noteNonWhitespace(state,offset){let evidence=state.pendingEvidence;evidence!==void 0&&evidence.firstPayloadOffset===NO_PAYLOAD_OFFSET&&(state.pendingEvidence={...evidence,gapLength:state.whitespaceSinceToken,firstPayloadOffset:offset})}function processGround(state,value2,offset){value2.length===1&&isAsciiWhitespace(value2.charCodeAt(0))?state.whitespaceSinceToken<GAP_TRACK_CAP&&(state.whitespaceSinceToken+=1):(state.whitespaceOnlySinceToken=!1,noteNonWhitespace(state,offset)),state.tracker.observeGround(value2)}function processReject(state,text2,startOffset){state.whitespaceOnlySinceToken=!1,noteNonWhitespace(state,startOffset),state.tracker.observeText(text2)}function processToken(state,token){let context=state.tracker.classify(token.startOffset);noteNonWhitespace(state,token.startOffset);let run2=state.run;run2!==null&&run2.tokenId===token.tokenId&&state.whitespaceOnlySinceToken&&state.whitespaceSinceToken<=MAX_RUN_GAP_WHITESPACE?run2.count+=1:state.run={tokenId:token.tokenId,family:token.family,context,firstStartOffset:token.startOffset,count:1},state.pendingEvidence={tokenId:token.tokenId,family:token.family,startOffset:token.startOffset,endOffset:token.endOffset,quotationLike:context==="quotation",gapLength:0,firstPayloadOffset:NO_PAYLOAD_OFFSET,expiresAtOffset:token.endOffset+EVIDENCE_TTL_CHARS},state.whitespaceSinceToken=0,state.whitespaceOnlySinceToken=!0,state.tracker.observeText(token.text);let active=state.run;active!==null&&active.count>=thresholdFor(active.context)&&(state.latched={rule:"control-token-leak",reason:`${active.count}x ${active.tokenId} run in ${active.context} context`,anomalyStartOffset:active.firstStartOffset,garbageStartOffset:active.firstStartOffset,detail:{tokenId:active.tokenId,family:active.family,occurrences:active.count,context:active.context}})}function corroboratesControlLeak(evidence,collapseMatchAnomalyStartOffset,currentOffset){return currentOffset>evidence.expiresAtOffset||evidence.firstPayloadOffset===NO_PAYLOAD_OFFSET||evidence.gapLength>MAX_RUN_GAP_WHITESPACE?!1:evidence.firstPayloadOffset===collapseMatchAnomalyStartOffset}function createControlLeakDetector(){return{createState:()=>({scanner:new ScalarScanner,parser:new CandidateParser,tracker:new StreamContextTracker,run:null,whitespaceOnlySinceToken:!0,whitespaceSinceToken:0,pendingEvidence:void 0,latched:null,currentOffset:0}),checkDelta:(state,delta,_ctx)=>{if(state.latched!==null)return state.latched;for(let entry of state.scanner.push(delta)){for(let outcome of state.parser.feed(entry.value,entry.startOffset))outcome.kind==="ground"?processGround(state,outcome.value,outcome.offset):outcome.kind==="reject"?processReject(state,outcome.text,outcome.startOffset):processToken(state,outcome.token);if(state.latched!==null)break}return state.currentOffset=state.scanner.offset,state.latched},flush:state=>state.latched}}var StreamWatcher=class{#manager;#leakDetector=createControlLeakDetector();#disabledBuiltin;#tracks=new Map;constructor(manager,disabledBuiltinRules){this.#manager=manager,this.#disabledBuiltin=new Set(disabledBuiltinRules)}reset(){this.#tracks.clear(),this.#manager.resetBuffers()}handleDelta(source2,streamKey,delta,generation2,toolName){let track=this.#trackFor(source2,streamKey),detectorCtx={source:source2,streamKey,generation:generation2},leakMatch=this.#disabledBuiltin.has(CONTROL_LEAK_RULE_NAME)?null:this.#leakDetector.checkDelta(track.leak,delta,detectorCtx),collapseMatch=this.#disabledBuiltin.has(COLLAPSE_RULE_NAME)?null:collapseDetector.checkDelta(track.collapse,delta,detectorCtx),evidence=track.leak.pendingEvidence,corroborated=collapseMatch!==null&&evidence!==void 0&&corroboratesControlLeak(evidence,collapseMatch.anomalyStartOffset,track.leak.currentOffset)?collapseMatch:null,resolution=resolveDetection(leakMatch,collapseMatch,corroborated),ruleMatches=this.#manager.checkDelta(delta,{source:source2,streamKey,toolName});return{resolution,ruleMatches}}#trackFor(source2,streamKey){let key=`${source2}:${streamKey}`,track=this.#tracks.get(key);return track===void 0&&(track={collapse:createCollapseState(),leak:this.#leakDetector.createState()},this.#tracks.set(key,track)),track}};var INTERRUPT_KEYBINDING="app.interrupt";function isInterruptKey(data){try{return getKeybindings().matches(data,INTERRUPT_KEYBINDING)}catch{return!1}}function parseDisabledRules(raw){return typeof raw=="string"&&raw.length>0?raw.split(",").map(name=>name.trim()).filter(name=>name.length>0):[]}function ttsrExtension(pi){registerRuleActivationRenderer(pi),pi.registerFlag("ttsr-disabled",{type:"boolean",default:!1,description:"Disable TTSR stream-rule detection."}),pi.registerFlag("ttsr-rules-disabled",{type:"string",default:"",description:"Comma-separated TTSR rule names to disable."});let manager=null,watcher=null,genState=createGenerationState(),generation2=0,pendingRemediation=null,pendingRuleNudge=null,pendingNudge=null,settlingAgentEnd=null,disabled2=!1,repetitiveTurns=new RepetitiveTurnsLane;function cancelRemediation(){(pendingRemediation!==null||pendingNudge!==null||pendingRuleNudge!==null)&&(markUserCancelled(genState),pendingRemediation=null,pendingRuleNudge=null,pendingNudge=null,repetitiveTurns.disarm())}function resetGenerationState(){generation2+=1,genState=createGenerationState(),pendingRemediation=null,pendingRuleNudge=null,repetitiveTurns.resetTurn(),watcher?.reset()}function recordInjection(owner,observed,retryMode){appendRuleActivation(pi,{kind:"ttsr",owner,rules:observed,remediation:retryMode})}function ensureInitialized(ctx){if(manager!==null)return;disabled2=pi.getFlag("ttsr-disabled")===!0;let disabledRules=parseDisabledRules(pi.getFlag("ttsr-rules-disabled"));repetitiveTurns.configure(new Set(disabledRules));let settings={...DEFAULT_TTSR_SETTINGS,enabled:!disabled2,disabledRules};manager=new TtsrManager(settings,pattern=>compileRuleCondition(pattern).regex);let injectedNames=ctx.sessionManager.getEntries().flatMap(entry=>{if(entry.type!=="custom")return[];if(entry.customType===RULE_ACTIVATION_ENTRY_TYPE){let details=parseRuleActivationDetails(entry.data);return details?.kind==="ttsr"?[...details.rules]:[]}if(entry.customType!==TTSR_INJECTION_CUSTOM_TYPE)return[];let data=entry.data;if(typeof data!="object"||data===null||!("rules"in data))return[];let rules=data.rules;return Array.isArray(rules)?rules.filter(rule=>typeof rule=="string"):[]});manager.restoreInjected(injectedNames);for(let rule of BUILTIN_TTSR_RULES)manager.addRule(rule);let discovered=discoverTtsrRulesSync(ctx.cwd);for(let rule of discovered.rules)manager.addRule(rule);if(watcher=new StreamWatcher(manager,disabledRules),repetitiveTurns.restoreFromHistory(readPersistedAssistantTexts(ctx)),ctx.mode==="tui")try{ctx.ui.onTerminalInput(data=>{isInterruptKey(data)&&cancelRemediation()})}catch{return}}function publicState(){return{rules:manager?.getRules()??[],injectedRuleNames:manager?.getInjectedRuleNames()??[],disabled:disabled2}}registerTtsrCommands(pi,publicState),pi.on("session_start",(_event,ctx)=>{ensureInitialized(ctx)}),pi.on("session_abort",()=>{cancelRemediation()}),pi.on("input",()=>{cancelRemediation()}),pi.on("agent_end",event=>{if(settlingAgentEnd=event,event.abortSource==="user"){cancelRemediation();return}event.willRetry===!0&&resetGenerationState()}),pi.on("turn_start",(_event,ctx)=>{ensureInitialized(ctx),resetGenerationState()}),pi.on("turn_end",()=>{manager?.incrementMessageCount()}),pi.on("message_update",(event,ctx)=>{if(ensureInitialized(ctx),disabled2||manager===null||watcher===null)return;let streamDelta=getTtsrStreamDelta(event);if(streamDelta===null)return;let{source:source2,streamKey,delta,toolName}=streamDelta,outcome=watcher.handleDelta(source2,streamKey,delta,generation2,toolName);if(outcome.resolution!==null&&claimAbort(genState,outcome.resolution)){pendingRemediation={resolution:outcome.resolution,streamKind:source2},ctx.abort("system");return}if(source2==="text"){let canArm=pendingRuleNudge===null&&!genState.abortClaimed;if(repetitiveTurns.observeTextDelta(delta,canArm)&&!genState.abortClaimed){genState.abortClaimed=!0,genState.abortOwner="collapse-repetition",genState.selfAbortAt=Date.now(),ctx.abort("system");return}}let rule=outcome.ruleMatches.filter(rule2=>rule2.interruptMode==="always")[0];rule!==void 0&&pendingRuleNudge===null&&!genState.abortClaimed&&(genState.abortClaimed=!0,genState.abortOwner="collapse-repetition",genState.selfAbortAt=Date.now(),pendingRuleNudge={rule},ctx.abort("system"))}),pi.on("message_end",event=>{if(manager?.resetBuffers(),genState.userCancelled||event.message.role!=="assistant")return;let turnText=collectAssistantText(event.message);if(repetitiveTurns.armed){repetitiveTurns.commitArmedTurn(turnText),manager?.markInjectedByNames([REPETITIVE_TURNS_RULE_NAME]),recordInjection(REPETITIVE_TURNS_RULE_NAME,[REPETITIVE_TURNS_RULE_NAME],"nudge"),pendingNudge=buildNudgeMessage(REPETITIVE_TURNS_RULE_NAME,REPETITIVE_TURNS_RULE_CONTENT);return}if(pendingRuleNudge!==null){let pending=pendingRuleNudge;pendingRuleNudge=null,manager?.markInjectedByNames([pending.rule.name]),recordInjection(pending.rule.name,[pending.rule.name],"nudge"),pendingNudge=buildNudgeMessage(pending.rule.name,pending.rule.content);return}if(pendingRemediation!==null){turnText!==null&&repetitiveTurns.recordCompletedTurn(turnText);let pending=pendingRemediation;pendingRemediation=null;try{let outcome=buildStreamRemediation(pending,event.message);return recordInjection(outcome.owner,outcome.observedRules,outcome.retryMode),outcome.nudge!==null&&(pendingNudge=outcome.nudge),{message:{...event.message,...outcome.replacement}}}catch(error2){pi.appendEntry("ttsr-remediation-error",{message:error2 instanceof Error?error2.message:String(error2),at:Date.now()});return}}turnText!==null&&repetitiveTurns.recordCompletedTurn(turnText)}),pi.on("agent_settled",(_event,ctx)=>{if(pendingNudge===null||genState.userCancelled||settlingAgentEnd?.abortSource==="user"){pendingNudge=null,settlingAgentEnd=null;return}let nudge=pendingNudge;pendingNudge=null;let[rule]=nudge.details.rules;if(rule!==void 0&&ruleAlreadyCorrected(ctx.sessionManager.getEntries(),rule)){pi.appendEntry(TTSR_LOOP_STOPPED_ENTRY_TYPE,{rules:nudge.details.rules,at:Date.now()}),pi.events.emit(TTSR_LOOP_STOPPED_EVENT,{rules:nudge.details.rules}),ctx.ui.notify(ttsrLoopStoppedNotice(rule),"warning");return}pi.sendMessage(nudge,{triggerTurn:!0})})}import{readFile as fsReadFile,stat as fsStat}from"node:fs/promises";import{basename as basename18,extname as extname3,isAbsolute as isAbsolute21,resolve as resolvePath2}from"node:path";var TOOL_NAME2="read_video",MAX_VIDEO_MEGABYTES=100,MAX_VIDEO_BYTES=MAX_VIDEO_MEGABYTES*1024*1024,EXT_TO_MIME={mp4:"video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",mov:"video/quicktime",webm:"video/webm",mkv:"video/x-matroska",avi:"video/x-msvideo",flv:"video/x-flv","3gp":"video/3gpp"};function detectVideoMimeType(path15){let ext=extname3(path15).slice(1).toLowerCase();return EXT_TO_MIME[ext]}function modelSupportsVideo(model){return model?.input?.includes("video")===!0}var readVideoSchema=typebox_exports.Object({path:typebox_exports.String({description:"Path to a video file (relative or absolute). Max 100MB."})});function videoInExtension(pi){pi.registerTool({name:TOOL_NAME2,label:"Read Video",description:`Read a video file (${Object.keys(EXT_TO_MIME).join(", ")}) and attach it to the conversation so you can watch it. Maximum file size ${MAX_VIDEO_MEGABYTES}MB. Use this to understand screen recordings, demo clips, or any behavior that is hard to describe in text. If you generate or edit a video via commands or scripts, read the result back before continuing.`,promptSnippet:"Attach a video file so the model can watch it (video-capable models only)",parameters:readVideoSchema,async execute(_toolCallId,params,signal,_onUpdate,ctx){if(signal?.aborted)throw new Error("Operation aborted");if(!modelSupportsVideo(ctx.model))throw new Error("The current model does not support video input. Tell the user to switch to a model with video input capability (e.g. kimi-coding/k3).");let absolutePath=isAbsolute21(params.path)?params.path:resolvePath2(ctx.cwd,params.path),mimeType=detectVideoMimeType(absolutePath);if(!mimeType)throw new Error(`"${params.path}" is not a supported video file. Supported extensions: ${Object.keys(EXT_TO_MIME).join(", ")}.`);let stats=await fsStat(absolutePath);if(!stats.isFile())throw new Error(`"${params.path}" is not a regular file.`);if(stats.size===0)throw new Error(`"${params.path}" is empty.`);if(stats.size>MAX_VIDEO_BYTES)throw new Error(`"${params.path}" is ${stats.size} bytes, which exceeds the maximum ${MAX_VIDEO_MEGABYTES}MB for video files. Create a smaller clip (e.g. with ffmpeg) and read that instead.`);let data=await fsReadFile(absolutePath);if(signal?.aborted)throw new Error("Operation aborted");return{content:[{type:"text",text:`Read video file "${basename18(absolutePath)}" [${mimeType}, ${stats.size} bytes]. The video is attached below.`},{type:"image",data:data.toString("base64"),mimeType}],details:void 0}}});function syncToolActivation(model){let active=pi.getActiveTools(),isActive2=active.includes(TOOL_NAME2),shouldBeActive=modelSupportsVideo(model);shouldBeActive&&!isActive2?pi.setActiveTools([...active,TOOL_NAME2]):!shouldBeActive&&isActive2&&pi.setActiveTools(active.filter(name=>name!==TOOL_NAME2))}pi.on("session_start",async(_event,ctx)=>{syncToolActivation(ctx.model)}),pi.on("model_select",async event=>{syncToolActivation(event.model)})}var URL_BUDGET=92,PREVIEW_LINES=4,PREVIEW_WIDTH=120;function renderWebfetchCall(args,theme2){let webfetchArgs=parseWebfetchArgs(args),head=theme2.fg("toolTitle",theme2.bold("webfetch ")),url=theme2.fg("accent",shorten3(webfetchArgs.url,URL_BUDGET)),format2=theme2.fg("muted",` [${webfetchArgs.format??"markdown"}]`),timeout=webfetchArgs.timeout===void 0?"":theme2.fg("dim",` ${webfetchArgs.timeout}s`);return new Text(head+url+format2+timeout,0,0)}function renderWebfetchResult(result3,options,theme2){if(options.isPartial){let details2=result3.details;return isWebfetchProgressDetails(details2)?new Text(theme2.fg("warning",formatProgress2(details2)),0,0):new Text(theme2.fg("warning","Fetching..."),0,0)}let details=result3.details,text2=result3.content.find(block=>block.type==="text")?.text??"";if(!isWebfetchDetails(details))return new Text(theme2.fg("muted",truncateToWidth(text2,PREVIEW_WIDTH)),0,0);let statusKey=details.status>=200&&details.status<300?"success":"warning",status=theme2.fg(statusKey,`${details.status} ${details.statusText||"OK"}`),format2=theme2.fg("accent",details.format),size=theme2.fg("muted",formatBytes(details.bytes)),converted=details.converted?theme2.fg("dim"," converted"):"",truncatedNote=details.outputTruncated?theme2.fg("warning"," truncated"):"",header2=`${status} ${theme2.fg("muted","\u2022")} ${format2} ${theme2.fg("muted","\u2022")} ${size}${converted}${truncatedNote}`;if(!options.expanded){let preview=previewText(text2,theme2);return new Text([header2,...preview].join(`
2357
2352
  `),0,0)}let lines=[header2,theme2.fg("dim",`URL: ${shorten3(details.finalUrl,URL_BUDGET)}`),theme2.fg("dim",`Content-Type: ${details.contentType||"unknown"}`),"",...collectLines(text2,24).map(line=>theme2.fg("toolOutput",truncateToWidth(line,PREVIEW_WIDTH)))];return new Text(lines.join(`
2358
2353
  `),0,0)}function collectLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
2359
2354
  `,start);if(newlineIndex===-1){lines.push(text2.slice(start));break}lines.push(text2.slice(start,newlineIndex)),start=newlineIndex+1}return lines}function collectNonEmptyTrimmedLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
@@ -2478,7 +2473,7 @@ ${renderToolDiff(generateAddedContentDiff(normalizedContent,maxLines),{filePath:
2478
2473
 
2479
2474
  ${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",line)).join(`
2480
2475
  `)}`}remaining>0&&(text2+=`${theme2.fg("muted",`
2481
- ... (${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:(path15,content)=>fsWriteFile2(path15,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:path15,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path15,ctx?.cwd||cwd),dir=dirname41(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 ${path15}`}],details:createWriteDetails(path15,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 existsSync34,mkdirSync as mkdirSync17}from"node:fs";import{basename as basename24,join as join68,parse as parse6,resolve as resolve40}from"node:path";import{basename as basename23}from"node:path";var SessionStartTurnGate=class{constructor(onStartError){this.onStartError=onStartError}admit(start){this.held?this.held.push(start):start()}async dispatch(run2){if(this.held)return run2();let held=[];this.held=held;try{return await run2()}finally{this.held=void 0;for(let start of held)try{start()}catch(error2){this.onStartError(error2)}}}};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 isUserBashEventResult(value2){if(typeof value2!="object"||value2===null)return!1;let candidate=value2,hasOperations=candidate.operations!==void 0,hasResult=candidate.result!==void 0;if(hasOperations===hasResult)return!1;if(hasOperations){let operations=candidate.operations;return typeof operations!="object"||operations===null?!1:typeof operations.exec=="function"}let result3=candidate.result;if(typeof result3!="object"||result3===null)return!1;let resultRecord=result3;return typeof resultRecord.output=="string"&&"exitCode"in resultRecord&&(resultRecord.exitCode===void 0||typeof resultRecord.exitCode=="number")&&typeof resultRecord.cancelled=="boolean"&&typeof resultRecord.truncated=="boolean"&&(resultRecord.fullOutputPath===void 0||typeof resultRecord.fullOutputPath=="string")}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}function snapshotEventHandlers(extensions,event){return extensions.map(ext=>({ext,handlers:ext.handlers.get(event)?.slice()??[]}))}function sameMessages(left,right){return left.length===right.length&&left.every((message,index)=>message===right[index])}function restoreSystemMessages(current,visible,returned){if(sameMessages(returned,visible))return current;let head=getCurrentSystemMessage(current);return head?[head,...returned]:returned}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let{ext,handlers}of snapshotEventHandlers(extensionsResult.extensions,"project_trust"))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.getBrowserEngineFn=()=>{},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.getCallableToolsFn=()=>[],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.sessionStartTurns=new SessionStartTurnGate(error2=>this.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_start",error:error2 instanceof Error?error2.message:String(error2)})),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=(message,options)=>{options?.triggerTurn===!0?this.sessionStartTurns.admit(()=>actions.sendMessage(message,options)):actions.sendMessage(message,options)},this.runtime.sendUserMessage=(content,options)=>this.sessionStartTurns.admit(()=>actions.sendUserMessage(content,options)),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.getSettings=actions.getSettings,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,actions.sessionControl&&(this.runtime.sessionControl=actions.sessionControl),this.runtime.createContext=()=>this.createContext(),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),contextActions.getBrowserEngine&&(this.getBrowserEngineFn=contextActions.getBrowserEngine),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,this.executeToolFn=contextActions.executeTool,this.getCallableToolsFn=contextActions.getCallableTools??(()=>[]);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})}let registerVirtualModel=definition=>{providerActions?.registerVirtualModel?providerActions.registerVirtualModel(definition):this.modelRegistry.registerVirtualModel(definition)};for(let{definition,extensionPath}of this.runtime.pendingVirtualModelRegistrations)try{registerVirtualModel(definition)}catch(err2){this.emitError({extensionPath,event:"register_virtual_model",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.pendingVirtualModelRegistrations=[],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)},this.runtime.registerVirtualModel=registerVirtualModel,this.runtime.unregisterVirtualModel=(provider,id)=>{providerActions?.unregisterVirtualModel?providerActions.unregisterVirtualModel(provider,id):this.modelRegistry.unregisterVirtualModel(provider,id)}}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,run2){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 run2().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:path15,resolvedPath})=>({path:path15,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):basename23(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run2){let base={type:"tool_hook_status",hookRunId:`${run2.toolCallId}:${run2.hookName}:${this.nextToolHookRunIndex++}`,hookName:run2.hookName,toolName:run2.toolName,toolCallId:run2.toolCallId,extensionPath:run2.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run2.extensionPath,run2.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}}getMemoryReporters(){return this.extensions.flatMap(ext=>[...ext.memoryReporters??new Map].map(([name,reporter])=>({name,reporter})))}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 matches2=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches2.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches2.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches2[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 browserEngine(){return runner.assertActive(),runner.getBrowserEngineFn()},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()},get evalHandleHost(){return runner.assertActive(),runner.runtime.evalHandleHost},abort:source2=>{runner.assertActive(),runner.abortFn(source2)},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())}}createToolContext(toolCallId,signal,baseContext=this.createContext()){let runner=this;return Object.defineProperties(baseContext,{tools:{get(){return runner.assertActive(),runner.getCallableToolsFn()}},executeTool:{value:async(name,args,options={})=>(runner.assertActive(),runner.executeToolFn?runner.executeToolFn(toolCallId,name,args,{...options,signal:options.signal??signal}):{toolCall:{type:"toolCall",id:`${toolCallId}/0`,name,arguments:{}},result:{content:[{type:"text",text:"Nested tool calls are not available in this context"}],details:{}},isError:!0})}})}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}async emitBoundary(baseEvent,buildContext2){let ctx=this.createContext(),entries=[],shouldContinue=!1,context=await buildContext2(entries),valid3=!0;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,baseEvent.type))for(let handler of handlers){let event={...baseEvent,entries,continue:shouldContinue,context};try{let handlerResult=await handler(event,ctx);handlerResult?.entries!==void 0&&(entries=handlerResult.entries),handlerResult?.continue!==void 0&&(shouldContinue=handlerResult.continue)}catch(err2){this.emitError({extensionPath:ext.path,event:baseEvent.type,error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}try{context=await buildContext2(entries),valid3=!0}catch(err2){valid3=!1,this.emitError({extensionPath:ext.path,event:baseEvent.type,error:`Invalid boundary entries: ${err2 instanceof Error?err2.message:String(err2)}`,stack:err2 instanceof Error?err2.stack:void 0})}}return valid3?{entries,continue:shouldContinue,context,valid:!0}:{entries:[],continue:!1,context,valid:!1}}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(resolve47=>{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(()=>resolve47(!0),budget.timeoutMs)),settled.then(()=>resolve47(!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}emit(event){return event.type==="session_start"?this.sessionStartTurns.dispatch(()=>this.dispatchEmit(event)):this.dispatchEmit(event)}async dispatchEmit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,event.type))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,handlers}of snapshotEventHandlers(this.extensions,"message_end"))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,handlers}of snapshotEventHandlers(this.extensions,"tool_result"))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,handlerResult.structuredContent===void 0&&delete currentEvent.structuredContent,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.structuredContent!==void 0&&(currentEvent.structuredContent=handlerResult.structuredContent,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,structuredContent:currentEvent.structuredContent,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_call"))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,handlers}of snapshotEventHandlers(this.extensions,"user_bash"))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult===void 0)continue;if(!isUserBashEventResult(handlerResult))throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;throw this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack}),err2}}async emitContext(messages,excludeExtensionPath){let contextHandlers=snapshotEventHandlers(this.extensions,"context"),contextWithSystemHandlers=snapshotEventHandlers(this.extensions,"context_with_system"),currentMessages=[contextHandlers,contextWithSystemHandlers].every(snapshot=>snapshot.every(({ext,handlers})=>ext.path===excludeExtensionPath||handlers.every(handler=>ext.nonMutatingContextHandlers?.has(handler)===!0)))?messages.slice():cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return markTransientMessage(entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message)});for(let{ext,handlers}of contextHandlers)if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hasSystemMessages=currentMessages.some(message=>message.role==="system"),visibleMessages=hasSystemMessages?currentMessages.filter(message=>message.role!=="system"):currentMessages,visibleSnapshot=visibleMessages.slice(),returned=(await handler({type:"context",messages:visibleMessages},this.createContext(ext.path)))?.messages??(sameMessages(visibleMessages,visibleSnapshot)?void 0:visibleMessages);if(!returned)continue;currentMessages=hasSystemMessages?restoreSystemMessages(currentMessages,visibleSnapshot,returned):returned}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})}for(let{ext,handlers}of contextWithSystemHandlers)if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hadLeadingSystemMessage=currentMessages[0]?.role==="system";currentMessages=(await handler({type:"context_with_system",messages:currentMessages},this.createContext(ext.path)))?.messages??currentMessages,hadLeadingSystemMessage&&currentMessages[0]?.role!=="system"&&this.emitError({extensionPath:ext.path,event:"context_with_system",error:"Handler removed the leading system message; the request has no prompt or initial tool declarations. Keep it at index 0 or replace a dropped prefix with getCurrentSystemMessage()."})}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_with_system",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,handlers}of snapshotEventHandlers(this.extensions,"before_provider_request"))if(ext.path!==excludeExtensionPath)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,handlers}of snapshotEventHandlers(this.extensions,"before_provider_headers"))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,handlers}of snapshotEventHandlers(this.extensions,"before_agent_start"))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,handlers}of snapshotEventHandlers(this.extensions,"resources_discover"))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,source2,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"input"))for(let handler of handlers)try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source:source2,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{existsSync as existsSync33}from"node:fs";function getMissingSessionCwdIssue(sessionManager,fallbackCwd){let sessionFile=sessionManager.getSessionFile();if(!sessionFile)return;let sessionCwd=sessionManager.getCwd();if(!(!sessionCwd||existsSync33(sessionCwd)))return{sessionFile,sessionCwd,fallbackCwd}}function formatMissingSessionCwdError(issue){let sessionFile=issue.sessionFile?`
2476
+ ... (${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:(path15,content)=>fsWriteFile2(path15,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:path15,content},signal,_onUpdate,ctx){let absolutePath=resolveToCwd(path15,ctx?.cwd||cwd),dir=dirname41(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 ${path15}`}],details:createWriteDetails(path15,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 existsSync34,mkdirSync as mkdirSync17}from"node:fs";import{basename as basename24,join as join68,parse as parse6,resolve as resolve40}from"node:path";import{basename as basename23}from"node:path";var SessionStartTurnGate=class{constructor(onStartError){this.onStartError=onStartError}admit(start){this.held?this.held.push(start):start()}async dispatch(run2){if(this.held)return run2();let held=[];this.held=held;try{return await run2()}finally{this.held=void 0;for(let start of held)try{start()}catch(error2){this.onStartError(error2)}}}};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 isUserBashEventResult(value2){if(typeof value2!="object"||value2===null)return!1;let candidate=value2,hasOperations=candidate.operations!==void 0,hasResult=candidate.result!==void 0;if(hasOperations===hasResult)return!1;if(hasOperations){let operations=candidate.operations;return typeof operations!="object"||operations===null?!1:typeof operations.exec=="function"}let result3=candidate.result;if(typeof result3!="object"||result3===null)return!1;let resultRecord=result3;return typeof resultRecord.output=="string"&&"exitCode"in resultRecord&&(resultRecord.exitCode===void 0||typeof resultRecord.exitCode=="number")&&typeof resultRecord.cancelled=="boolean"&&typeof resultRecord.truncated=="boolean"&&(resultRecord.fullOutputPath===void 0||typeof resultRecord.fullOutputPath=="string")}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}function snapshotEventHandlers(extensions,event){return extensions.map(ext=>({ext,handlers:ext.handlers.get(event)?.slice()??[]}))}function sameMessages(left,right){return left.length===right.length&&left.every((message,index)=>message===right[index])}function restoreSystemMessages(current,visible,returned){if(sameMessages(returned,visible))return current;let head=getCurrentSystemMessage(current);return head?[head,...returned]:returned}async function emitProjectTrustEvent(extensionsResult,event,ctx){let errors=[];for(let{ext,handlers}of snapshotEventHandlers(extensionsResult.extensions,"project_trust"))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.getBrowserEngineFn=()=>{},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.getCallableToolsFn=()=>[],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.sessionStartTurns=new SessionStartTurnGate(error2=>this.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"session_start",error:error2 instanceof Error?error2.message:String(error2)})),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=(message,options)=>{options?.triggerTurn===!0?this.sessionStartTurns.admit(()=>actions.sendMessage(message,options)):actions.sendMessage(message,options)},this.runtime.sendUserMessage=(content,options)=>this.sessionStartTurns.admit(()=>actions.sendUserMessage(content,options)),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.getSettings=actions.getSettings,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,actions.sessionControl&&(this.runtime.sessionControl=actions.sessionControl),this.runtime.createContext=()=>this.createContext(),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),contextActions.getBrowserEngine&&(this.getBrowserEngineFn=contextActions.getBrowserEngine),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,this.executeToolFn=contextActions.executeTool,this.getCallableToolsFn=contextActions.getCallableTools??(()=>[]);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})}let registerVirtualModel=definition=>{providerActions?.registerVirtualModel?providerActions.registerVirtualModel(definition):this.modelRegistry.registerVirtualModel(definition)};for(let{definition,extensionPath}of this.runtime.pendingVirtualModelRegistrations)try{registerVirtualModel(definition)}catch(err2){this.emitError({extensionPath,event:"register_virtual_model",error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}this.runtime.pendingVirtualModelRegistrations=[],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)},this.runtime.registerVirtualModel=registerVirtualModel,this.runtime.unregisterVirtualModel=(provider,id)=>{providerActions?.unregisterVirtualModel?providerActions.unregisterVirtualModel(provider,id):this.modelRegistry.unregisterVirtualModel(provider,id)}}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,run2){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 run2().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:path15,resolvedPath})=>({path:path15,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)}emitBusEvent(channel,data){this.eventBus.emit(channel,data)}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):basename23(extensionPath).replace(/\.(?:c|m)?[jt]sx?$/,""));return boundedToolHookStatusMessage(`running ${extensionName}`)}emitToolHookLifecycleEvent(event){this.toolHookLifecycleObserver?.(event)}beginToolHookRun(baseContext,run2){let base={type:"tool_hook_status",hookRunId:`${run2.toolCallId}:${run2.hookName}:${this.nextToolHookRunIndex++}`,hookName:run2.hookName,toolName:run2.toolName,toolCallId:run2.toolCallId,extensionPath:run2.extensionPath,startedAt:Date.now()},statusMessage=this.getToolHookStatusMessage(run2.extensionPath,run2.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}}getMemoryReporters(){return this.extensions.flatMap(ext=>[...ext.memoryReporters??new Map].map(([name,reporter])=>({name,reporter})))}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 matches2=this.extensions.flatMap(extension=>{let handler=extension.rpcHandlers?.get(normalizedName);return handler===void 0?[]:[handler]});if(matches2.length===0)throw new Error(`Unknown extension RPC request: ${normalizedName}`);if(matches2.length>1)throw new Error(`Multiple extension RPC request handlers registered: ${normalizedName}`);let result3=await matches2[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 browserEngine(){return runner.assertActive(),runner.getBrowserEngineFn()},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()},get evalHandleHost(){return runner.assertActive(),runner.runtime.evalHandleHost},abort:source2=>{runner.assertActive(),runner.abortFn(source2)},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())}}createToolContext(toolCallId,signal,baseContext=this.createContext()){let runner=this;return Object.defineProperties(baseContext,{tools:{get(){return runner.assertActive(),runner.getCallableToolsFn()}},executeTool:{value:async(name,args,options={})=>(runner.assertActive(),runner.executeToolFn?runner.executeToolFn(toolCallId,name,args,{...options,signal:options.signal??signal}):{toolCall:{type:"toolCall",id:`${toolCallId}/0`,name,arguments:{}},result:{content:[{type:"text",text:"Nested tool calls are not available in this context"}],details:{}},isError:!0})}})}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}async emitBoundary(baseEvent,buildContext2){let ctx=this.createContext(),entries=[],shouldContinue=!1,context=await buildContext2(entries),valid3=!0;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,baseEvent.type))for(let handler of handlers){let event={...baseEvent,entries,continue:shouldContinue,context};try{let handlerResult=await handler(event,ctx);handlerResult?.entries!==void 0&&(entries=handlerResult.entries),handlerResult?.continue!==void 0&&(shouldContinue=handlerResult.continue)}catch(err2){this.emitError({extensionPath:ext.path,event:baseEvent.type,error:err2 instanceof Error?err2.message:String(err2),stack:err2 instanceof Error?err2.stack:void 0})}try{context=await buildContext2(entries),valid3=!0}catch(err2){valid3=!1,this.emitError({extensionPath:ext.path,event:baseEvent.type,error:`Invalid boundary entries: ${err2 instanceof Error?err2.message:String(err2)}`,stack:err2 instanceof Error?err2.stack:void 0})}}return valid3?{entries,continue:shouldContinue,context,valid:!0}:{entries:[],continue:!1,context,valid:!1}}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(resolve47=>{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(()=>resolve47(!0),budget.timeoutMs)),settled.then(()=>resolve47(!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}emit(event){return event.type==="session_start"?this.sessionStartTurns.dispatch(()=>this.dispatchEmit(event)):this.dispatchEmit(event)}async dispatchEmit(event){let result3,isSessionShutdown=event.type==="session_shutdown",shutdownBudget;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,event.type))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,handlers}of snapshotEventHandlers(this.extensions,"message_end"))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,handlers}of snapshotEventHandlers(this.extensions,"tool_result"))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,handlerResult.structuredContent===void 0&&delete currentEvent.structuredContent,modified=!0),handlerResult.details!==void 0&&(currentEvent.details=handlerResult.details,modified=!0),handlerResult.structuredContent!==void 0&&(currentEvent.structuredContent=handlerResult.structuredContent,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,structuredContent:currentEvent.structuredContent,isError:currentEvent.isError,usage:currentEvent.usage}}async emitToolCall(event){let result3;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"tool_call"))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,handlers}of snapshotEventHandlers(this.extensions,"user_bash"))for(let handler of handlers)try{let handlerResult=await handler(event,this.createContext());if(handlerResult===void 0)continue;if(!isUserBashEventResult(handlerResult))throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");return handlerResult}catch(err2){let message=err2 instanceof Error?err2.message:String(err2),stack=err2 instanceof Error?err2.stack:void 0;throw this.emitError({extensionPath:ext.path,event:"user_bash",error:message,stack}),err2}}async emitContext(messages,excludeExtensionPath){let contextHandlers=snapshotEventHandlers(this.extensions,"context"),contextWithSystemHandlers=snapshotEventHandlers(this.extensions,"context_with_system"),currentMessages=[contextHandlers,contextWithSystemHandlers].every(snapshot=>snapshot.every(({ext,handlers})=>ext.path===excludeExtensionPath||handlers.every(handler=>ext.nonMutatingContextHandlers?.has(handler)===!0)))?messages.slice():cloneJsonValue(messages).map((message,index)=>{let entryId=getSessionContextEntryId(messages[index]);return markTransientMessage(entryId?Object.assign(message,{[SESSION_CONTEXT_ENTRY_ID]:entryId}):message)});for(let{ext,handlers}of contextHandlers)if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hasSystemMessages=currentMessages.some(message=>message.role==="system"),visibleMessages=hasSystemMessages?currentMessages.filter(message=>message.role!=="system"):currentMessages,visibleSnapshot=visibleMessages.slice(),returned=(await handler({type:"context",messages:visibleMessages},this.createContext(ext.path)))?.messages??(sameMessages(visibleMessages,visibleSnapshot)?void 0:visibleMessages);if(!returned)continue;currentMessages=hasSystemMessages?restoreSystemMessages(currentMessages,visibleSnapshot,returned):returned}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})}for(let{ext,handlers}of contextWithSystemHandlers)if(ext.path!==excludeExtensionPath)for(let handler of handlers)try{let hadLeadingSystemMessage=currentMessages[0]?.role==="system";currentMessages=(await handler({type:"context_with_system",messages:currentMessages},this.createContext(ext.path)))?.messages??currentMessages,hadLeadingSystemMessage&&currentMessages[0]?.role!=="system"&&this.emitError({extensionPath:ext.path,event:"context_with_system",error:"Handler removed the leading system message; the request has no prompt or initial tool declarations. Keep it at index 0 or replace a dropped prefix with getCurrentSystemMessage()."})}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_with_system",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,handlers}of snapshotEventHandlers(this.extensions,"before_provider_request"))if(ext.path!==excludeExtensionPath)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,handlers}of snapshotEventHandlers(this.extensions,"before_provider_headers"))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,handlers}of snapshotEventHandlers(this.extensions,"before_agent_start"))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,handlers}of snapshotEventHandlers(this.extensions,"resources_discover"))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,source2,streamingBehavior,inputId="input"){let currentText=text2,currentImages=images;for(let{ext,handlers}of snapshotEventHandlers(this.extensions,"input"))for(let handler of handlers)try{let result3=await handler({type:"input",inputId,text:currentText,images:currentImages,source:source2,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{existsSync as existsSync33}from"node:fs";function getMissingSessionCwdIssue(sessionManager,fallbackCwd){let sessionFile=sessionManager.getSessionFile();if(!sessionFile)return;let sessionCwd=sessionManager.getCwd();if(!(!sessionCwd||existsSync33(sessionCwd)))return{sessionFile,sessionCwd,fallbackCwd}}function formatMissingSessionCwdError(issue){let sessionFile=issue.sessionFile?`
2482
2477
  Session file: ${issue.sessionFile}`:"";return`Stored session working directory does not exist: ${issue.sessionCwd}${sessionFile}
2483
2478
  Current working directory: ${issue.fallbackCwd}`}function formatMissingSessionCwdPrompt(issue){return`cwd from session file does not exist
2484
2479
  ${issue.sessionCwd}
@@ -2496,7 +2491,7 @@ $tree`;async function windowsBunChromeTree(){let stdout=await run("powershell.ex
2496
2491
  pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
2497
2492
  pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
2498
2493
 
2499
- Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync35}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join70}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync35(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir3(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join70(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync35(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join70(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync35(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host",SCHEDULE_COMMAND_ARGV="schedule";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-U4UWVUUX.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-U4UWVUUX.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-WVQZIVCM.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-5ILDFZVI.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-MGZLHARF.js");return await runScheduleCommand(args.slice(1))}import{access as access6,readFile as readFile20,stat as stat14}from"node:fs/promises";import{resolve as resolve41}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve41(resolveReadPath(fileArg,process.cwd()));try{await access6(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat14(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile20(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
2494
+ Auth commands require at least one of --provider or --model. Checks refresh expired OAuth credentials by default; --no-refresh prevents this. --credentials emits the credential, or includes it in JSON output.`)}function parseAuthCommand(args){if(args[0]!=="auth")return;let kind=args[1]==="check"?"check":args[1]==="print-api-key"?"api_key":args[1]==="print-bearer-token"?"bearer_token":void 0;if(!kind)throw new AuthCommandError(`Unknown auth command "${args[1]??""}". Use "${APP_NAME} auth print-api-key", "${APP_NAME} auth print-bearer-token", or "${APP_NAME} auth check".`);let commandArgs=[],json=!1,credentials=!1,noRefresh=!1,minExpiryMs;for(let index=2;index<args.length;index++){let arg=args[index];if(arg==="--min-expiry"){if(kind!=="bearer_token")throw new AuthCommandError("--min-expiry is only supported by print-bearer-token");let value2=args[++index],match=value2?/^(\d+)(ms|s|m|h)$/iu.exec(value2):void 0;if(!match)throw new AuthCommandError("--min-expiry must use a duration such as 30m or 1h");let amount=Number(match[1]),unit=match[2];minExpiryMs=amount*(unit==="ms"?1:unit==="s"?1e3:unit==="m"?6e4:36e5);continue}if(arg==="--json"||arg==="--credentials"||arg==="--no-refresh"){if(kind!=="check")throw new AuthCommandError(`${arg} is only supported by auth check`);arg==="--json"?json=!0:arg==="--credentials"?credentials=!0:noRefresh=!0;continue}commandArgs.push(arg)}return minExpiryMs===void 0?{kind,args:commandArgs,json,credentials,noRefresh}:{kind,args:commandArgs,json,credentials,noRefresh,minExpiryMs}}function validateAuthCommandArgs(args,kind){let provider=args.provider?.trim()||void 0,model=args.model?.trim()||void 0;if(args.unknownFlags.size>0){let option=args.unknownFlags.keys().next().value;throw new AuthCommandError(`Unknown option --${option} for "${getAuthCommandName(kind)}".`)}if(args.apiKey!==void 0||args.messages.length>0||args.fileArgs.length>0)throw new AuthCommandError("Auth commands only accept --provider and --model");if(kind==="check"){if(!provider&&!model)throw new AuthCommandError("Auth checks require --provider <provider> or --model <model>");return{provider,model}}if(!provider&&!model)throw new AuthCommandError("Credential printing requires --provider <provider> or --model <model>");return{provider,model}}function getAuthCredential(auth){if(auth?.auth.apiKey)return auth.auth.apiKey;let authorization=Object.entries(auth?.auth.headers??{}).find(([name])=>name.toLowerCase()==="authorization")?.[1];return typeof authorization=="string"?/^Bearer\s+(.+)$/iu.exec(authorization)?.[1]:void 0}async function checkProviderAuth(args,modelRuntime,options={refresh:!1}){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,"check"),provider=cliProvider;if(cliModel){let resolved=resolveCliModel({cliProvider,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??`Unable to resolve model "${cliModel}"`);provider=resolved.model.provider}if(!provider)throw new AuthCommandError("Unable to resolve an auth provider");if(modelRuntime.getError())return{status:"invalid",provider,reason:"invalid_state"};if(!modelRuntime.getProvider(provider))return{status:"not_ready",provider,reason:"provider_not_found"};try{let auth=await modelRuntime.checkAuth(provider);return auth?options.refresh&&!await modelRuntime.getAuth(provider)?{status:"not_ready",provider,reason:"credentials_not_configured"}:{status:"ready",provider,authType:auth.type}:{status:"not_ready",provider,reason:"credentials_not_configured"}}catch{return{status:"invalid",provider,reason:"invalid_state"}}}async function getProviderCredential(providerId,modelRuntime,credentials,options){let credential=await credentials.read(providerId);return!options.refresh&&credential?.type==="oauth"?credential.access:getAuthCredential(await modelRuntime.getAuth(providerId))}async function createAuthCheckModelRuntime(credentials){return ModelRuntime.create({credentials,modelsStore:new InMemoryCodingAgentModelsStore,allowModelNetwork:!1,refreshOnCreate:!1})}import{existsSync as existsSync35}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join70}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync35(session.cwd)?!1:compareRepositoryIdentities(session.repositoryIdentity,current)==="same"}function newestFirst(a,b){return b.modified.getTime()-a.modified.getTime()}async function recordedCwd(dir){let names=(await readdir3(dir)).filter(name=>name.endsWith(".jsonl"));for(let name of names){let firstLine2;try{await readFileLines(join70(dir,name),line=>(firstLine2=line,!1));let header2=JSON.parse(firstLine2??"");if(typeof header2=="object"&&header2!==null&&"cwd"in header2&&typeof header2.cwd=="string")return header2.cwd}catch(error2){if(!(error2 instanceof Error))throw error2}}}async function sessionsAtVanishedPaths(cwd){let root=getSessionsDir();if(!existsSync35(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join70(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync35(recorded)||sessions2.push(...await listSessionsFromDir(dir))}return sessions2}async function listMovedSessions(cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[]:(options.sessionDir?await listSessionsFromDir(normalizePath(options.sessionDir)):await sessionsAtVanishedPaths(here)).filter(session=>isMoved(session,here,current)).map(session=>({...session,moved:!0})).sort(newestFirst)}async function markMovedSessions(sessions2,cwd,options={}){let here=resolvePath(cwd),current=await(options.readIdentity??readRepositoryIdentity)(here);return current===void 0?[...sessions2]:sessions2.map(session=>isMoved(session,here,current)?{...session,moved:!0}:session)}async function withMovedSessions(local,cwd,options={}){let[own,moved]=await Promise.all([local,listMovedSessions(cwd,options)]);return[...own,...moved].sort(newestFirst)}var FORK_PROMPT="Fork this session into current directory?",REBIND_PROMPT="Move this session here and continue it?";async function chooseCrossProjectAction(choice){let{sessionArg,sessionCwd,cwd,match}=choice,rebindHint=`If this directory is the same repository moved from ${sessionCwd}, use --rebind '${sessionArg}' to move the session here.`;return choice.interactive?(choice.out(source_default.yellow(`Session found in different project: ${sessionCwd}`)),match==="same"?await confirmSameRepositoryRebind(choice)?"rebind":"abort":(match==="unknown"&&choice.out(source_default.dim(rebindHint)),await choice.confirm(FORK_PROMPT)?"fork":"abort")):(choice.err(source_default.red(`Session found in different project: ${sessionCwd}`)),match==="same"?(choice.err(source_default.red(`${cwd} is the same git repository. Cannot confirm without an interactive session. Use --rebind '${sessionArg}' to move the session here, or --fork '${sessionArg}' to copy it into a new session.`)),"fail"):(choice.err(source_default.red(`Cannot confirm forking without an interactive session. Use --fork '${sessionArg}' to fork it into the current directory, or re-run interactively from ${sessionCwd}.`)),match==="unknown"&&choice.err(source_default.red(rebindHint)),"fail"))}async function confirmSameRepositoryRebind(choice){return choice.out(source_default.yellow(`This directory is the same git repository: ${choice.cwd}`)),choice.out(source_default.dim(`To copy it into a new session instead, use --fork '${choice.sessionArg}'.`)),choice.confirm(REBIND_PROMPT)}async function movedSessionToContinue(choice){let[newest]=await listMovedSessions(choice.cwd,choice);if(newest===void 0)return;if(!choice.interactive){choice.err(source_default.yellow(`A session of this repository was recorded at ${newest.cwd} before it moved. Use --rebind '${newest.id}' to continue it here.`));return}return choice.out(source_default.yellow(`Session found in different project: ${newest.cwd}`)),await confirmSameRepositoryRebind({sessionArg:newest.id,cwd:choice.cwd,confirm:choice.confirm,out:choice.out})?newest.path:void 0}var DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS=30*6e4;async function resolveCredentialForPrint(args,modelRuntime,kind,minExpiryMs,signal){let{provider:cliProvider,model:cliModel}=validateAuthCommandArgs(args,kind),credentialTypes=new Map((await modelRuntime.listCredentials({signal})).map(credential=>[credential.providerId,credential.type])),providers=[];if(cliProvider){let provider=modelRuntime.getProvider(cliProvider);if(!provider)throw new AuthCommandError(`Unknown provider "${cliProvider}". Use --list-models to see available providers.`);if(cliModel){let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});if(resolved.error||!resolved.model)throw new AuthCommandError(resolved.error??"Unable to resolve the requested provider/model");providers.push({id:provider.id,model:resolved.model})}else providers.push({id:provider.id})}else{for(let provider of modelRuntime.getProviders()){if(!credentialTypes.has(provider.id))continue;let resolved=resolveCliModel({cliProvider:provider.id,cliModel,modelRuntime});resolved.model&&!resolved.error&&!resolved.warning?.includes("Using custom model id")&&providers.push({id:provider.id,model:resolved.model})}if(providers.length===0)throw new AuthCommandError(`Model "${cliModel}" not found. Use --list-models to see available models.`)}let credentials=[];for(let provider of providers){let type2=credentialTypes.get(provider.id);if(kind==="api_key"&&type2==="oauth"||kind==="bearer_token"&&type2!=="oauth")continue;let authOptions={...kind==="bearer_token"?{minOAuthValidityMs:minExpiryMs??DEFAULT_BEARER_TOKEN_MIN_EXPIRY_MS}:{},signal},auth=provider.model?await modelRuntime.getAuth(provider.model,authOptions):await modelRuntime.getAuth(provider.id,authOptions),value2=getAuthCredential(auth);value2&&credentials.push({providerId:provider.id,value:value2})}if(credentials.length===1)return credentials[0].value;if(credentials.length===0){let providerId=providers[0]?.id,type2=providerId?credentialTypes.get(providerId):void 0;throw cliProvider&&kind==="api_key"&&type2==="oauth"?new AuthCommandError(`Provider "${providerId}" is configured with OAuth, not an API key`):cliProvider&&kind==="bearer_token"&&type2!=="oauth"?new AuthCommandError(`Provider "${providerId}" is not configured with an OAuth bearer token`):new AuthCommandError(`No usable ${kind==="api_key"?"API key":"OAuth bearer token"} is configured`)}throw new AuthCommandError(`Multiple configured providers matched (${credentials.map(({providerId})=>providerId).join(", ")}). Specify --provider.`)}var PACKAGE_COMMAND_ARGV={install:!0,remove:!0,update:!0,list:!0},PACKAGE_COMMAND_ALIAS="uninstall",CONFIG_COMMAND_ARGV="config",APP_SERVER_COMMAND_ARGV="app-server",HOST_COMMAND_ARGV="host",SCHEDULE_COMMAND_ARGV="schedule";function isPackageCommandArgv(args){let command=args[0]??"";return Object.hasOwn(PACKAGE_COMMAND_ARGV,command)||command===PACKAGE_COMMAND_ALIAS}async function dispatchPackageCommand(args,runtimeOptions={}){if(!isPackageCommandArgv(args))return!1;let{handlePackageCommand}=await import("./package-manager-cli-FVEIJBD5.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-FVEIJBD5.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-2ZXLBILW.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-MWQNTWFA.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-MGZLHARF.js");return await runScheduleCommand(args.slice(1))}import{access as access6,readFile as readFile20,stat as stat14}from"node:fs/promises";import{resolve as resolve41}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve41(resolveReadPath(fileArg,process.cwd()));try{await access6(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat14(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile20(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
2500
2495
  `;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(`
2501
2496
  `)}</file>
2502
2497
  `:text2+=`<file name="${absolutePath}"></file>
@@ -2558,8 +2553,8 @@ Press any key to continue...`)),await new Promise(resolve47=>{process.stdin.setR
2558
2553
  `))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync45}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync45(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat15=linuxStat(pid),tail=stat15?.slice(stat15.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat15=linuxStat(pid),open9=stat15?.indexOf("(")??-1,close=stat15?.lastIndexOf(")")??-1;return stat15===void 0||open9===-1||close<=open9?"":stat15.slice(open9+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-B24G65GD.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID12}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync44,mkdirSync as mkdirSync25,renameSync as renameSync18,rmSync as rmSync15}from"node:fs";import{basename as basename27,dirname as dirname46,join as join82,relative as relative20,resolve as resolve43,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path15){return toNamespacedPath(resolve43(path15))}function getQuarantineRoot(packageDir){let current=resolve43(packageDir);for(;;){if(basename27(current).toLowerCase()==="node_modules")return join82(current,QUARANTINE_DIR_NAME);let parent=dirname46(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync15(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=join82(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync44(loadedFile))continue;let quarantinePath=join82(quarantineRunDir,relative20(resolvedPackageDir,loadedFile));mkdirSync25(dirname46(quarantinePath),{recursive:!0}),renameSync18(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;async function readPipedStdin(){if(!process.stdin.isTTY)return new Promise(resolve47=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve47(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path15,error:error2})=>({type:"warning",message:`Failed to load extension "${path15}": ${error2}`}))}function reportDiagnostics(diagnostics){for(let diagnostic2 of diagnostics){let color=diagnostic2.type==="error"?source_default.red:diagnostic2.type==="warning"?source_default.yellow:source_default.dim,prefix=diagnostic2.type==="error"?"Error: ":diagnostic2.type==="warning"?"Warning: ":"";console.error(color(`${prefix}${diagnostic2.message}`))}}function isTruthyEnvFlag2(value2){return value2?value2==="1"||value2.toLowerCase()==="true"||value2.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode===void 0&&parsed.messages[0]==="app-server"?"app-server":parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}function toProjectTrustMode(appMode){return appMode==="app-server"?"print":appMode}function resolveAutoTitleSessions(appMode,parsed,hasContextMessages,clientCapabilities=parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),sessionAutoTitle){return hasContextMessages?!1:sessionAutoTitle!==void 0?sessionAutoTitle:appMode==="interactive"||parsed.autoTitleSessions===!0||appMode==="rpc"&&clientCapabilities.includes(AUTO_TITLE_SESSIONS_CAPABILITY)}function isPlainRuntimeMetadataCommand(parsed){return!parsed.print&&parsed.mode===void 0&&(parsed.help===!0||parsed.listModels!==void 0||parsed.listTips===!0)}async function runAuthCommand(args){if(isAuthCommandHelp(args))return printAuthCommandHelp(),!0;let command;try{command=parseAuthCommand(args)}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to parse auth command";return console.error(source_default.red(`Error: ${message}`)),process.exitCode=1,!0}if(!command)return!1;let parsed=parseArgs(command.args);if(parsed.unknownFlags.size>0){let option=parsed.unknownFlags.keys().next().value;return console.error(source_default.red(`Unknown option --${option} for "${getAuthCommandName(command.kind)}".`)),console.error(source_default.dim(`Use "${APP_NAME} --help" or "${getAuthCommandUsage(command.kind)}".`)),process.exitCode=1,!0}try{if(parsed.diagnostics.length>0)throw new AuthCommandError(parsed.diagnostics.map(diagnostic2=>diagnostic2.message).join(`
2559
2554
  `));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}
2560
2555
  `),!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}
2561
- `),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(resolve47=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve47(result3))};rl.question(`${message} [y/N] `,answer2=>{let normalized2=answer2.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path15,sessionDir){try{return SessionManager.open(path15,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-LIZG5P3Q.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync45(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;await exitAfterOutput("",exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&await exitAfterOutput("",hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&await exitAfterOutput("",scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&await printThenExit(()=>console.log(DISPLAY_VERSION),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)}await printThenExit(()=>console.log(`Exported to: ${result3}`),0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),await printThenExit(()=>{printHelp(flags2),printTimings()},0)}if(parsed.listTips){let{listTips}=await import("./list-tips-WE2YGQM6.js");await printThenExit(listTips,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 printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-AL2DTLN2.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join83(agentDir,"auth.json")),authPath:join83(agentDir,"auth.json"),agentDir,modelsPath:join83(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&await printThenExit(()=>printHelp(extensionFlags),0),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics);let startupThinkingClamp=runtime.session.startupThinkingClamp;appMode!=="interactive"&&startupThinkingClamp&&reportDiagnostics([{type:"warning",message:formatThinkingClampWarning(startupThinkingClamp)}]),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2562
- `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-MXEWGXIB.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-ZKESRBOA.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve47=>setTimeout(resolve47,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve47=>process.stdout.once("drain",resolve47)),process.stderr.writableLength>0&&await new Promise(resolve47=>process.stderr.once("drain",resolve47)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4,PROMPT_AFTER_QUEUED_DEADLINE_MS=5*6e4;function promptStalledMessage(){return`prompt was received by the host but not accepted within ${PROMPT_AFTER_QUEUED_DEADLINE_MS/6e4} minutes`}function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve47=>setTimeout(resolve47,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve47=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve47()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve47()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve47,reject)=>{let onConnect=()=>{cleanup(),resolve47()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{this.getData(await this.send({type:"close_session",sessionId},!1))}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new RpcCommandError(failure2.error,failure2.errorCode,failure2.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async setRetryFallback(retryFallback){await this.send({type:"set_retry_fallback",retryFallback})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path15){await this.send({type:"cleanup_bash_output",path:path15})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve47,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve47())})})}collectEvents(timeout=6e4){return new Promise((resolve47,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve47(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve47,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,promptReceived=!1,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve47(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>compacting?deadline.extend(PROMPT_COMPACTION_DEADLINE_MS,timeoutMessage):promptReceived?deadline.extend(PROMPT_AFTER_QUEUED_DEADLINE_MS,promptStalledMessage):deadline.extend(REQUEST_DEADLINE_MS,timeoutMessage),onQueued:()=>{promptReceived=!0,this.isCompacting()||deadline.extend(PROMPT_AFTER_QUEUED_DEADLINE_MS,promptStalledMessage)}}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2556
+ `),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(resolve47=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve47(result3))};rl.question(`${message} [y/N] `,answer2=>{let normalized2=answer2.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path15,sessionDir){try{return SessionManager.open(path15,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-UUSW6YSU.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync45(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;await exitAfterOutput("",exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&await exitAfterOutput("",hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&await exitAfterOutput("",scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&await printThenExit(()=>console.log(DISPLAY_VERSION),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)}await printThenExit(()=>console.log(`Exported to: ${result3}`),0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),await printThenExit(()=>{printHelp(flags2),printTimings()},0)}if(parsed.listTips){let{listTips}=await import("./list-tips-WE2YGQM6.js");await printThenExit(listTips,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 printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-S37LFCMH.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join83(agentDir,"auth.json")),authPath:join83(agentDir,"auth.json"),agentDir,modelsPath:join83(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&await printThenExit(()=>printHelp(extensionFlags),0),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics);let startupThinkingClamp=runtime.session.startupThinkingClamp;appMode!=="interactive"&&startupThinkingClamp&&reportDiagnostics([{type:"warning",message:formatThinkingClampWarning(startupThinkingClamp)}]),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2557
+ `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-KJFVBWIP.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-ERBFHQQJ.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve47=>setTimeout(resolve47,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve47=>process.stdout.once("drain",resolve47)),process.stderr.writableLength>0&&await new Promise(resolve47=>process.stderr.once("drain",resolve47)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4,PROMPT_AFTER_QUEUED_DEADLINE_MS=5*6e4;function promptStalledMessage(){return`prompt was received by the host but not accepted within ${PROMPT_AFTER_QUEUED_DEADLINE_MS/6e4} minutes`}function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve47=>setTimeout(resolve47,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve47=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve47()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve47()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve47,reject)=>{let onConnect=()=>{cleanup(),resolve47()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{this.getData(await this.send({type:"close_session",sessionId},!1))}catch(error2){if(!isTransportGoneError(error2))throw error2}this.sessionId===sessionId&&(this.sessionId=void 0,this.compactions.clear())}}async listSessions(){let response=await this.send({type:"list_sessions"},!1);return this.getData(response).sessions}async prompt(message,optionsOrImages){let options=Array.isArray(optionsOrImages)?{images:optionsOrImages}:optionsOrImages??{},response=await this.send({type:"prompt",message,...clientMessageIdentity(options),...options.images?{images:options.images}:{},...options.streamingBehavior?{streamingBehavior:options.streamingBehavior}:{},...options.thinkingLevel?{thinkingLevel:options.thinkingLevel}:{},...options.sessionTitlePrompt!==void 0?{sessionTitlePrompt:options.sessionTitlePrompt}:{},...options.expandPromptTemplates!==void 0?{expandPromptTemplates:options.expandPromptTemplates}:{},...options.unknownCommandAsText?{unknownCommandAsText:!0}:{}},!0,{onResponse:wireResponse=>{if(!wireResponse.success){options?.preflightResult?.(!1);return}let data=wireResponse.data;options?.promptDisposition?.(data?.disposition??"handled"),options?.preflightResult?.(!0)},onReject:()=>{options?.preflightResult?.(!1)}});if(!response.success){let failure2=response;throw(failure2.errorCode===RPC_ERROR_UNKNOWN_COMMAND?unknownCommandErrorFromWire(failure2.errorData):void 0)??new RpcCommandError(failure2.error,failure2.errorCode,failure2.errorData)}return response.data?.disposition??"handled"}async appendUserMessage(content){await this.send({type:"append_user_message",content})}async appendSessionEntry(entry){await this.send({type:"append_session_entry",entry})}async sendCustomMessage(message,options){await this.send({type:"send_custom_message",...message,...options})}async continueFromLeaf(){let response=await this.send({type:"continue_from_leaf"});this.getData(response)}async steer(message,images,recovery){let response=await this.send({type:"steer",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async followUp(message,images,recovery){let response=await this.send({type:"follow_up",message,images,enqueueOrder:recovery?.enqueueOrder,...clientMessageIdentity(recovery)});return this.getData(response)?.disposition??"handled"}async abort(){try{await this.send({type:"abort"})}catch(error2){if(!isTransportGoneError(error2))throw error2}}async abortCompaction(){await this.send({type:"abort_compaction"})}async reload(){let response=await this.send({type:"reload"});return this.getData(response)}async checkReloadVeto(){let response=await this.send({type:"check_reload_veto"});return this.getData(response)}async clearQueue(options){let response=await this.send({type:"clear_queue",abortWillFollow:options?.abortWillFollow});return this.getData(response)}async getSteeringMessages(){let response=await this.send({type:"get_steering_messages"});return this.getData(response).messages}async getFollowUpMessages(){let response=await this.send({type:"get_follow_up_messages"});return this.getData(response).messages}async abortBranchSummary(){await this.send({type:"abort_branch_summary"})}async recordBashResult(command,result3,excludeFromContext){await this.send({type:"record_bash_result",command,result:result3,excludeFromContext})}async setLabel(entryId,label3){await this.send({type:"set_label",entryId,label:label3})}async newSession(parentSession){let response=await this.send({type:"new_session",parentSession});return this.getData(response)}async getState(){let response=await this.send({type:"get_state"});return this.getData(response)}async setModel(provider,modelId){let response=await this.send({type:"set_model",provider,modelId});return this.getData(response)}async setFavoriteModels(models){await this.send({type:"set_favorite_models",models})}async setScopedModels(models){await this.send({type:"set_scoped_models",models})}async cycleModel(direction="forward"){let response=await this.send({type:"cycle_model",direction});return this.getData(response)}async getAvailableModels(){let response=await this.send({type:"get_available_models"});return this.getData(response).models}async setThinkingLevel(level,options){let response=await this.send({type:"set_thinking_level",level,scope:options?.scope});if(!response.success)throw new Error(response.error)}async cycleThinkingLevel(){let response=await this.send({type:"cycle_thinking_level"});return this.getData(response)}async getAvailableThinkingLevels(){let response=await this.send({type:"get_available_thinking_levels"});return this.getData(response).levels}async setFastMode(enabled){let response=await this.send({type:"set_fast_mode",enabled});return this.getData(response)}async getFastMode(){let response=await this.send({type:"get_fast_mode"});return this.getData(response)}async setSteeringMode(mode){await this.send({type:"set_steering_mode",mode})}async setFollowUpMode(mode){await this.send({type:"set_follow_up_mode",mode})}async compact(customInstructions){let response=await this.send({type:"compact",customInstructions});return this.getData(response)}async setAutoCompaction(enabled){await this.send({type:"set_auto_compaction",enabled})}async setAutoRetry(enabled){await this.send({type:"set_auto_retry",enabled})}async abortRetry(){await this.send({type:"abort_retry"})}async setRetryFallback(retryFallback){await this.send({type:"set_retry_fallback",retryFallback})}async bash(command,options){let response=await this.send({type:"bash",command,excludeFromContext:options?.excludeFromContext,executionId:options?.executionId,operations:options?.operations});return this.getData(response)}async navigateTree(targetId,options){let response=await this.send({type:"navigate_tree",targetId,...options});return this.getData(response)}async abortBash(){await this.send({type:"abort_bash"})}async cleanupBashOutput(path15){await this.send({type:"cleanup_bash_output",path:path15})}async getSessionStats(){let response=await this.send({type:"get_session_stats"});return this.getData(response)}async exportHtml(outputPath,themeName){let response=await this.send({type:"export_html",outputPath,themeName});return this.getData(response)}async exportJsonl(outputPath){let response=await this.send({type:"export_jsonl",outputPath});return this.getData(response)}async switchSession(sessionPath,options){let response=await this.send({type:"switch_session",sessionPath,cwdOverride:options?.cwdOverride});return this.getData(response)}async fork(entryId,options){let response=await this.send({type:"fork",entryId,position:options?.position});return this.getData(response)}async clone(){let response=await this.send({type:"clone"});return this.getData(response)}async getForkMessages(){let response=await this.send({type:"get_fork_messages"});return this.getData(response).messages}async getEntries(since){let response=await this.send({type:"get_entries",since});return this.getData(response)}async getTree(){let response=await this.send({type:"get_tree"});return this.getData(response)}async editAssistantMessage(entryId,text2,options={}){let response=await this.send({type:"edit_assistant_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async editUserMessage(entryId,text2,options={}){let response=await this.send({type:"edit_user_message",entryId,text:text2,expectedLeafId:options.expectedLeafId,summarize:options.summarize,customInstructions:options.customInstructions});return this.getData(response)}async getLastAssistantText(){let response=await this.send({type:"get_last_assistant_text"});return this.getData(response).text}async setSessionName(name){await this.send({type:"set_session_name",name})}async importJsonl(inputPath,cwdOverride){let response=await this.send({type:"import_jsonl",inputPath,cwdOverride});return this.getData(response)}async getMessages(){let response=await this.send({type:"get_messages"});return this.getData(response).messages}async getMedia(toolCallId,contentIndex){let response=await this.send({type:"get_media",toolCallId,contentIndex});return this.getData(response).content}async getCommands(){let response=await this.send({type:"get_commands"});return this.getData(response).commands}async requestExtension(name,data){let response=await this.send({type:"extension_request",name,...data===void 0?{}:{data}});return this.getData(response)}async getProviderAccounts(provider){let response=await this.send({type:"get_provider_accounts",provider});return this.getData(response).accounts}async pinProviderAccount(provider,name){await this.send({type:"account_pin",provider,name})}async removeProviderAccount(provider,name){await this.send({type:"account_remove",provider,name})}waitForIdle(timeout=6e4){return new Promise((resolve47,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve47())})})}collectEvents(timeout=6e4){return new Promise((resolve47,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve47(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve47,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,promptReceived=!1,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve47(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>compacting?deadline.extend(PROMPT_COMPACTION_DEADLINE_MS,timeoutMessage):promptReceived?deadline.extend(PROMPT_AFTER_QUEUED_DEADLINE_MS,promptStalledMessage):deadline.extend(REQUEST_DEADLINE_MS,timeoutMessage),onQueued:()=>{promptReceived=!0,this.isCompacting()||deadline.extend(PROMPT_AFTER_QUEUED_DEADLINE_MS,promptStalledMessage)}}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2563
2558
 
2564
2559
  `),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
2565
2560
 
@@ -2619,7 +2614,7 @@ Rules:
2619
2614
  - Do not include quotes, punctuation at the end, markdown, or explanations.
2620
2615
  - If the input is only a greeting, acknowledgement, or too vague to title, return <title>none</title>.
2621
2616
  - Respond only as <title>Session Title</title>.`,LOW_SIGNAL_PROMPTS=new Set(["hi","hello","hey","yo","thanks","thank you","ok","okay","k","yes","no","yep","nope"]),TITLE_MAX_TOKENS=64,REASONING_TITLE_MAX_TOKENS=1024,MAX_TITLE_RETRIES=1,MAX_TITLE_RETRY_DELAY_MS=2e3;function sessionTitleRetryPolicy(settings){return{enabled:settings.enabled,maxRetries:Math.min(settings.maxRetries,MAX_TITLE_RETRIES),baseDelayMs:Math.min(settings.baseDelayMs,MAX_TITLE_RETRY_DELAY_MS)}}function shouldSkipSessionTitle(text2){let normalized2=text2.replace(/\s+/g," ").trim().toLowerCase();return normalized2.length===0||normalized2.startsWith("/")?!0:LOW_SIGNAL_PROMPTS.has(normalized2)}async function generateSessionTitle(options){if(shouldSkipSessionTitle(options.firstPrompt))return;let reasoning=initialTitleReasoning(options.model),response=await requestTitle(options,reasoning),retryReasoning=response.stopReason==="error"?mandatoryReasoningRetryLevel(options.model,reasoning,response.errorMessage):void 0;if(retryReasoning!==void 0&&(response=await requestTitle(options,retryReasoning)),response.stopReason==="error")throw new Error(humanizeProviderError(response.errorMessage??"Session title generation failed"));return parseSessionTitle(response)}function requestTitle(options,reasoning){return retryAssistantCall(()=>completeTitle(options.model,buildTitleContext(options.firstPrompt),buildTitleOptions(options,reasoning),options.streamFn),options.retry,options.signal)}function buildTitleContext(firstPrompt){return{systemPrompt:TITLE_SYSTEM_PROMPT,messages:[{role:"user",content:[{type:"text",text:firstPrompt}],timestamp:Date.now()}]}}function buildTitleOptions(options,reasoning){let titleOptions={...options.baseOptions,sessionId:options.sessionId,cacheRetention:options.model.cacheRetention==="none"?"none":"short",maxTokens:reasoning===void 0?TITLE_MAX_TOKENS:REASONING_TITLE_MAX_TOKENS};return reasoning!==void 0&&(titleOptions.reasoning=reasoning),options.auth.apiKey!==void 0&&(titleOptions.apiKey=options.auth.apiKey),options.auth.headers!==void 0&&(titleOptions.headers=options.auth.headers),options.auth.extraBody!==void 0&&(titleOptions.extraBody=options.auth.extraBody),options.auth.env!==void 0&&(titleOptions.env=options.auth.env),options.signal!==void 0&&(titleOptions.signal=options.signal),titleOptions}async function completeTitle(model,context,options,streamFn){return streamFn===void 0?completeSimple(model,context,options):(await streamFn(model,normalizeContext(context),options)).result()}function parseSessionTitle(message){let rawTitle=message.content.filter(part=>part.type==="text").map(part=>part.text).join("").trim().match(/<title>\s*([\s\S]*?)\s*<\/title>/i)?.[1];if(rawTitle===void 0)return;let title=sanitizeTitle(rawTitle);if(!(!title||title.toLowerCase()==="none"))return title}function humanizeProviderError(raw){let statusPrefix=raw.trim().match(/^(?:.*?\((\d{3})\)|(\d{3}))\s*:\s*(?=\{)/),status=statusPrefix?.[1]??statusPrefix?.[2],bodyText=statusPrefix?raw.trim().slice(statusPrefix[0].length):raw.trim();if(!bodyText.startsWith("{"))return raw;let parsed;try{parsed=JSON.parse(bodyText)}catch{return raw}let body=asRecord3(parsed);if(!body)return raw;let nested=asRecord3(body.error),message=asNonEmptyString(nested?.message)??asNonEmptyString(body.message)??asNonEmptyString(body.error);if(message===void 0)return raw;let details=[],errorType=asNonEmptyString(nested?.type)??asNonEmptyString(body.type);errorType&&errorType!=="error"&&details.push(errorType),status&&details.push(`HTTP ${status}`);let requestId=asNonEmptyString(body.request_id);return requestId&&details.push(`request ${requestId}`),details.length>0?`${message} (${details.join(", ")})`:message}function asRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function asNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function sanitizeTitle(text2){return text2.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g,"").replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\u001b[\u0020-\u002f]*[\u0030-\u007e]/g,"").replace(/[\r\n]+/g," ").replace(/[\u0000-\u001f\u007f-\u009f]+/g," ").replace(/\s+/g," ").replace(/^["'`]+|["'`.!?]+$/g,"").trim().slice(0,80).trim()}function yieldToEventLoop(){return new Promise(resolve47=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve47()},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(resolve47=>{resolveWork=resolve47}),!resolveWork)throw new Error("Session work resolver was not initialized");this.activeWorkResolve=resolveWork}this.activeWorkDepth++;let finished=!1;return()=>{if(finished||(finished=!0,this.activeWorkDepth=Math.max(0,this.activeWorkDepth-1),this.activeWorkDepth>0))return;let resolveWork=this.activeWorkResolve;this.activeWork=void 0,this.activeWorkResolve=void 0,resolveWork?.()}}async waitForSettled(getEventQueue){for(let round=0;;round++){let eventQueue=getEventQueue(),work=this.activeWork;if(await eventQueue,work&&await work,getEventQueue()===eventQueue&&!this.activeWork)return;round>=16&&await yieldToEventLoop()}}};function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve47){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve47(requested)}}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};function userTextContent(text2,textBlocks){return textBlocks!==void 0&&textBlocks.length>1&&textBlocks.join(`
2622
- `)===text2?textBlocks.map(block=>({type:"text",text:block})):[{type:"text",text:text2}]}function keepsTextBlocksVerbatim(textBlocks){return textBlocks!==void 0&&textBlocks.length>1&&parseAskUserAnswerFrame(textBlocks[0]??"")!==void 0}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},REQUIRED_COMPACTION_ERROR_MESSAGE="Context remains above the compaction threshold because compaction did not complete",RequiredCompactionError=class extends Error{constructor(){super(REQUIRED_COMPACTION_ERROR_MESSAGE),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`The retried request never started streaming${retryTimeoutMs===void 0?"":` after ${Math.round(retryTimeoutMs/1e3)}s`}.`+(streamStartTimeoutMs===void 0?" (Its stream-start guard is off; to bound or extend this wait, set retry.provider.streamStartTimeoutMs, 0 disables.)":` (Stream-start guard: ${Math.round(streamStartTimeoutMs/1e3)}s; to allow longer, raise retry.provider.streamStartTimeoutMs, 0 disables.)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._unregisterMemoryReport=()=>{},this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._sessionStartDispatching=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._providerRequiredNoticed=!1,this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._shownThinkingClampWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled)},this._promptSurface=config.promptSurface,this._browserEngine=config.browserEngine,this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})}),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,origin:{source:reason},emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},isCandidateRefusal:error2=>error2 instanceof ModelUsabilityBudgetError,emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal,callbacks){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};return retryTransientCall(()=>this._resolveSummarizationRequestAuth(model,thinkingLevel,signal),isOAuthRefreshUnavailableError,this.settingsManager.getRetrySettings(),signal,callbacks??this._summarizationRetryCallbacks({source:"branchSummary"}))}async _resolveSummarizationRequestAuth(model,thinkingLevel,signal){if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted||isOAuthRefreshUnavailableError(error2))throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model,signal,callbacks){return{...await this._getSummarizationRequestAuth(model,signal,callbacks),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id,void 0,void 0,void 0,{origin:{source:"restore"},duringTurn:!1})}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state});if(route.state!==void 0&&route.state!==state){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID13(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage,provider:message.provider,model:message.model})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve47=>{this._resolveIdleWait=resolve47})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve47=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve47()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim2=>claim2.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.releaseSettledSessionMemory(),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve47=>{this._retryResolve=resolve47}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendOwnedMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage8),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage8}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage8}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed"),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unregisterMemoryReport(),this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}refreshContext(){this._refreshFinalizedContext()}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get startupThinkingClamp(){return this._startupThinkingClamp}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._currentServiceTier!=="ultrafast"&&(this._sessionFastMode||this._currentServiceTier==="priority")}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get routedModel(){if(!this.model||!isVirtualModel(this.model))return;let latest=findLatestResponse(this.agent.state.messages),model=latest&&this._modelRuntime.getPhysicalModel(latest.provider,latest.model);return model&&{model,thinkingLevel:latest?.thinkingLevel}}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}setPromptSurface(surface){let current=this._baseSystemPromptOptions.surface;this._promptSurface=surface,current!==surface&&(this._systemPromptOverride=void 0,this._applyToolDeclarations(this.getActiveToolNames()))}setBrowserEngine(engine){this._browserEngine=engine}get browserEngine(){return this._browserEngine}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCallableToolNames(){return this._getCallableTools().map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,...definition.namespace?{namespace:definition.namespace}:{},...definition.annotations?{annotations:{...definition.annotations}}:{},sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID13()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){return this._toolSearchService?.getCatalog().map(doc=>doc.name)??[]}_activateLazyTool(toolName){return this._lazyToolActivation.activate(toolName)}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&this._getToolExposure(name)!=="hidden"&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}setControlEndpointHost(host){this._controlEndpointHost=host}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name));this._promptToolNames=validToolNames;let withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,surface:this._promptSurface??resolvePromptSurface(process.env),customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
2617
+ `)===text2?textBlocks.map(block=>({type:"text",text:block})):[{type:"text",text:text2}]}function keepsTextBlocksVerbatim(textBlocks){return textBlocks!==void 0&&textBlocks.length>1&&parseAskUserAnswerFrame(textBlocks[0]??"")!==void 0}var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},REQUIRED_COMPACTION_ERROR_MESSAGE="Context remains above the compaction threshold because compaction did not complete",RequiredCompactionError=class extends Error{constructor(){super(REQUIRED_COMPACTION_ERROR_MESSAGE),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`The retried request never started streaming${retryTimeoutMs===void 0?"":` after ${Math.round(retryTimeoutMs/1e3)}s`}.`+(streamStartTimeoutMs===void 0?" (Its stream-start guard is off; to bound or extend this wait, set retry.provider.streamStartTimeoutMs, 0 disables.)":` (Stream-start guard: ${Math.round(streamStartTimeoutMs/1e3)}s; to allow longer, raise retry.provider.streamStartTimeoutMs, 0 disables.)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._unregisterMemoryReport=()=>{},this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._sessionStartDispatching=!1,this._engineTurnStarts=[],this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._providerRequiredNoticed=!1,this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._shownThinkingClampWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled)},this._promptSurface=config.promptSurface,this._browserEngine=config.browserEngine,this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})}),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,origin:{source:reason},emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},isCandidateRefusal:error2=>error2 instanceof ModelUsabilityBudgetError,emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal,callbacks){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};return retryTransientCall(()=>this._resolveSummarizationRequestAuth(model,thinkingLevel,signal),isOAuthRefreshUnavailableError,this.settingsManager.getRetrySettings(),signal,callbacks??this._summarizationRetryCallbacks({source:"branchSummary"}))}async _resolveSummarizationRequestAuth(model,thinkingLevel,signal){if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted||isOAuthRefreshUnavailableError(error2))throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model,signal,callbacks){return{...await this._getSummarizationRequestAuth(model,signal,callbacks),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id,void 0,void 0,void 0,{origin:{source:"restore"},duringTurn:!1})}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state});if(route.state!==void 0&&route.state!==state){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID13(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage,provider:message.provider,model:message.model})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve47=>{this._resolveIdleWait=resolve47})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve47=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve47()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim2=>claim2.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.releaseSettledSessionMemory(),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve47=>{this._retryResolve=resolve47}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){this._observeEngineTurnMessage(event.message);let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendOwnedMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage8),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage8}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage8}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed"),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._unregisterMemoryReport(),this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=void 0,this._eventListeners=[],cleanupSessionResources(this.sessionId),this.sessionManager.dispose()}get activitySnapshot(){return{isStreaming:this._isAgentRunActive,isBashRunning:this.isBashRunning,isCompacting:this.isCompacting,hasSessionWork:this._sessionWorkBarrier.hasActiveWork,hasActiveWakeSource:this._wakeSources.hasActive}}get isSessionBusy(){return isSessionBusySnapshot(this.activitySnapshot)}refreshContext(){this._refreshFinalizedContext()}get state(){return this.agent.state}get model(){return this.agent.state.model}get thinkingLevel(){return this.agent.state.thinkingLevel}get thinkingSelection(){return this.agent.state.thinkingSelection}get startupThinkingClamp(){return this._startupThinkingClamp}get serviceTier(){return this._currentServiceTier}isFastModeActive(){return this._currentServiceTier!=="ultrafast"&&(this._sessionFastMode||this._currentServiceTier==="priority")}get effectiveServiceTier(){return this.isFastModeActive()?"priority":this._currentServiceTier}setSessionFastMode(enabled){let previousFastMode=this.isFastModeActive(),previousTier=this._currentServiceTier;this._sessionFastMode=enabled,!enabled&&this._currentServiceTier==="priority"&&this.model?.api===CODEX_RESPONSES_API&&this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier==="priority"&&(this._currentServiceTier=void 0),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode)}_emitServiceTierChangeIfNeeded(previousTier,previousFastMode){let fastMode=this.isFastModeActive();previousTier===this._currentServiceTier&&previousFastMode===fastMode||this._emit({type:"service_tier_changed",tier:this.effectiveServiceTier,fastMode})}_resolveServiceTier(model,explicit){if(explicit)return explicit;if(model)return this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier}get routedModel(){if(!this.model||!isVirtualModel(this.model))return;let latest=findLatestResponse(this.agent.state.messages),model=latest&&this._modelRuntime.getPhysicalModel(latest.provider,latest.model);return model&&{model,thinkingLevel:latest?.thinkingLevel}}get isStreaming(){return this._isAgentRunActive}get isIdle(){return!this._isAgentRunActive}setPromptSurface(surface){let current=this._baseSystemPromptOptions.surface;this._promptSurface=surface,current!==surface&&(this._systemPromptOverride=void 0,this._applyToolDeclarations(this.getActiveToolNames()))}setBrowserEngine(engine){this._browserEngine=engine}get browserEngine(){return this._browserEngine}get systemPrompt(){return this.agent.state.systemPrompt}get retryAttempt(){return this._retryAttempt}get currentAbortSource(){return this._abortProvenance.currentSource}getActiveToolNames(){return this.agent.state.tools.map(t=>t.name)}getCallableToolNames(){return this._getCallableTools().map(t=>t.name)}getAllTools(){return Array.from(this._toolDefinitions.values()).map(({definition,sourceInfo})=>({name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,promptGuidelines:definition.promptGuidelines,kernelPrelude:projectKernelPrelude(definition.name,definition.kernelPrelude),permissionParser:definition.permissionParser,...definition.namespace?{namespace:definition.namespace}:{},...definition.annotations?{annotations:{...definition.annotations}}:{},sourceInfo,...normalizeToolExposure(definition)}))}getToolDefinition(name){return this._toolDefinitions.get(name)?.definition}resolveToolCallName(requested){return resolveToolNameAlias(requested,this._callableToolNames())??requested}async executeTool(toolName,params,options){let activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName);if(!tool&&this._isEvalOnlyPolicyArmed()&&this._evalOnlyToolNames?.has(toolName)&&(tool=this._toolRegistry.get(toolName)),!tool&&options?.activateInactiveTool===!0&&this._toolDefinitions.has(toolName)&&this._activateLazyTool(toolName)&&(activeTools=this.getActiveToolNames(),tool=this.agent.state.tools.find(candidate=>candidate.name===toolName)),!tool){let code=new Set(this._toolDefinitions.keys()).has(toolName)?"inactive_tool":"unknown_tool",activeList=activeTools.length>0?activeTools.join(", "):"(none)";throw new ExecuteToolError(code,toolName,code==="inactive_tool"?`Tool ${toolName} is registered but inactive. Active tools: ${activeList}`:`Unknown tool ${toolName}. Active tools: ${activeList}`,activeTools)}let toolCall={type:"toolCall",id:`codemode-${randomUUID13()}`,name:toolName,arguments:params},prepared;try{prepared=prepareAgentToolCall(tool,toolCall)}catch(err2){throw new ExecuteToolError("invalid_params",toolName,err2 instanceof Error?err2.message:String(err2),activeTools)}let beforeResult=await this.preflightToolCall(prepared.toolCall,prepared.args,{waitForEventQueue:this._toolExecutionDepth===0});if(beforeResult?.block)throw new ExecuteToolError("blocked",toolName,beforeResult.reason||"Tool execution was blocked",activeTools);let result3,isError=!1;try{result3=await prepared.tool.execute(prepared.toolCall.id,prepared.args,options?.signal,options?.onUpdate),isError=result3.isError===!0}catch(err2){result3={content:[{type:"text",text:err2 instanceof Error?err2.message:String(err2)}],details:{isError:!0}},isError=!0}let hookResult=await this._emitAfterToolCallHooks(prepared.toolCall,prepared.args,result3,isError);return hookResult?{content:hookResult.content??result3.content,details:hookResult.details??result3.details,terminate:result3.terminate}:result3}_callableToolNames(){let names=this.agent.state.tools.map(tool=>tool.name);for(let[name,{definition}]of this._toolDefinitions){let exposure=normalizeToolExposure(definition);exposure.exposure==="search"&&exposure.allowLazyActivation&&names.push(name)}return[...names,...this._toolSearchCatalogNames()]}_toolSearchCatalogNames(){return this._toolSearchService?.getCatalog().map(doc=>doc.name)??[]}_activateLazyTool(toolName){return this._lazyToolActivation.activate(toolName)}_isEvalOnlyPolicyArmed(){return this._evalOnlyToolNames!==void 0&&this._toolRegistry.has("eval")}_resolveEvalOnlyToolNames(){let declaredEvalNames=[...this._toolDefinitions.values()].filter(({definition})=>normalizeToolExposure(definition).exposure==="eval").map(({definition})=>definition.name);return this._evalOnlyToolNamesOverride??new Set([...EVAL_ONLY_TOOL_NAMES,...declaredEvalNames])}_publishEvalOnlyToolHints(){let armed=this._isEvalOnlyPolicyArmed()?this._evalOnlyToolNames??new Set:void 0,registered=armed?new Set([...armed].filter(name=>this._toolRegistry.has(name))):void 0;for(let name of this._publishedEvalOnlyHintNames)registered?.has(name)||delete this.agent.removedToolHints[name];if(this._publishedEvalOnlyHintNames.clear(),!!registered)for(let name of registered)this.agent.removedToolHints[name]=`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`,this._publishedEvalOnlyHintNames.add(name)}getRegisteredTool(name){return this._toolRegistry.get(name)}async emitExecBridgeToolResult(toolName,toolCallId,args,result3,isError){await this._emitAfterToolCallHooks({type:"toolCall",id:toolCallId,name:toolName,arguments:args&&typeof args=="object"&&!Array.isArray(args)?args:{}},args,result3,isError)}setActiveToolsByName(toolNames){let tools=[],validToolNames=[],policyArmed=this._isEvalOnlyPolicyArmed();this._publishEvalOnlyToolHints();let policyNames=this._evalOnlyToolNames,filteredToolNames=toolNames;if(policyArmed&&policyNames){for(let name of toolNames)policyNames.has(name)&&this._withheldEvalOnlyToolNames.add(name);filteredToolNames=toolNames.filter(name=>!policyNames.has(name))}else this._withheldEvalOnlyToolNames.clear();this._requestedActiveToolNames=[...new Set([...toolNames,...this._withheldEvalOnlyToolNames])];for(let name of filteredToolNames){let tool=this._toolRegistry.get(name);tool&&this._getToolExposure(name)!=="hidden"&&(tools.push(tool),validToolNames.push(name))}let activeToolNamesChanged=validToolNames.length!==this.agent.state.tools.length||validToolNames.some((name,index)=>name!==this.agent.state.tools[index]?.name),previousToolNames=new Set(this.agent.state.tools.map(tool=>tool.name));this.agent.state.tools=tools;for(let name of validToolNames)this._declaredToolNames.includes(name)||this._declaredToolNames.push(name);this._applyToolDeclarations(validToolNames),activeToolNamesChanged&&this._extensionBindingPromptReadiness===void 0&&(this.abortCompaction(),this._incrementMessageRevision());let activatedToolNames=validToolNames.filter(name=>!previousToolNames.has(name));activatedToolNames.length>0&&this._extensionRunner?.hasHandlers("tool_activated")&&this._extensionRunner.emit({type:"tool_activated",toolNames:activatedToolNames})}_declaresSessionTools(){let model=this.model;return model!==void 0&&supportsAllowedToolChoice(model)}_toolDeclarationNames(activeToolNames){return this._declaresSessionTools()?this._declaredToolNames.filter(name=>this._toolRegistry.has(name)):[...activeToolNames]}_applyToolDeclarations(activeToolNames){this._promptDeclaresSessionTools=this._declaresSessionTools();let declaredNames=this._toolDeclarationNames(activeToolNames),declaresInactiveTools=declaredNames.length!==activeToolNames.length||declaredNames.some((name,index)=>name!==activeToolNames[index]);this.agent.state.declaredTools=declaresInactiveTools?declaredNames.flatMap(name=>this._toolRegistry.get(name)??[]):void 0,this._baseSystemPrompt=this._rebuildSystemPrompt(declaredNames),this.agent.state.systemPrompt=this._systemPromptOverride??this._baseSystemPrompt}_refreshToolDeclarationsForModel(){if(!this._declaresSessionTools()&&!this._promptDeclaresSessionTools)return;let declaredNames=this._toolDeclarationNames(this.getActiveToolNames());declaredNames.length===this._promptToolNames.length&&declaredNames.every((name,index)=>name===this._promptToolNames[index])||this._applyToolDeclarations(this.getActiveToolNames())}get isCompacting(){return this._compactionLifecycle.state.status==="running"||this._autoCompactionAbortController!==void 0||this._compactionAbortController!==void 0||this._branchSummaryAbortController!==void 0}get compactionState(){return this._compactionLifecycle.state}get messages(){return this._runtimeMessages()}get steeringMode(){return this.agent.steeringMode}get followUpMode(){return this.agent.followUpMode}get sessionFile(){return this.sessionManager.getSessionFile()}get sessionId(){return this.sessionManager.getSessionId()}onExtensionEvent(channel,handler){return this._resourceLoader.onExtensionEvent?.(channel,handler)??(()=>{})}emitExtensionEvent(channel,data){this._resourceLoader.emitExtensionEvent?.(channel,data)}setControlEndpointHost(host){this._controlEndpointHost=host}get sessionName(){return this.sessionManager.getSessionName()}get scopedModels(){return this._scopedModels}setScopedModels(scopedModels){this._scopedModels=scopedModels}get favoriteModels(){return this._getCurrentFavoriteModels()}setFavoriteModels(favoriteModels2){this._favoriteModels=favoriteModels2}_getCurrentFavoriteModels(){let availableById=new Map(this._modelRuntime.getAvailableSnapshot().map(model=>[`${model.provider}/${model.id}`,model])),narrowedModelIds=this._scopedModels.length>0?new Set(this._scopedModels.map(scoped=>`${scoped.model.provider}/${scoped.model.id}`)):void 0,seenModelIds=new Set,favoriteModels2=[];for(let favorite of this._favoriteModels){let modelId=`${favorite.model.provider}/${favorite.model.id}`;if(seenModelIds.has(modelId))continue;let model=availableById.get(modelId);model&&(narrowedModelIds&&!narrowedModelIds.has(modelId)||(seenModelIds.add(modelId),favoriteModels2.push({model,thinkingLevel:favorite.thinkingLevel,thinkingSelection:favorite.thinkingSelection,serviceTier:favorite.serviceTier})))}return favoriteModels2}get promptTemplates(){return this._resourceLoader.getPrompts().prompts}_normalizePromptSnippet(text2){if(!text2)return;let oneLine3=text2.replace(/[\r\n]+/g," ").replace(/\s+/g," ").trim();return oneLine3.length>0?oneLine3:void 0}_normalizePromptGuidelines(guidelines){if(!guidelines||guidelines.length===0)return[];let unique3=new Set;for(let guideline of guidelines){let normalized2=guideline.trim();normalized2.length>0&&unique3.add(normalized2)}return Array.from(unique3)}_rebuildSystemPrompt(toolNames){let validToolNames=toolNames.filter(name=>this._toolRegistry.has(name));this._promptToolNames=validToolNames;let withheld=this._withheldEvalOnlyToolNames??new Set,contributingToolNames=[...validToolNames,...[...withheld].filter(name=>this._toolRegistry.has(name)&&!validToolNames.includes(name))],toolSnippets={},promptGuidelines=[];for(let name of contributingToolNames){let snippet=this._toolPromptSnippets.get(name);snippet&&(toolSnippets[name]=snippet);let toolGuidelines=this._toolPromptGuidelines.get(name);toolGuidelines&&promptGuidelines.push(...toolGuidelines)}let loadedSkills=this._resourceLoader.getSkills().skills,loadedContextFiles=this._resourceLoader.getAgentsFiles().agentsFiles,loaderSystemPrompt=this._resourceLoader.getSystemPrompt(),loaderAppendSystemPrompt=this._resourceLoader.getAppendSystemPrompt();this._baseSystemPromptOptions={cwd:this._cwd,skills:loadedSkills,contextFiles:loadedContextFiles,selectedTools:validToolNames,toolSnippets,promptGuidelines,surface:this._promptSurface??resolvePromptSurface(process.env),customPrompt:loaderSystemPrompt,appendSystemPrompt:loaderAppendSystemPrompt.length>0?loaderAppendSystemPrompt.join(`
2623
2618
 
2624
2619
  `):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
2625
2620
 
@@ -2629,7 +2624,7 @@ ${loaderAppendSystemPrompt.join(`
2629
2624
 
2630
2625
  ${sentences.join(`
2631
2626
 
2632
- `)}`:prompt}async _runInputHandlers(text2,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source2,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text2,options),submittedByCommand:options?.source==="extension"});try{await this._prompt(text2,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_isExtensionCommandText(text2,options){if(!(options?.expandPromptTemplates??!0)||!text2.startsWith("/"))return!1;let spaceIndex=text2.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex))!==void 0}async _prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){let accepted=!1,reportAccepted=()=>{accepted||(accepted=!0,promptDisposition?.("handled"),preflightResult?.(!0))},turnStarted=!1,turnClaim=new DeferredTurnClaim;turnClaim.disposition.then(disposition=>{disposition==="delegated"?reportAccepted():disposition==="started"&&(turnStarted=!0)});let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&turnStarted&&reportAccepted()});try{await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"},turnClaim)}finally{unsubscribe()}reportAccepted();return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&!keepsTextBlocksVerbatim(options?.textBlocks)&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text2)&&this._rejectUnknownCommand(currentText),templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}this._flushPendingBashMessages(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=userTextContent(expandedText,options?.textBlocks);currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{ownsPromptStart&&(this._promptStartPending=!1)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,void 0,options?.onQueuedInput),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_rejectUnknownCommand(text2){if(commandShapedName(text2)===void 0)return;let promptCommands=new Set([...this._extensionRunner.getRegisteredCommands().map(command=>command.invocationName),...this.promptTemplates.map(template=>template.name),...this.resourceLoader.getSkills().skills.map(skill=>`skill:${skill.name}`)]),interactiveCommands=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name)),rejection=findUnknownCommand(text2,{promptCommands,interactiveCommands});if(rejection)throw rejection}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let maxExpansions=this.settingsManager.getMaxSkillExpansionsPerPrompt(),expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[],unloadedTokens=new Set,skippedSkillNames=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(expandedSkillNames.has(skill.name)){removedTokens.push(token),this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}if(skillBlocks.length>=maxExpansions){removedTokens.push(token),unloadedTokens.add(token),skippedSkillNames.includes(skill.name)||skippedSkillNames.push(skill.name);continue}removedTokens.push(token);try{let content=readFileSync47(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skippedSkillNames.length>0){let count=skippedSkillNames.length;this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Skipped ${count} skill${count===1?"":"s"} (${skippedSkillNames.join(", ")}): at most ${maxExpansions} skills load per prompt. Raise maxSkillExpansionsPerPrompt to load more.`})}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens,unloadedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return"handled";let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}}),"queued"}async steer(text2,images,options){return this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){return this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model,abortController.signal,{}),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"steer"})}async _queueFollowUp(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"followUp"})}async restoreQueuedInput(input){this._enqueuePreparedInput(input)}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text),this._recordQueuedInput(input.text,input.mode,prepared),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length}),this._emitQueueUpdate();let message={role:"user",content:[...userTextContent(input.text,input.textBlocks),...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message);return}switch(input.mode){case"steer":this.agent.steer(message);break;case"followUp":this.agent.followUp(message);break}}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve47=>{resolveBindingPromptReadiness=resolve47});bindingPromptReadiness.add(readiness)}let text2,images,textBlocks;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(`
2627
+ `)}`:prompt}async _runInputHandlers(text2,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source2,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text2,options),submittedByCommand:options?.source==="extension"});try{await this._prompt(text2,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_isExtensionCommandText(text2,options){if(!(options?.expandPromptTemplates??!0)||!text2.startsWith("/"))return!1;let spaceIndex=text2.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex))!==void 0}async _prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){let accepted=!1,reportAccepted=()=>{accepted||(accepted=!0,promptDisposition?.("handled"),preflightResult?.(!0))},turnStarted=!1,turnClaim=new DeferredTurnClaim;turnClaim.disposition.then(disposition=>{disposition==="delegated"?reportAccepted():disposition==="started"&&(turnStarted=!0)});let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&turnStarted&&reportAccepted()});try{await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"},turnClaim)}finally{unsubscribe()}reportAccepted();return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&!keepsTextBlocksVerbatim(options?.textBlocks)&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text2)&&this._rejectUnknownCommand(currentText),templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}this._flushPendingBashMessages(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=userTextContent(expandedText,options?.textBlocks);currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{ownsPromptStart&&(this._promptStartPending=!1)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,void 0,options?.onQueuedInput),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_rejectUnknownCommand(text2){if(commandShapedName(text2)===void 0)return;let promptCommands=new Set([...this._extensionRunner.getRegisteredCommands().map(command=>command.invocationName),...this.promptTemplates.map(template=>template.name),...this.resourceLoader.getSkills().skills.map(skill=>`skill:${skill.name}`)]),interactiveCommands=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name)),rejection=findUnknownCommand(text2,{promptCommands,interactiveCommands});if(rejection)throw rejection}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let maxExpansions=this.settingsManager.getMaxSkillExpansionsPerPrompt(),expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[],unloadedTokens=new Set,skippedSkillNames=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(expandedSkillNames.has(skill.name)){removedTokens.push(token),this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}if(skillBlocks.length>=maxExpansions){removedTokens.push(token),unloadedTokens.add(token),skippedSkillNames.includes(skill.name)||skippedSkillNames.push(skill.name);continue}removedTokens.push(token);try{let content=readFileSync47(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skippedSkillNames.length>0){let count=skippedSkillNames.length;this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Skipped ${count} skill${count===1?"":"s"} (${skippedSkillNames.join(", ")}): at most ${maxExpansions} skills load per prompt. Raise maxSkillExpansionsPerPrompt to load more.`})}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens,unloadedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return"handled";let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}}),"queued"}async steer(text2,images,options){return this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){return this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model,abortController.signal,{}),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"steer"})}async _queueFollowUp(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"followUp"})}async restoreQueuedInput(input){this._enqueuePreparedInput(input)}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text),this._recordQueuedInput(input.text,input.mode,prepared),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length}),this._emitQueueUpdate();let message={role:"user",content:[...userTextContent(input.text,input.textBlocks),...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message);return}switch(input.mode){case"steer":this.agent.steer(message);break;case"followUp":this.agent.followUp(message);break}}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn&&this._stopEngineTurn(message.customType))this._recordRefusedEngineTurnMessage(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}isUserDirectedTurn(message.customType)||this._recordEngineTurnStart(message.customType),await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_recordEngineTurnStart(customType){this._engineTurnStarts.push({at:Date.now(),toolUsed:!1});try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_TURN_START_ENTRY_TYPE,{customType}))}catch{return}}_recordRefusedEngineTurnMessage(appMessage){try{this._appendCustomMessage(appMessage),this.externalAdmission.observePersisted(appMessage)}catch(error2){this.externalAdmission.observeRefused(appMessage,error2 instanceof Error?error2.message:String(error2))}}_observeEngineTurnMessage(message){if(message.role==="user"||message.role==="custom"&&isUserDirectedTurn(message.customType)){this._engineTurnStarts=[];return}let running=this._engineTurnStarts.at(-1);running!==void 0&&message.role==="assistant"&&message.content.some(block=>block.type==="toolCall")&&(running.toolUsed=!0)}_stopEngineTurn(customType){if(isUserDirectedTurn(customType))return!1;let stop=engineTurnStop(this.sessionManager.getEntries(),Date.now(),this.settingsManager.getEngineTurnSettings(),this._engineTurnStarts);if(stop===null)return!1;let details={customType,...stop,at:Date.now()};return this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_TURN_LIMIT_ENTRY_TYPE,details)),this._extensionRunner.emitBusEvent(ENGINE_TURN_LIMIT_EVENT,details),this._extensionRunner.getUIContext().notify(engineTurnLimitNotice(stop),"warning"),!0}_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(resolve47=>{resolveBindingPromptReadiness=resolve47});bindingPromptReadiness.add(readiness)}let text2,images,textBlocks;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(`
2633
2628
  `),textParts.length>1&&(textBlocks=textParts),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,textBlocks,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,{textBlocks}):await this._queueFollowUp(text2,images,{textBlocks})),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,options){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order,...clientMessageIdentity(options)})}_removeQueuedInput(text2,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text2:message.clientMessageId===clientMessageId);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model,origin=SDK_MODEL_CHANGE){return this._setModel(model,!0,origin)}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,origin){let pending=createPendingModelSwitch({model,projection,persistDefault,origin});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,origin:heldSwitchOrigin(pending.origin)}),!0}_resumeRequirementStillBlocks(model,settings){let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;return!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable}_clearResumeCompactionRequirementIfFits(){let model=this.model;this._resumeCompactionRequirement===void 0||!model||this._resumeRequirementStillBlocks(model,this._getCompactionSettings(model))||(this._resumeCompactionRequirement=void 0)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model,origin=SDK_MODEL_CHANGE){return this._setModel(model,!1,origin)}_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,origin){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,origin);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,origin})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy),await this._retryFallback.rerouteAroundOpenCircuit()}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model,duringTurn=this.isStreaming;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,opts.origin),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,opts.origin);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,{origin:opts.origin,duringTurn}),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:opts.origin,from:previousModel,to:model,duringTurn,persistDefault:opts.persistDefault})),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource,origin:opts.origin,...previousModel===void 0?{}:{previousModel},duringTurn}),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",options={}){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2,{persistDefault:options.persistDefault??!0,origin:options.origin??{source:"cycle"}})}async _cycleFavoriteModel(direction,favoriteModels2,cycle){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,cycle.persistDefault,cycle.origin):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,cycle.persistDefault,cycle.origin),{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,cycle.origin);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,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens);let duringTurn=this.isStreaming;this.sessionManager.appendModelChange(next.model.provider,next.model.id,void 0,currentModel?.provider,currentModel?.id,{origin:cycle.origin,duringTurn}),cycle.persistDefault&&this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:cycle.origin,from:currentModel,to:next.model,duringTurn,persistDefault:cycle.persistDefault})),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle",origin:cycle.origin,...currentModel===void 0?{}:{previousModel:currentModel},duringTurn}),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,trigger){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,incoming=selection,requestedLevel=incoming?.requested!==void 0&&incoming.level===level?incoming.requested:level,effectiveSelection=clampThinkingSelection(selection,requestedLevel,effectiveLevel,this.model),selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId||previousSelection?.requested!==effectiveSelection?.requested,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection,trigger);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded(),this._emitThinkingClampWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}_emitThinkingClampWarningIfNeeded(){let notice2=getThinkingClampNotice(this.thinkingSelection,this.model);if(!notice2)return;let key=this._thinkingClampWarningKey(notice2);this._shownThinkingClampWarningKeys.has(key)||(this._shownThinkingClampWarningKeys.add(key),this._emit({type:"thinking_level_clamped",...notice2}))}_thinkingClampWarningKey(notice2){return`${notice2.provider}/${notice2.modelId}:${notice2.requestedLevel}`}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}requestedLevel??=model.defaultThinkingLevel;let fromGlobalDefault=!1;if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"},fromGlobalDefault=!0)}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requestedLevel,level,model)}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason,thinkingLevel){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual4(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual4(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=randomUUID13(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage8=`Compaction failed: ${error2.message}`;throw this._emit({type:"compaction_start",reason:"manual",requestId:requestId2}),this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,requestId:requestId2,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID13(),outcome="failed",disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"manual",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"manual",requestId,customInstructions,willRetry:!1});if(!execution.accepted)throw new CompactionRejectedError(execution.rejectionCause);return outcome="completed",this._clearResumeCompactionRequirementIfFits(),execution.result}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",error2 instanceof CompactionRejectedError)throw new Error(error2.message);if(!compactionExecutionOwnsTerminalTransition(error2))throw error2;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2),errorMessage8=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID13();ownsController&&(this._claimCompactionController(new AbortController,"compaction"),this._emit({type:"compaction_start",reason:options.reason,requestId}));let controller=this._compactionAbortController;if(!controller)return{applied:!1,reason:"rejected"};this._claimCompactionController(controller,"compaction");try{return(await this._executeCompaction({controller,owner:"compaction",reason:options.reason,requestId,willRetry:!1,precomputed})).accepted?(this._clearResumeCompactionRequirementIfFits(),this._resumeQueuedMessagesAfterCompaction(),{applied:!0,reason:"ok"}):{applied:!1,reason:"rejected"}}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`}),{applied:!1,reason:"rejected"}}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}_beginExtensionCompactionFeedback(reason){let controller=new AbortController;this._claimCompactionController(controller,"compaction");let model=this.model,requestId=randomUUID13();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal),aborted||this._resumeQueuedMessagesAfterCompaction()}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID13(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel,signal,this._summarizationRetryCallbacks({source:"compaction",reason:request2.reason}));compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&&currentMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState.status!=="running"||lifecycleState.operationId!==operationId||lifecycleState.startedRevision+compactionOwnedDiagnosticMessages.size!==this._messageRevision||!onlyPendingPersistenceAppends)return await this._rejectCompaction(request2,requestId,operationId,"stale-revision",!1);if(await this._wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model))return await this._rejectCompaction(request2,requestId,operationId,"would-overflow",!1);let latestConfigurationEffort=this.sessionManager.getBranch().findLast(entry=>entry.type==="configuration_update")?.reasoning.effort,compactionEntryId=this.sessionManager.appendCompaction(compactionResult.summary,compactionResult.firstKeptEntryId,compactionResult.tokensBefore,compactionResult.details,fromExtension,compactionResult.usage),savedEntry=this.sessionManager.getEntry(compactionEntryId);if(savedEntry?.type!=="compaction")throw new Error("Compaction entry was not saved");let modelAfterCompaction=this.model;latestConfigurationEffort!==void 0&&modelAfterCompaction!==void 0&&supportsConfigurationUpdate(modelAfterCompaction)&&this.sessionManager.appendConfigurationUpdate(latestConfigurationEffort);let sessionContext=this.sessionManager.buildSessionContext(),currentAgentMessages=this.agent.state.messages,messagesAppendedDuringCompaction=agentMessagesAtStart.every((message,index)=>currentAgentMessages[index]===message)?currentAgentMessages.slice(agentMessagesAtStart.length):[],preservedIdentities=new Set(messagesAppendedDuringCompaction);for(let message of currentAgentMessages)this._messageEndsAwaitingPersistence.has(message)&&preservedIdentities.add(message);let preservedPendingMessages=currentAgentMessages.filter(message=>preservedIdentities.delete(message));this._skipNextPostCompactionAssistantCheck=!0;for(let message of preservedPendingMessages)message.role==="assistant"&&this._assistantsPendingAtCompaction.add(message);if(this.agent.state.messages=[...sessionContext.messages,...preservedPendingMessages],compactionResult.estimatedTokensAfter=estimateMessagesTokens2(sessionContext.messages),this._incrementMessageRevision(),!this._compactionLifecycle.finish({operationId,status:"completed",endedRevision:this._messageRevision}))throw new CompactionCancelledError;return this._delegatedCompactionKey=void 0,request2.owner==="compaction"&&this._compactionAbortController===request2.controller&&(this._compactionAbortController=void 0),this._emit({type:"compaction_end",reason:request2.reason,result:compactionResult,aborted:!1,willRetry:request2.willRetry,requestId,accepted:!0}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!0,compactionEntry:savedEntry,fromExtension,willRetry:request2.willRetry}),await this._onCompactionContextChanged(),{accepted:!0,requestId,result:compactionResult,compactionEntry:savedEntry,fromExtension}}catch(error2){if(error2 instanceof CompactionExecutionError)throw error2;let lifecycleState=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState.status!=="idle"&&lifecycleState.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState.status==="running"&&this._compactionLifecycle.finish({operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,errorMessage:error2 instanceof Error?error2.message:String(error2)}),new CompactionExecutionError(error2,ownsTerminalTransition,aborted)}finally{finishCompactionWork()}}async _wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model){let currentLeaf=pathEntries[pathEntries.length-1];if(!currentLeaf)return!1;let simulatedCompactionEntry={type:"compaction",id:`simulated-${randomUUID13()}`,parentId:currentLeaf.id,timestamp:new Date().toISOString(),summary:compactionResult.summary,firstKeptEntryId:compactionResult.firstKeptEntryId,tokensBefore:compactionResult.tokensBefore,details:compactionResult.details,fromHook:fromExtension},simulatedMessages=buildSessionContext([...pathEntries,simulatedCompactionEntry],simulatedCompactionEntry.id).messages;(model.provider==="cursor"||model.provider==="cursor-cli-oauth")&&(simulatedMessages=admitCursorHistory({messages:simulatedMessages,budgetBytes:cursorAdmissionBudgetBytes(model.contextWindow)}).messages??simulatedMessages);let contextTokens=estimateMessagesTokens2(simulatedMessages),settings=this._getCompactionSettings(),reserveTokens=settings.reserveScalingEnabled===!1?settings.reserveTokens:resolveReserveTokens(model.contextWindow,settings.reserveTokens);return contextTokens>model.contextWindow-reserveTokens}_stripTrailingFailedAssistants(){let messages=this.agent.state.messages,end=messages.length;for(;end>0;){let candidate=messages[end-1];if(candidate?.role!=="assistant")break;let stopReason=candidate.stopReason;if(stopReason!=="error"&&stopReason!=="length")break;end-=1}let stripped=messages.length-end;return stripped>0&&(this.agent.state.messages=messages.slice(0,end),this._incrementMessageRevision()),stripped}_restoreAgentMessagesFromSession(){let sessionMessages=this.sessionManager.buildSessionContext().messages,seen=new Set(sessionMessages),pendingMessages=[];for(let message of this.agent.state.messages)seen.has(message)||!this._messageEndsAwaitingPersistence.has(message)||(seen.add(message),pendingMessages.push(message));this.agent.state.messages=[...sessionMessages,...pendingMessages]}async _rejectCompaction(request2,requestId,operationId,rejectionCause,aborted,extensionReason){rejectionCause==="external-owner"&&this.model&&(this._delegatedCompactionKey={provider:this.model.provider,id:this.model.id});let trimmedExtensionReason=extensionReason?.trim(),detailedMessage=trimmedExtensionReason?`Compaction rejected: ${trimmedExtensionReason}`:describeCompactionRejection(rejectionCause),errorMessage8=aborted&&!trimmedExtensionReason?void 0:detailedMessage;if(!this._compactionLifecycle.finish({operationId,status:"failed",endedRevision:this._messageRevision,rejectionCause,...trimmedExtensionReason!==void 0?{errorMessage:trimmedExtensionReason}:{}}))throw new CompactionCancelledError;return this._emit({type:"compaction_end",reason:request2.reason,result:void 0,aborted,willRetry:!1,requestId,accepted:!1,rejectionCause,errorMessage:errorMessage8}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:void 0,feedbackOperation=this._compactionLifecycle.abort(this._messageRevision);this._compactionAbortController?.abort(),this._autoCompactionAbortController?.abort(),feedbackOperation?.stage==="feedback"&&(this._compactionAbortController=void 0,this._emit({type:"compaction_end",reason:feedbackOperation.reason,result:void 0,aborted:!0,willRetry:!1,requestId:activeFeedbackRequestId}))}abortBranchSummary(){this._branchSummaryAbortController?.abort()}async _assertModelReadyForTurn(){if(!this.model)throw new ModelNotReadyError(formatNoModelSelectedMessage());if(this._modelRuntime.hasConfiguredAuth(this.model.provider)||await this._modelRuntime.checkAuth(this.model.provider)!==void 0){this._providerRequiredNoticed=!1;return}throw this._modelRuntime.isUsingOAuth(this.model.provider)?new ModelNotReadyError(`Authentication failed for "${this.model.provider}". Credentials may have expired or network is unavailable. Run '/login ${this.model.provider}' to re-authenticate.`):new ModelNotReadyError(formatNoApiKeyFoundMessage(this.model.provider))}_noticeProviderRequired(notice2){this._providerRequiredNoticed||(this._providerRequiredNoticed=!0,this._emit({type:"provider_required",notice:notice2}))}async _enforceCompactionBeforeProvider(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction=!1){this._releaseBlockedPostCompactionAdmissionIfReduced();let blockedAdmission=this._blockedPostCompactionAssistant;if(blockedAdmission!==void 0&&blockedAdmission.assistant===assistantMessage)throw new RequiredCompactionError;let settings=this._getCompactionSettings(),model=this.model;if(this._pendingModelSwitch!==void 0)return await this._applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason);if(this._resumeCompactionRequirement!==void 0){if(!model)throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings)){if(!await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))throw new RequiredCompactionError;if(this._resumeRequirementStillBlocks(model,settings))throw new RequiredCompactionError;return this._resumeCompactionRequirement=void 0,!0}this._resumeCompactionRequirement=void 0}let contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens,compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;let limitsModel=this._limitsModel();if(!settings.enabled||!limitsModel||limitsModel.contextWindow<=0||!shouldCompact2(contextTokens,limitsModel.contextWindow,settings))return!1;let latestCompaction2=getLatestCompactionEntry(this.sessionManager.getBranch()),assistantBeforeLatestCompaction=assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage),hasPostCompactionCustomState=latestCompaction2!==null&&this.agent.state.messages.some(message=>message.role==="custom"&&message.timestamp>=new Date(latestCompaction2.timestamp).getTime());if(assistantBeforeLatestCompaction&&!hasPostCompactionCustomState)return!1;if(assistantBeforeLatestCompaction&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text2=>({role:"user",content:[{type:"text",text:text2}],timestamp}))}async _enforceFinalProviderAdmission(messages){let lateQueuedMessages=this._pendingQueuedInputMessages();if(!messages.some(message=>message.role==="custom")&&lateQueuedMessages.length===0)return;let model=this._limitsModel();if(!model||model.contextWindow<=0)return;let settings=this._getCompactionSettings(),reserveTokens=resolveEffectiveReserveTokens(model.contextWindow,settings),isOversized=()=>{let providerMessages=[...this.agent.state.messages,...messages,...this._pendingQueuedInputMessages()],estimate=estimateContextTokens3(providerMessages),usageMessage=estimate.lastUsageIndex===null?void 0:providerMessages[estimate.lastUsageIndex];return(usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(providerMessages):estimate.tokens)>model.contextWindow-reserveTokens};if(!settings.enabled||!isOversized())return;let lastAssistantMessage2=this._findLastAssistantMessage();if(!lastAssistantMessage2)throw new RequiredCompactionError;let compacted=await this._runPrePromptCompaction(lastAssistantMessage2,!1,"pre_prompt");if(!(!compacted&&this._isCompactionDelegated())&&!(!compacted&&this._hasSupersedingCompactionClaim())&&!(!compacted&&!isOversized()&&this._isCompactionOnCooldown())&&(!compacted||isOversized()))throw new RequiredCompactionError}async _checkCompaction(assistantMessage,skipAbortedCheck=!0,inlineReason,retryAfterCompaction=!1){let settings=this._getCompactionSettings();if(skipAbortedCheck&&assistantMessage.stopReason==="aborted")return!1;let limitsModel=this.model&&isVirtualModel(this.model)?this._modelRuntime.getPhysicalModel(assistantMessage.provider,assistantMessage.model):this.model,sameModel=limitsModel&&isSameOverflowSource(assistantMessage,limitsModel,this._modelRuntime.getCompatibilityRequestConfig(limitsModel).upstreamModelId),contextWindow=(limitsModel??this.model)?.contextWindow??0,compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&(inlineReason!==void 0||!this._exceedsPolicyByContentEstimate()))return!1;let contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings),branch=this.sessionManager.getBranch(),projection,buildProjection=()=>projection??=this.sessionManager.buildSessionProjection(),usageScope=resolveAssistantUsageScope(branch,buildProjection,this._findPersistedMessageEntryId(assistantMessage)),overflowEvidenceApplies=assistantMessage.stopReason==="error"?usageScope.retainedForExplicitRecovery:usageScope.usageMatchesProjection,recoverableLength=inlineReason!=="threshold"&&sameModel&&usageScope.projected&&isRecoverableLength(assistantMessage,limitsModel?.maxTokens??0),isOverflow=overflowEvidenceApplies&&isContextOverflow(assistantMessage,contextWindow)&&(sameModel||currentContextNeedsCompaction)||recoverableLength||this._isCursorPayloadOverflow(assistantMessage);if(isOverflow&&!settings.enabled&&!isTurnStuckOnContextOverflow(assistantMessage,contextWindow)||isOverflow&&assistantMessage.stopReason==="stop"&&this._consumePostCompactionUsageExemption(assistantMessage))return!1;if(isOverflow){this._flushPostCompactionDeferredMessages();let willRetry=retryAfterCompaction||assistantMessage.stopReason!=="stop";if(!willRetry){let compacted2=await this._runAutoCompaction("overflow",!1);return!compacted2&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted2}if(inlineReason==="pre_prompt"&&(this._overflowRecoveryRungs=0),this._overflowRecoveryRungs>=OVERFLOW_RECOVERY_RUNGS){let errorMessage8=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage8}),inlineReason==="pre_prompt")throw new Error(errorMessage8);return!1}this._overflowRecoveryRungs+=1;let keepRecentTokensOverride=this._overflowRecoveryRungs>=2?0:void 0,messages=this.agent.state.messages,removedOverflowAssistant=!1;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),removedOverflowAssistant=!0,this._incrementMessageRevision());let compacted=inlineReason?await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,"overflow",willRetry,!1,keepRecentTokensOverride):keepRecentTokensOverride===void 0?await this._runAutoCompaction("overflow",willRetry):await this._runAutoCompaction("overflow",willRetry,{keepRecentTokensOverride});if(!compacted&&removedOverflowAssistant&&(this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),!compacted&&inlineReason&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){if(this._compactionSkippedTooSmall){this._compactionSkippedTooSmall=!1;let provider=this.model?.provider;return(provider==="cursor"||provider==="cursor-cli-oauth")&&this._truncateAgentMessagesToLastUserTurn(),!0}throw new RequiredCompactionError}return compacted&&willRetry&&(this._failedResponse=assistantMessage),compacted}if(!settings.enabled||this._consumePostCompactionUsageExemption(assistantMessage))return!1;let contextTokens,staleUsageContentTokens;if(inlineReason){let messages=this.sessionManager.buildSessionContext().messages;contextTokens=estimateContextTokens3(messages).tokens}else{let directContextTokens=assistantMessage.usage?calculateContextTokens2(assistantMessage.usage):0;if(!usageScope.usageMatchesProjection)contextTokens=estimateProjectedContextTokens(buildProjection(),branch).tokens;else if(assistantMessage.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this.agent.state.messages,estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens2(messages),!shouldCompact2(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact2(contextTokens,contextWindow,settings))if(inlineReason){let compacted=await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);return compacted||!this._compactionSkippedTooSmall?compacted:(this._compactionSkippedTooSmall=!1,await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction,!1,0))}else{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._compactionSkippedTooSmall=!1,!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID13();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs,onStreamStarted:listener=>{let unsubscribe=this.agent.subscribe(event=>{event.type!=="message_start"||event.message.role!=="assistant"||(unsubscribe(),listener())});return unsubscribe}}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_reportContinuationTranscriptFailure(){let failure2=this._transcriptWriteFailures.takeReport();if(!failure2)return;let message=failure2.error instanceof Error?failure2.error.message:String(failure2.error);this._emit({type:"continuation_error",errorMessage:`The session file did not save this run: ${message}`})}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry,options={}){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let{keepRecentTokensOverride}=options,model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID13();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),endStarted()),endStarted=()=>(reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryRungs=0),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1),isSuperseded=()=>this._autoCompactionAbortController!==autoCompactionController;try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model,{signal:autoCompactionController.signal})}catch(error2){if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();if(this._emit({type:"compaction_start",reason,requestId}),isSuperseded())return!1;throw new CompactionExecutionError(error2,!0,!1)}if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();let resolvedSettings=this._getCompactionSettings(model);return prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:keepRecentTokensOverride},model?.provider,reason),reason==="overflow")?(this._emit({type:"compaction_start",reason,requestId}),isSuperseded()?!1:autoCompactionController.signal.aborted?endStarted():(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart,keepRecentTokensOverride})).accepted?(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry?(this._stripTrailingFailedAssistants(),this._scheduleContinuationAfterCurrentEvent(),!0):this.pendingMessageCount>0?(this._scheduleContinuationAfterCurrentEvent(),!0):this.agent.hasQueuedMessages()?(this._scheduleContinuationAfterCurrentEvent(),!0):!1):(reason==="overflow"&&(this._overflowRecoveryRungs=0),!1)):endBeforeExecution()}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryRungs=0);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve47=>{settle=resolve47}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim2=>{this.sendCustomMessage(message,options,claim2).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim2=>{this.sendUserMessage(content,options,claim2).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(activator)},getCommands,setModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model,origin??{source:"extension"}),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model,origin??{source:"extension"}),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source2="user")=>{if(source2==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getBrowserEngine:()=>this._browserEngine,getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID13();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options),executeTool:(callerId,name,args,options)=>this._executeNestedToolCall(callerId,name,args,options),getCallableTools:()=>this._getCallableTools()},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()},registerVirtualModel:definition=>{this._modelRuntime.registerVirtualModel(definition),this._refreshCurrentModelFromRegistry()},unregisterVirtualModel:(provider,id)=>{this._modelRuntime.unregisterVirtualModel(provider,id),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path15){return path15.startsWith("<builtin:")||path15.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path15)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${name}`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${definition.name}`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>this._isActivatedOnRegistration(name),nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});for(let name of options?.addedToolNames??[])isAllowedTool(name)&&nextActiveToolNames.push(name);if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&this._getToolExposure(toolName)!=="hidden"&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._adoptToolSearchService(extensionsResult.runtime),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds,addedToolNames:options.addedToolNames})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;if(this._promptStartPending)return this.checkReloadVeto();let finishReloadWork=this._sessionWorkBarrier.begin();try{return await this._rebuildRuntimeForReload(options)}finally{finishReloadWork()}}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]);await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let addedDefaultTools=(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]).filter(name=>!previousDefaultTools.has(name));this._defaultToolNames&&addedDefaultTools.length>0&&(this._defaultToolNames=new Set([...this._defaultToolNames,...addedDefaultTools]));let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:this._extensionRunner.getFlagValues(),includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();this._sessionStartDispatching=!0;try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{this._sessionStartDispatching=!1,settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending,()=>this._sessionStartDispatching)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source2})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishRetryAttempt=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishRetryAttempt(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishRetryAttempt(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve47=>{this._retryResolve=resolve47}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else if(this._isCircuitProbeOnCurrentModel()&&this._retryFallback.canTryFallback()){if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),!switchedFallback)return this._resolveRetry(),"not-handled";this._retryAttempt=1}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._failedResponse=message,this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
2634
2629
  ${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??createLocalBashOperations({shellPath}),{onChunk:delta=>{let callbackResult=onChunk?.(delta);return this._emit({type:"bash_execution_update",id:options?.id,delta}),callbackResult},signal:abortController.signal});return this.recordBashResult(command,result3,options),result3}finally{this._bashAbortControllers.delete(abortController)}}recordBashResult(command,result3,options){let bashMessage={role:"bashExecution",command,output:result3.output,exitCode:result3.exitCode,cancelled:result3.cancelled,truncated:result3.truncated,fullOutputPath:result3.fullOutputPath,timestamp:Date.now(),excludeFromContext:options?.excludeFromContext};this.isStreaming?this._pendingBashMessages.push(bashMessage):(this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision())}abortBash(){for(let abortController of[...this._bashAbortControllers])abortController.abort()}async cleanupBashOutput(path15){await rm12(path15,{force:!0})}get isBashRunning(){return this._bashAbortControllers.size>0}get hasPendingBashMessages(){return this._pendingBashMessages.length>0}_flushPendingBashMessages(){if(this._pendingBashMessages.length!==0){for(let bashMessage of this._pendingBashMessages)this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision();this._pendingBashMessages=[]}}setSessionName(name){this.sessionManager.appendSessionInfo(name);let event={type:"session_info_changed",name:this.sessionManager.getSessionName()};this._emit(event),this._extensionRunner.emit(event)}async navigateTree(targetId,options={}){return this._navigateTree(targetId,options)}async continueFromLeaf(){if(this.isStreaming)throw new ContinueFromLeafError("streaming");if(this.agent.state.messages.length===0)throw new ContinueFromLeafError("nothing_to_continue");if(this.agent.state.messages[this.agent.state.messages.length-1]?.role!=="assistant")throw new ContinueFromLeafError("leaf_not_assistant");let turnClaim=new DeferredTurnClaim,admission=trackTurnAdmission({disposition:turnClaim.disposition,subscribe:listener=>this.subscribe(event=>{event.type==="agent_start"&&listener({type:"agent_start"})})}),run2=this.sendCustomMessage({customType:CONTINUE_FROM_LEAF_CUSTOM_TYPE,content:CONTINUE_FROM_LEAF_DIRECTIVE,display:!1},{triggerTurn:!0},turnClaim);try{await Promise.race([admission.promise,run2])}finally{admission.dispose()}run2.catch(()=>{})}async editAssistantMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,text2);return assistantTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async editUserMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,text2);return userTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async _navigateTree(targetId,options,replacement){if(this.isStreaming)throw new SessionStreamingError;if(this.isCompacting)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=this.sessionManager.getLeafId();if(assertExpectedLeaf(options.expectedLeafId,oldLeafId),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label3=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label3};this._branchSummaryAbortController=new AbortController;try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label3=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model,this._branchSummaryAbortController.signal),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=askUserAnswerDisplayText(entry.message.content)??contentText(entry.message.content,"");text2&&result3.push({entryId:entry.id,text:text2})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){entry.type==="usage"?addUsageToTotals(usageTotals,entry.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c=>c.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:this.sessionFile,sessionId:this.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:this.getContextUsage(),failures:computeSessionFailureReport(this.sessionManager.getEntries())}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project=this.settingsManager.getProjectSettings().promptCache,merged=global||project?{...global,...project}:void 0;return resolvePromptCacheSafeWaitSeconds(this.model,merged,process.env)}syncPromptCacheSafeWaitEnv(){let budget=this.resolvePromptCacheSafeWaitSeconds();budget===void 0?delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV]:process.env[PROMPT_CACHE_SAFE_WAIT_ENV]=String(budget)}getContextUsage(){let model=this._limitsModel(),runtimeMessages=this.messages,key={messages:runtimeMessages,length:runtimeMessages.length,last:runtimeMessages.at(-1),lastFingerprint:messageFingerprint(runtimeMessages.at(-1)),leafId:this.sessionManager.getLeafId(),contextWindow:model?.contextWindow},cached=this._contextUsageCache;if(cached!==void 0&&cached.key.messages===key.messages&&cached.key.length===key.length&&cached.key.last===key.last&&cached.key.lastFingerprint===key.lastFingerprint&&cached.key.leafId===key.leafId&&cached.key.contextWindow===key.contextWindow)return cached.usage;let usage3=this._computeContextUsage(model);return this._contextUsageCache={key,usage:usage3},usage3}_computeContextUsage(model){if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let messages=this.messages,branchEntries=this.sessionManager.getBranch(),latestCompaction2=getLatestCompactionEntry(branchEntries);if(latestCompaction2){let compactionIndex=branchEntries.lastIndexOf(latestCompaction2),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens2(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=branchEntries.some(entry=>entry.type==="context_edit")?estimateProjectedContextTokens(this.sessionManager.buildSessionProjection(),branchEntries):estimateContextTokens3(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){let themeName=[options.themeName,this.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>this.getToolDefinition(name),theme,cwd:this.sessionManager.getCwd()});return await exportSessionToHtml(this.sessionManager,this.state,{outputPath,themeName,toolRenderer})}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname50(filePath);existsSync47(dir)||mkdirSync28(dir,{recursive:!0});let header2={type:"session",version:CURRENT_SESSION_VERSION,id:this.sessionManager.getSessionId(),timestamp:new Date().toISOString(),cwd:this.sessionManager.getCwd()},branchEntries=this.sessionManager.getBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync24(filePath,`${lines.join(`
2635
2630
  `)}
@@ -2655,7 +2650,7 @@ ${codeSpan(styledWarning)}
2655
2650
  `)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source2=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source2==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source2==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source2,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value2){throw new Error(`Unexpected resource scope: ${String(value2)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage7(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage7(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage7(error2){return error2 instanceof Error?error2.message:String(error2)}var DEFAULT_FLAG="--default";function parseModelCommandArgument(argument){let words4=(argument??"").trim().split(/\s+/).filter(word=>word.length>0),asDefault=words4.includes(DEFAULT_FLAG);return{searchTerm:words4.filter(word=>word!==DEFAULT_FLAG).join(" "),asDefault}}function isAnnouncedElsewhere(source2){return source2==="fallback"||source2==="fallback-revert"}function describeOrigin(origin){return origin.actor===void 0?origin.source:`${origin.source}: ${origin.actor}`}function modelChangeNoticeText(input){return`\u21C4 Model changed mid-turn \xB7 ${input.from===void 0?input.to:`${input.from} \u2192 ${input.to}`} (${describeOrigin(input.origin)})`}function liveModelChangeNotice(event){if(!(!event.duringTurn||isAnnouncedElsewhere(event.origin.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:event.previousModel?.id,to:event.model.id,origin:event.origin})}}function replayedModelChangeNotice(entry){if(!(entry.duringTurn!==!0||entry.source===void 0||isAnnouncedElsewhere(entry.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:entry.originalModelId,to:entry.modelId,origin:entry.actor===void 0?{source:entry.source}:{source:entry.source,actor:entry.actor}})}}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isRetryableProviderError(raw){return raw?isNetworkProviderError(raw)?!0:isRetryableErrorMessage(raw):!1}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.retryAwaitingFinish=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.retryAwaitingFinish=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.retryAwaitingFinish=!1,this.notice?.setSummary(void 0)}clearTransient(){this.pending=!1,this.notice?.setSummary(void 0)}get hasActiveRetry(){return this.pending}get awaitingRetryFinish(){return this.retryAwaitingFinish}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1,this.retryAwaitingFinish=!1;let count=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage8=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source2){return source2.usesDefaultSessionDir()?{}:{sessionDir:source2.getSessionDir()}}function currentScopeSessions(source2,onProgress,signal){let cwd=source2.getCwd();return withMovedSessions(SessionManager.list(cwd,source2.getSessionDir(),onProgress,signal),cwd,sharedSessionDir(source2))}async function allScopeSessions(source2,onProgress,signal){let sessions2=source2.usesDefaultSessionDir()?await SessionManager.listAll(onProgress,signal):await SessionManager.listAll(source2.getSessionDir(),onProgress,signal);return markMovedSessions(sessions2,source2.getCwd())}async function chooseResumePath(sessionPath,source2,ui){let cwd=source2.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source2),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
2656
2651
  This directory is the same git repository: ${cwd}
2657
2652
  Choose No to open it where it is.`)})).path}catch(error2){if(!(error2 instanceof Error))throw error2;ui.showError(`Could not move session: ${error2.message}`);return}}var RISKY_MAIN_MODEL_WARNING="Not a recommended model. It can perform dangerous actions such as harming your computer and has not been tested. Please use a different model.",RISKY_MODEL_FAMILIES=["minimax","qwen"];function isRiskyMainModel(model){let searchableLabel=`${model.provider}/${model.id} ${model.name}`.toLowerCase();return RISKY_MODEL_FAMILIES.some(family=>searchableLabel.includes(family))}import{existsSync as existsSync49,mkdirSync as mkdirSync29,readFileSync as readFileSync52,realpathSync as realpathSync10,writeFileSync as writeFileSync25}from"node:fs";import{join as join88}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync52(join88(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{mkdirSync29(agentDir,{recursive:!0}),writeFileSync25(join88(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
2658
- `)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync49,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-EQXHX4WI.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text2=>{change?.(text2),this.editorChanged(hasDraft())};let submit=editor.onSubmit;editor.onSubmit=(text2,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit?.(text2,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
2653
+ `)}catch{}}function detectBunAvailability(options){let bunPath=findBunBinary(options);if(bunPath===void 0)return{kind:"missing"};let version=options.bunVersion(bunPath);return version!==void 0&&bunVersionSatisfies(version)?{kind:"ready",version}:{kind:"outdated",version}}function skipRequested(){let value2=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value2!==void 0&&value2!==""&&value2!=="0"}function maybeShowRuntimeNotice(show){let agentDir=getAgentDir();runtimeNoticeSkipReason({versions:process.versions,env:process.env,hasInheritedInspectorOption:hasInheritedInspectorOption(),skipRequested:skipRequested(),engineVersion:VERSION,shownVersion:readShownVersion(agentDir)})===void 0&&(show(buildRuntimeNotice({appName:APP_NAME,appCommand:APP_COMMAND,nodeVersion:process.version,platform:process.platform,installMethod:detectInstallMethod(),target:reinstallTarget(BRAND,PACKAGE_NAME),bun:detectBunAvailability(processBunRuntimeOptions(existsSync49,realpathSync10)),pinEnvName:runtimePinEnvName(process.env)})),recordShownVersion(agentDir,VERSION))}var TuiSessionControlHost=class{constructor(context){this.editorRevision=0,this.hadDraft=!1,this.submitting=!1,this.openTickets=0,this.bufferedElsewhere=!1,this.context=context}async register(options){await this.disposeActive();let{registerSessionControlEndpoint}=await import("./session-control-endpoint-OH7XV2FN.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);return"endpoint"in outcome&&(this.active=outcome.endpoint),outcome.registration}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text2=>{change?.(text2),this.editorChanged(hasDraft())};let submit=editor.onSubmit;editor.onSubmit=(text2,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit?.(text2,...details)}finally{let claimed=this.handoff!==ticket;this.handoff=void 0,claimed||ticket.release()}}}claimHandoff(){let ticket=this.handoff;return this.handoff=void 0,ticket}submissionInFlight(){return this.openTickets>0||this.bufferedElsewhere}noteBufferedElsewhere(held){let released=this.bufferedElsewhere&&!held;this.bufferedElsewhere=held,released&&this.wakeIfUnheld()}questionsChanged(){this.active?.noteQuestions()}async disposeActive(){let active=this.active;this.active=void 0,await active?.dispose()}openTicket(){this.openTickets+=1;let released=!1;return{release:()=>{released||(released=!0,this.openTickets-=1,this.wakeIfUnheld())}}}wakeIfUnheld(){queueMicrotask(()=>{this.submissionInFlight()||this.active?.wake("submission")})}editorChanged(hasDraft){this.editorRevision+=1;let cleared=this.hadDraft&&!hasDraft;this.hadDraft=hasDraft,this.active?.noteState(),cleared&&queueMicrotask(()=>{this.submitting||this.active?.wake("draft_cleared")})}};function formatSessionFailureInfo(report){if(!report||report.erroredRequests+report.abortedRequests===0)return"";let label3=text2=>theme.fg("dim",text2),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
2659
2654
  ${theme.bold("Failures")}
2660
2655
  `;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
2661
2656
  `,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
@@ -2680,7 +2675,7 @@ ${onboarding()}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.h
2680
2675
  ${body}`},()=>`${sectionHeader(name,color)}
2681
2676
  ${expandedBody()}`,this.getStartupExpansionState());this.loadedResourcesContainer.addChild(section)},skillsResult=this.session.resourceLoader.getSkills(),promptsResult=this.session.resourceLoader.getPrompts(),themesResult=this.session.resourceLoader.getThemes(),extensions=options?.extensions??this.session.resourceLoader.getExtensions().extensions.filter(extension=>!extension.hidden).map(extension=>({path:extension.path,sourceInfo:extension.sourceInfo})),sourceInfos=new Map;for(let extension of extensions)extension.sourceInfo&&sourceInfos.set(extension.path,extension.sourceInfo);for(let skill of skillsResult.skills)skill.sourceInfo&&sourceInfos.set(skill.filePath,skill.sourceInfo);for(let prompt of promptsResult.prompts)prompt.sourceInfo&&sourceInfos.set(prompt.filePath,prompt.sourceInfo);for(let loadedTheme of themesResult.themes)loadedTheme.sourcePath&&loadedTheme.sourceInfo&&sourceInfos.set(loadedTheme.sourcePath,loadedTheme.sourceInfo);if(showListing){let systemPromptSource=this.session.resourceLoader.getSystemPromptSource(),contextFiles=[...systemPromptSource?[systemPromptSource]:[],...this.session.resourceLoader.getAppendSystemPromptSources(),...this.session.resourceLoader.getAgentsFiles().agentsFiles];contextFiles.length>0&&(this.loadedResourcesContainer.addChild(new Spacer(1)),addLoadedSection("Context",()=>formatCompactList(contextFiles.map(contextFile=>this.formatContextPath(contextFile.path)),{sort:!1}),()=>contextFiles.map(f=>theme.fg("dim",` ${this.formatDisplayPath(f.path)}`)).join(`
2682
2677
  `)));let skills=skillsResult.skills;if(skills.length>0){let groups=this.buildScopeGroups(skills.map(skill=>({path:skill.filePath,sourceInfo:skill.sourceInfo})));addLoadedSection("Skills",()=>formatCompactList(skills.filter(skill=>!isSystemResource(skill.sourceInfo)).map(skill=>skill.name)),()=>this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}))}let templates=this.session.promptTemplates;if(templates.length>0){let groups=this.buildScopeGroups(templates.map(template=>({path:template.filePath,sourceInfo:template.sourceInfo}))),templateByPath=new Map(templates.map(t=>[t.filePath,t]));addLoadedSection("Prompts",()=>formatCompactList(templates.filter(template=>!isSystemResource(template.sourceInfo)).map(template=>`/${template.name}`)),()=>this.formatScopeGroups(groups,{formatPath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)},formatPackagePath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)}}))}if(extensions.length>0){let groups=this.buildScopeGroups(extensions),extList=()=>this.formatScopeGroups(groups,{formatPath:item=>this.formatExtensionDisplayPath(item.path),formatPackagePath:item=>this.formatExtensionDisplayPath(this.getShortPath(item.path,item.sourceInfo))}),extensionLabels=this.getCompactExtensionLabels(extensions.filter(extension=>!isSystemResource(extension.sourceInfo)));addLoadedSection("Extensions",()=>formatCompactList(extensionLabels),extList,"mdHeading")}}if(showDiagnostics){let addDiagnosticNotice=(title,diagnostics)=>{this.loadedResourcesContainer.addChild(buildNoticeBox({title,tone:"warning",why:"Conflicting or invalid loaded resources were found.",extra:this.formatDiagnostics(diagnostics,sourceInfos)},{expanded:this.toolOutputExpanded},theme)),this.loadedResourcesContainer.addChild(new Spacer(1))},skillDiagnostics=skillsResult.diagnostics;skillDiagnostics.length>0&&addDiagnosticNotice("Skill conflicts",skillDiagnostics);let promptDiagnostics=promptsResult.diagnostics;promptDiagnostics.length>0&&addDiagnosticNotice("Prompt conflicts",promptDiagnostics);let extensionDiagnostics=[],extensionsResult=this.session.resourceLoader.getExtensions();for(let error2 of extensionsResult.errors)extensionDiagnostics.push({type:"error",message:error2.error,path:error2.path});for(let warning of extensionsResult.warnings??[])extensionDiagnostics.push({type:"warning",message:warning.warning,path:warning.path});let commandDiagnostics=this.session.extensionRunner.getCommandDiagnostics();extensionDiagnostics.push(...commandDiagnostics),extensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));let shortcutDiagnostics=this.session.extensionRunner.getShortcutDiagnostics();extensionDiagnostics.push(...shortcutDiagnostics),extensionDiagnostics.length>0&&addDiagnosticNotice("Extension issues",extensionDiagnostics);let themeDiagnostics=themesResult.diagnostics;themeDiagnostics.length>0&&addDiagnosticNotice("Theme conflicts",themeDiagnostics)}}async bindCurrentSessionExtensions(){await this.sessionControlHost?.disposeActive(),this.session.setControlEndpointHost?.(this.sessionControlHost);let uiContext=this.createExtensionUIContext();await this.session.bindExtensions({uiContext,mode:"tui",abortHandler:()=>{this.restoreQueuedMessagesToEditor({abort:!0})},commandContextActions:{waitForIdle:()=>this.session.waitForIdle(),newSession:async options=>{this.clearStatusIndicator();try{return await this.runtimeHost.newSession(options)}catch(error2){return this.handleFatalRuntimeError("Failed to create session",error2)}},fork:async(entryId,options)=>{try{let result3=await this.runtimeHost.fork(entryId,options);return result3.cancelled||(this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")),{cancelled:result3.cancelled}}catch(error2){return this.handleFatalRuntimeError("Failed to fork session",error2)}},navigateTree:async(targetId,options)=>{let result3=await this.session.navigateTree(targetId,{summarize:options?.summarize,customInstructions:options?.customInstructions,replaceInstructions:options?.replaceInstructions,label:options?.label,expectedLeafId:options?.expectedLeafId});return result3.cancelled?{cancelled:!0}:(this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus("Navigated to selected point"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1})},editAssistantMessage:async(entryId,text2,options)=>{let result3=await this.session.editAssistantMessage(entryId,text2,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced assistant response"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},editUserMessage:async(entryId,text2,options)=>{let result3=await this.session.editUserMessage(entryId,text2,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced user prompt"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},switchSession:async(sessionPath,options)=>this.handleResumeSession(sessionPath,options),reload:async()=>{await this.handleReloadCommand()}},shutdownHandler:()=>{this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()},onError:error2=>{this.showExtensionError(error2)}}),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.setupAutocompleteProvider();let extensionRunner=this.session.extensionRunner;this.setupExtensionShortcuts(extensionRunner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0}),this.showStartupNoticesIfNeeded()}applyFullscreenScrollbarSetting(){this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar())}applyRuntimeSettings(){setCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides()),configureHttpDispatcher(this.settingsManager.getHttpIdleTimeoutMs()),this.applyFullscreenScrollbarSetting(),this.renderer instanceof TuiAltScreen&&(this.renderer.setCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect?.()??!0),this.renderer.setWheelScrollLines(this.settingsManager.getFullscreenWheelScrollLines?.()??"auto")),this.footer.setSession(this.session),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerDataProvider.setCwd(this.sessionManager.getCwd()),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.applySmoothStreamingRenderFps(),this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());let clearOnShrink=this.settingsManager.getClearOnShrink();this.ui.setClearOnShrink(clearOnShrink),!clearOnShrink&&!this.activeStatusIndicator&&this.statusContainer.clear();let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.defaultEditor.setPaddingX(editorPaddingX),this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible),this.editor!==this.defaultEditor&&(this.editor.setPaddingX?.(editorPaddingX),this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible))}async rebindCurrentSession(options={}){_InteractiveMode.restoreCompactionEscapeOverride(this),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let session=this.session;this.unsubscribe?.(),this.unsubscribe=void 0,this.applyRuntimeSettings(),options.renderBeforeBind&&(this.renderCurrentSessionState(),this.subscribeToAgent(),time("render","switch")),await this.bindCurrentSessionExtensions(),time("bindExtensions","switch"),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`);let extensionHint=this.getCrashExtensionHint(error2);extensionHint&&this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",extensionHint),this.outputPad,0)),stopThemeWatcher(),this.stop("transcript"),process.exit(1)}getCrashExtensionHint(error2){try{return formatCrashExtensionHint(findExtensionStackMatches(error2 instanceof Error?error2.stack:void 0,this.session.resourceLoader.getExtensions().extensions))}catch{return}}renderCurrentSessionState(){this.loadedResourcesContainer.clear(),this.chatContainer.clear(),this.pendingMessagesContainer.clear();for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionQueueGeneration+=1,this.compactionQueueFlushTail=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent=void 0,this.streamingMessage=void 0,this.assistantTextSegments.clear(),this.clearPendingTools(),this.clearToolHookStatuses(),this.renderInitialMessages()}getRegisteredToolDefinition(toolName){return withBuiltInRenderers(toolName,this.session.getToolDefinition(toolName)??askUserRenderers(toolName))}getMarkdownTransformers(){return[this.mermaidMarkdownTransformer,...this.session.extensionRunner.getMarkdownTransformers()]}setupExtensionShortcuts(extensionRunner){let shortcuts=extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig()),createContext=()=>({ui:this.createExtensionUIContext(),mode:"tui",hasUI:!0,cwd:this.sessionManager.getCwd(),agentDir:this.session.agentDir,sessionManager:this.sessionManager,modelRegistry:extensionRunner.getModelRegistry(),model:this.session.model,serviceTier:this.session.serviceTier,effectiveServiceTier:this.session.effectiveServiceTier,scopedModels:this.session.scopedModels,thinkingLevel:this.session.thinkingLevel,isIdle:()=>this.session.isIdle,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),signal:this.session.agent.signal,abort:()=>this.session.abort(),hasPendingMessages:()=>this.session.pendingMessageCount>0,requestReload:()=>this.handleReloadCommand(),isCompacting:()=>this.session.isCompacting,shutdown:()=>{this.requestExtensionShutdown()},getContextUsage:()=>this.session.getContextUsage(),getCompactionSettings:()=>this.settingsManager.getCompactionSettings(this.session.model),getPromptCacheSafeWaitSeconds:()=>this.session.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:extensionRunner.createContext().sessionSettings,compact:options=>{(async()=>{try{let result3=await this.session.compact(options?.customInstructions);options?.onComplete?.(result3)}catch(error2){let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}})()},getMessageRevision:()=>this.session.getMessageRevision(),applyCompaction:(precomputed,options)=>this.session.applyCompaction(precomputed,options),getSystemPrompt:()=>this.session.systemPrompt});this.defaultEditor.onExtensionShortcut=data=>{if(this.handleAskUserShortcut(data))return!0;for(let[shortcutStr,shortcut]of shortcuts)if(matchesKey(data,shortcutStr))return Promise.resolve(shortcut.handler(createContext())).catch(err2=>{this.showError(`Shortcut handler error: ${err2 instanceof Error?err2.message:String(err2)}`)}),!0;return!1}}async withBlockedHostDialog(id,label3,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label3,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}setExtensionStatus(key,text2){this.footerDataProvider.setExtensionStatus(key,text2),this.ui.requestRender()}startToolHookStatusTimer(){if(this.hookStatusIntervalId)return;let intervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS);this.hookStatusIntervalId=setInterval(()=>{this.refreshToolHookStatuses()},intervalMs),this.hookStatusIntervalId.unref()}stopToolHookStatusTimer(){this.hookStatusIntervalId&&(clearInterval(this.hookStatusIntervalId),this.hookStatusIntervalId=void 0)}refreshToolHookStatuses(){if(this.hookStatusContainer.clear(),this.activeToolHooks.size===0){this.stopToolHookStatusTimer(),this.ui.requestRender();return}let now2=Date.now();for(let hook of this.activeToolHooks.values()){let elapsedMs=Math.max(0,now2-hook.startedAt),elapsedSeconds=Math.floor(elapsedMs/1e3);this.hookStatusContainer.addChild(new Text(formatToolHookStatusMessageFrame(hook.hookName,hook.statusMessage,elapsedSeconds,elapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),1,0))}this.ui.requestRender()}handleToolHookStatusEvent(event){if(event.phase==="start"){this.activeToolHooks.set(event.hookRunId,event),this.activeToolTerminalTitle=formatToolHookTerminalTitle(event),this.ui.terminal&&this.applyTerminalTitle(),this.startToolHookStatusTimer(),this.refreshToolHookStatuses();return}if(event.phase==="update"){let existing=this.activeToolHooks.get(event.hookRunId);if(!existing)return;let updated={...existing,statusMessage:event.statusMessage};this.activeToolHooks.set(event.hookRunId,updated),this.activeToolTerminalTitle=formatToolHookTerminalTitle(updated),this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses();return}this.activeToolHooks.delete(event.hookRunId);let nextHook=this.activeToolHooks.values().next().value;this.activeToolTerminalTitle=nextHook?formatToolHookTerminalTitle(nextHook):void 0,this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses()}handleToolExecutionStart(event){let label3=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(frame2,elapsedMs)=>formatWorkingStatusShimmerText(frame2,elapsedMs):void 0,messageFormatter:(message,animationElapsedMs)=>formatWorkingStatusMessageFrame(message,this.getWorkingElapsedSeconds(),keyText("app.interrupt"),animationElapsedMs,{base:text2=>theme.fg("dim",text2),glow:text2=>theme.fg("text",text2),highlight:text2=>theme.bold(theme.fg("text",text2)),shimmer:formatWorkingStatusShimmerText,suffix:text2=>theme.fg("dim",text2)}),messageIntervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS)}}showStatusIndicator(indicator){indicator.kind==="working"&&(this.workingStartedAt=Date.now()),this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear();let embedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,indicator);this.activeWorkingIndicatorEmbedded=embedded;let workingTip=indicator.kind==="working"?this.resolveTurnWorkingTip():void 0;if(embedded){workingTip&&appendTipLine(this.statusContainer,theme.fg("dim",workingTip.line));return}if(!workingTip){this.statusContainer.addChild(indicator);return}let wrapper=new Container;wrapper.addChild(indicator),appendTipLine(wrapper,theme.fg("dim",workingTip.line)),this.statusContainer.addChild(wrapper)}resolveTurnWorkingTip(){return this.turnWorkingTip.resolve(()=>resolveWorkingTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),history:this.settingsManager.getTipsHistory(),sessionShownTipIds:this.sessionShownTipIds,now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)}),tip=>this.recordShownTip(tip.tipId))}updateWorkingIndicatorMessage(){this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setMessage(this.workingMessage??this.defaultWorkingMessage)}clearStatusIndicator(kind){if(kind&&this.activeStatusIndicator?.kind!==kind)return;let hadActiveStatusIndicator=this.activeStatusIndicator!==void 0,isClearingWorking=this.activeStatusIndicator?.kind==="working",clearedIndicatorWasEmbedded=this.activeWorkingIndicatorEmbedded,shouldReserveHeight=hadActiveStatusIndicator&&this.options.tuiMode==="regular"&&this.ui.getClearOnShrink(),renderedHeight=shouldReserveHeight?this.statusContainer.render(this.ui.terminal.columns).length:0;if(this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=void 0,isClearingWorking&&(this.workingStartedAt=void 0),this.activeWorkingIndicatorEmbedded=!1,this.statusContainer.clear(),embedStatusIndicatorInEditor(this.defaultEditor,this.editor,void 0),shouldReserveHeight&&(!clearedIndicatorWasEmbedded||renderedHeight>0)){let idleHeight=Math.min(this.ui.terminal.rows,Math.max(1,renderedHeight||2));this.idleStatus.setHeight(idleHeight),this.statusContainer.addChild(this.idleStatus)}}showWorkingStatusIndicator(){let colorFn=isWorkingStatusEditor(this.editor)?text2=>(this.editor.borderColor??theme.getThinkingBorderColor(this.session.thinkingLevel||"off"))(text2):void 0;this.showStatusIndicator(new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions(),colorFn))}setWorkingVisible(visible){if(this.workingVisible=visible,!visible){this.clearStatusIndicator("working"),this.ui.requestRender();return}this.session.isStreaming&&this.activeStatusIndicator?.kind!=="working"&&this.showStatusIndicator(this.chrome?this.chrome.createWorkingIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions()):new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions())),this.ui.requestRender()}setWorkingIndicator(options){this.workingIndicatorOptions=options,this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setIndicator(this.getWorkingIndicatorOptions()),this.ui.requestRender()}setHiddenThinkingLabel(label3){this.hiddenThinkingLabel=label3??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let existing2=map.get(key);existing2?.dispose&&existing2.dispose(),map.delete(key)};if(removeFrom(otherMap),content===void 0){removeFrom(targetMap),this.renderWidgets();return}let component;if(Array.isArray(content)){let container=new Container;for(let line of content.slice(0,_InteractiveMode.MAX_WIDGET_LINES))container.addChild(new Text(line,1,0));content.length>_InteractiveMode.MAX_WIDGET_LINES&&container.addChild(new ThemedText(()=>theme.fg("muted","... (widget truncated)"),1,0)),component=container}else component=content(this.ui,theme);let existing=targetMap.get(key);existing?.dispose&&existing.dispose(),targetMap.set(key,component),this.renderWidgets()}clearExtensionWidgets(){for(let widget of this.extensionWidgetsAbove.values())widget.dispose?.();for(let widget of this.extensionWidgetsBelow.values())widget.dispose?.();this.extensionWidgetsAbove.clear(),this.extensionWidgetsBelow.clear(),this.renderWidgets()}resetExtensionUI(){this.extensionSelector&&this.hideExtensionSelector(),this.extensionInput&&this.hideExtensionInput(),this.extensionEditor&&this.hideExtensionEditor(),this.askUserQuestion&&this.hideQuestionOverlay();for(let state of this.pendingQuestions.values())state.finish({status:"cancelled",answers:{},unanswered:state.request.questions.map(question=>question.id)});this.ui.hideOverlay(),this.clearExtensionTerminalInputListeners(),this.setExtensionFooter(void 0),this.setExtensionHeader(void 0),this.clearExtensionWidgets(),this.footerDataProvider.clearExtensionStatuses(),this.footer.invalidate(),this.autocompleteProviderWrappers=[],this.setCustomEditorComponent(void 0),this.setupAutocompleteProvider(),this.defaultEditor.onExtensionShortcut=void 0,this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.extensionTerminalTitle=void 0,this.updateTerminalTitle(),this.workingMessage=void 0,this.workingVisible=!0,this.setWorkingIndicator(),this.updateWorkingIndicatorMessage(),this.setHiddenThinkingLabel(),this.clearToolHookStatuses()}static{this.MAX_WIDGET_LINES=10}renderWidgets(){!this.widgetContainerAbove||!this.widgetContainerBelow||(this.renderWidgetContainer(this.widgetContainerAbove,this.extensionWidgetsAbove,!0,!0),this.renderWidgetContainer(this.widgetContainerBelow,this.extensionWidgetsBelow,!1,!1),this.ui.requestRender())}renderWidgetContainer(container,widgets,spacerWhenEmpty,leadingSpacer){if(container.clear(),widgets.size===0){spacerWhenEmpty&&container.addChild(new Spacer(1));return}leadingSpacer&&container.addChild(new Spacer(1));for(let component of widgets.values())container.addChild(component)}setExtensionFooter(factory){this.customFooter?.dispose&&this.customFooter.dispose(),this.footerContainer.clear(),factory?(this.customFooter=factory(this.ui,theme,this.footerDataProvider),this.footerContainer.addChild(this.customFooter)):(this.customFooter=void 0,this.footerContainer.addChild(this.footer)),this.ui.requestRender()}setExtensionHeader(factory){if(!this.builtInHeader)return;this.customHeader?.dispose&&this.customHeader.dispose();let currentHeader=this.customHeader||this.builtInHeader,index=this.headerContainer.children.indexOf(currentHeader);factory?(this.customHeader=factory(this.ui,theme),isExpandable(this.customHeader)&&this.customHeader.setExpanded(this.toolOutputExpanded),index!==-1?this.headerContainer.children[index]=this.customHeader:this.headerContainer.children.unshift(this.customHeader)):(this.customHeader=void 0,isExpandable(this.builtInHeader)&&this.builtInHeader.setExpanded(this.toolOutputExpanded),index!==-1&&(this.headerContainer.children[index]=this.builtInHeader)),this.ui.requestRender()}addExtensionTerminalInputListener(handler){let subscription={handler,unsubscribe:this.ui.addInputListener(handler)};return this.extensionTerminalInputSubscriptions.add(subscription),()=>{subscription.unsubscribe(),this.extensionTerminalInputSubscriptions.delete(subscription)}}rebindExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe(),subscription.unsubscribe=this.ui.addInputListener(subscription.handler)}clearExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe();this.extensionTerminalInputSubscriptions.clear()}createProjectTrustContext(cwd){let ui=this.createExtensionUIContext();return{cwd,mode:"tui",hasUI:!0,ui:{select:ui.select,confirm:ui.confirm,input:ui.input,notify:ui.notify}}}createExtensionUIContext(){return{select:(title,options,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionSelector(title,options,opts)),confirm:(title,message,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionConfirm(title,message,opts)),input:(title,placeholder,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionInput(title,placeholder,opts)),question:(request2,opts)=>request2.waitForAnswer?this.showQuestionOverlay(request2,opts):this.showAsyncQuestion(request2,opts),notify:(message,type2)=>this.showExtensionNotify(message,type2),onTerminalInput:handler=>this.addExtensionTerminalInputListener(handler),setStatus:(key,text2)=>this.setExtensionStatus(key,text2),setWorkingMessage:message=>{this.workingMessage=message,this.updateWorkingIndicatorMessage()},setWorkingVisible:visible=>this.setWorkingVisible(visible),setWorkingIndicator:options=>this.setWorkingIndicator(options),setHiddenThinkingLabel:label3=>this.setHiddenThinkingLabel(label3),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor:text2=>this.editor.handleInput(`\x1B[200~${text2}\x1B[201~`),setEditorText:text2=>this.editor.setText(text2),getEditorText:()=>this.getExpandedEditorText(),editor:(title,prefill)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionEditor(title,prefill)),addAutocompleteProvider:factory=>{this.autocompleteProviderWrappers.push(factory),this.setupAutocompleteProvider()},setEditorComponent:factory=>this.setCustomEditorComponent(factory),getEditorComponent:()=>this.editorComponentFactory,get theme(){return theme},getAllThemes:()=>getAvailableThemesWithPaths(),getTheme:name=>getThemeByName(name),setTheme:themeOrName=>{if(themeOrName instanceof Theme)return this.themeController.setThemeInstance(themeOrName);let result3=this.themeController.setThemeName(themeOrName);return result3.success&&this.settingsManager.getTheme()!==themeOrName&&this.settingsManager.setTheme(themeOrName),result3},getToolsExpanded:()=>this.toolOutputExpanded,setToolsExpanded:expanded=>this.setToolsExpanded(expanded)}}showExtensionSelector(title,options,opts){return new Promise(resolve47=>{if(opts?.signal?.aborted){resolve47(void 0);return}let onAbort=()=>{this.hideExtensionSelector(),resolve47(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionSelector=new ExtensionSelectorComponent(title,options,option=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve47(option)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve47(void 0)},{tui:this.ui,timeout:opts?.timeout,onToggleToolsExpanded:()=>this.toggleToolOutputExpansion()}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionSelector),this.ui.setFocus(this.extensionSelector),this.ui.requestRender()})}hideExtensionSelector(){this.extensionSelector?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionSelector=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}async showExtensionConfirm(title,message,opts){return await this.showExtensionSelector(`${title}
2683
- ${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){return await this.showExtensionConfirm("Session cwd not found",formatMissingSessionCwdPrompt(error2.issue))?error2.issue.fallbackCwd:void 0}showExtensionInput(title,placeholder,opts){return new Promise(resolve47=>{if(opts?.signal?.aborted){resolve47(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve47(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value2=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve47(value2)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve47(void 0)},{tui:this.ui,timeout:opts?.timeout}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionInput),this.ui.setFocus(this.extensionInput),this.ui.requestRender()})}hideExtensionInput(){this.extensionInput?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionInput=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showExtensionEditor(title,prefill){return new Promise(resolve47=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value2=>{this.hideExtensionEditor(),resolve47(value2)},()=>{this.hideExtensionEditor(),resolve47(void 0)},void 0,this.settingsManager.getExternalEditorCommand()),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionEditor),this.ui.setFocus(this.extensionEditor),this.ui.requestRender()})}hideExtensionEditor(){this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionEditor=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showQuestionOverlay(request2,opts){return new Promise(resolve47=>{let settled=!1,previousWorkingMessage=this.workingMessage,finish=response=>{settled||(settled=!0,opts?.signal?.removeEventListener("abort",onAbort),this.workingMessage=previousWorkingMessage,this.updateWorkingIndicatorMessage(),this.blockingQuestionHeader=void 0,this.applyTerminalTitle(),this.hideQuestionOverlay(),resolve47(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve47({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing=this.pendingQuestions.get(request2.requestId);if(existing)return existing.completion;let cancelled2=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled2());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled2()),state={request:request2,timeoutMs:opts?.timeout??request2.timeoutMs,askedAtMs:Date.now(),completion:completion.promise,getDeadlineAtMs:opts?.getDeadlineAtMs,onProgress:opts?.onProgress,draft:opts?.initialDraft??{answers:{}},finish:response=>{this.pendingQuestions.get(request2.requestId)===state&&(this.pendingQuestions.delete(request2.requestId),this.pendingOrder=this.pendingOrder.filter(id=>id!==request2.requestId),opts?.signal?.removeEventListener("abort",onAbort),this.composerDestination.kind==="answer"&&this.composerDestination.requestId===request2.requestId&&(this.setComposerReply(),this.editor.getText()!==""&&this.showStatus("That question is no longer pending")),this.pendingOrder.length===0&&this.questionSurface==="list"&&(this.ui.hideOverlay(),this.questionSurface="collapsed"),this.shownQuestionId===request2.requestId&&(this.questionSurface==="expanded"&&this.hideQuestionOverlay(),this.shownQuestionId=this.pendingOrder[0]),this.refreshAsyncWidget(),completion.resolve(response))}};return this.pendingQuestions.set(request2.requestId,state),this.pendingOrder.push(request2.requestId),this.shownQuestionId??=request2.requestId,this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}sessionControlContext(){return{session:this.session,agentDir:this.session.agentDir,surface:{draftHold:()=>this.sessionControlHost.submissionInFlight()?"draft":this.composerHold(),blockingQuestion:()=>this.askUserQuestion!==void 0,pendingQuestionIds:()=>[...this.pendingQuestions.keys()],pendingQuestion:requestId=>this.pendingQuestions.get(requestId)?.request,answerQuestion:(requestId,response)=>{let state=this.pendingQuestions.get(requestId);return state?.finish(response),state!==void 0},notice:line=>this.showWarning(line),selectModel:model=>_InteractiveMode.applyModelSelection(this,model,{source:"control"}),selectThinkingLevel:(level,remember)=>_InteractiveMode.applyThinkingLevel(this,level,remember),interruptTurn:async()=>{await this.abortAndFireQueuedMessages()}}}}composerHold(){return this.pendingImages.size>0?"attachment":this.editor.getText().trim()===""?void 0:"draft"}refreshAsyncWidget(){this.sessionControlHost?.questionsChanged(),this.syncQuestionMouseCapture(),this.applyTerminalTitle();let state=this.shownQuestion;if(!state||this.questionSurface==="expanded"){this.setExtensionWidget(ASK_USER_WIDGET_KEY,void 0);return}this.setExtensionWidget(ASK_USER_WIDGET_KEY,tui=>new AskUserAsyncWidget({request:state.request,draft:state.draft,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,pendingCount:this.pendingOrder.length,tui,mouseCaptureActive:this.terminalMouseMode!=="off",onExpandClick:()=>this.expandPendingQuestion(state.request.requestId),onNextQuestion:()=>this.cyclePendingQuestion(),onOptionClick:index=>this.clickPendingQuestion(state,index),onOwnAnswerClick:()=>this.clickPendingQuestion(state,"own-answer"),onExpire:()=>state.finish(buildTimedOutResponse(state.request,state.draft,Date.now()-state.askedAtMs))}))}cyclePendingQuestion(){if(this.pendingOrder.length<2)return;let index=this.pendingOrder.indexOf(this.shownQuestionId);this.shownQuestionId=this.pendingOrder[(index+1)%this.pendingOrder.length],this.refreshAsyncWidget()}clickPendingQuestion(state,option){let unanswered=unansweredIds2(state.request,state.draft),index=state.request.questions.findIndex(question=>question.id===unanswered[0]);if(index<0){state.finish(buildAnsweredResponse(state.request,state.draft));return}this.expandPendingQuestion(state.request.requestId,index)&&(option==="own-answer"?this.askUserQuestion.openOwnAnswer():this.askUserQuestion.clickOption(option,!0))}handleAskUserShortcut(data){let state=this.shownQuestion;if(!state||this.askUserQuestion||this.ui.hasOverlay()||this.extensionSelector||this.extensionInput||this.extensionEditor)return!1;if(matchesAskUserAnswerKey(data))return this.expandPendingQuestion();if(this.editor.getText()!==""||this.ui.getFocusedComponent()!==this.editor||this.defaultEditor.isShowingAutocomplete())return!1;if(this.keybindings.matches(data,"app.question.next"))return this.pendingOrder.length<2?!1:(this.cyclePendingQuestion(),!0);let unanswered=unansweredIds2(state.request,state.draft),questionIndex=state.request.questions.findIndex(question2=>question2.id===unanswered[0]),question=state.request.questions[questionIndex];if(/^[1-9]$/.test(data)&&question?.options[Number(data)-1])return this.expandPendingQuestion(state.request.requestId,questionIndex,data),!0;let printable=decodeKittyPrintable(data)??data;return(data.startsWith("\x1B[200~")||printable!==""&&!/[\x00-\x1f\x7f]/.test(printable)&&!/^[/!]/.test(printable))&&this.setComposerReply(state.request.requestId),!1}setComposerReply(requestId){this.composerDestination=requestId===void 0?{kind:"chat"}:{kind:"answer",requestId};let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);this.defaultEditor.setReplyLabel(state?theme.fg("muted",`\u21B3 reply to ${state.request.questions[0].header} \xB7 ${keyText("app.message.followUp")} sends as message`):void 0),this.ui.requestRender()}async handleAnswerCommand(argument){let state=this.shownQuestion;if(!state){this.showStatus("No question is pending.");return}if(argument==="skip"){let response={status:"cancelled",answers:state.draft.answers??{},unanswered:unansweredIds2(state.request,state.draft)};state.finish(response),await state.completion,this.showStatus("The user dismissed the question."),await this.session.sendUserMessage(formatUserMessage(response,state.request.requestId,state.request.questions),{deliverAs:this.session.isStreaming?"steer":"followUp"});return}if(argument!==""){let id=/^[1-9]\d*$/.test(argument)?this.pendingOrder[Number(argument)-1]:void 0;if(id===void 0){this.showStatus("Choose a pending question number or /answer skip.");return}this.expandPendingQuestion(id);return}if(this.pendingOrder.length===1){this.expandPendingQuestion();return}let list4=new SelectList(this.pendingOrder.map(id=>{let pending=this.pendingQuestions.get(id),remaining=(pending.getDeadlineAtMs?.()??pending.askedAtMs+pending.timeoutMs)-Date.now();return{value:id,label:`${pending.request.questions[0].header} \xB7 ${formatCountdownLabel(Date.now()-pending.askedAtMs)} ago \xB7 ${formatCountdownLabel(remaining)} remaining`}}),10,getSelectListTheme()),close=()=>{this.ui.hideOverlay(),this.questionSurface="collapsed"};list4.onCancel=close,list4.onSelect=({value:value2})=>{close(),this.expandPendingQuestion(value2)},this.questionSurface="list",this.ui.showOverlay(list4,{width:"80%",anchor:"bottom-center"})}expandPendingQuestion(requestId=this.shownQuestionId,initialQuestionIndex,initialInput){let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);if(!state||this.askUserQuestion)return!1;this.shownQuestionId=state.request.requestId;let component=new AskUserQuestionComponent(state.request,response=>{if(this.pendingQuestions.get(state.request.requestId)===state){if(response.status!=="cancelled"){state.finish(response);return}this.hideQuestionOverlay(),this.refreshAsyncWidget()}},{tui:this.ui,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,initialDraft:state.draft,initialQuestionIndex,onProgress:draft=>{state.draft=draft,state.onProgress?.(draft)}});return this.askUserQuestion=component,this.questionSurface="expanded",this.refreshAsyncWidget(),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender(),initialInput!==void 0&&component.handleInput(initialInput),!0}submitAsyncQuestionComment(text2){let destination=this.composerDestination,state=destination.kind==="answer"?this.pendingQuestions.get(destination.requestId):void 0;return state?(this.setComposerReply(),this.editor.addToHistory?.(text2),this.editor.setText(""),state.finish(buildCommentResponse(state.request,state.draft,text2)),!0):!1}getExpandedEditorText(){return expandEditorSubmission(this.editor,this.editor.getText())}setCustomEditorComponent(factory){if(this.editorComponentFactory=factory,!(!factory&&this.editor===this.defaultEditor)){if(this.disposeActiveSelector(),this.editorContainer.clear(),factory){let newEditor=factory(this.ui,this.chrome?this.chrome.getEditorTheme():getEditorTheme(),this.keybindings);newEditor.onSubmit=text2=>{this.defaultEditor.onSubmit?.(expandSubmittedText(newEditor,text2))},newEditor.onChange=this.defaultEditor.onChange,transferEditorContent(this.editor,newEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(newEditor),newEditor.borderColor!==void 0&&(newEditor.borderColor=this.defaultEditor.borderColor),newEditor.setPaddingX!==void 0&&newEditor.setPaddingX(this.defaultEditor.getPaddingX()),newEditor.setAutocompleteMaxVisible!==void 0&&newEditor.setAutocompleteMaxVisible(this.defaultEditor.getAutocompleteMaxVisible()),newEditor.setAutocompleteProvider&&this.autocompleteProvider&&newEditor.setAutocompleteProvider(this.autocompleteProvider);let customEditor=newEditor;if("actionHandlers"in customEditor&&customEditor.actionHandlers instanceof Map){customEditor.onEscape||(customEditor.onEscape=()=>this.defaultEditor.onEscape?.()),customEditor.onCtrlD||(customEditor.onCtrlD=()=>this.defaultEditor.onCtrlD?.()),customEditor.onPasteImage||(customEditor.onPasteImage=()=>this.defaultEditor.onPasteImage?.()),customEditor.onExtensionShortcut||(customEditor.onExtensionShortcut=data=>this.defaultEditor.onExtensionShortcut?.(data));for(let[action,handler]of this.defaultEditor.actionHandlers)customEditor.actionHandlers.set(action,handler)}this.editor=newEditor}else this.editor!==this.defaultEditor&&(transferEditorContent(this.editor,this.defaultEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(this.defaultEditor)),this.editor=this.defaultEditor;this.editorContainer.addChild(this.editor),this.activeStatusIndicator&&(this.statusContainer.clear(),this.activeWorkingIndicatorEmbedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,this.activeStatusIndicator),this.activeWorkingIndicatorEmbedded||this.statusContainer.addChild(this.activeStatusIndicator)),this.ui.setFocus(this.editor),this.ui.requestRender()}}showExtensionNotify(message,type2){type2==="error"?this.showError(message):type2==="warning"?this.showWarning(message):this.showStatus(message)}async showExtensionCustom(factory,options){let savedText=this.editor.getText(),isOverlay=options?.overlay??!1,restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.editor.setText(savedText),this.ui.setFocus(this.editor),this.ui.requestRender()};return new Promise((resolve47,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve47(result3);try{component?.dispose?.()}catch{}}};Promise.resolve(factory(this.ui,theme,this.keybindings,close)).then(c=>{if(!closed)if(component=c,isOverlay){let overlayOptions=(()=>{if(options?.overlayOptions)return typeof options.overlayOptions=="function"?options.overlayOptions():options.overlayOptions;let w=component.width;return w?{width:w}:void 0})(),handle=this.ui.showOverlay(component,overlayOptions);options?.onHandle?.(handle)}else this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}).catch(err2=>{closed||(isOverlay||restoreEditor(),reject(err2))})})}showExtensionError(error2){let errorMsg=formatExtensionErrorHeadline(error2),errorText6=new ThemedText(()=>theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText6),error2.stack){let stackLines=error2.stack.split(`
2678
+ ${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){return await this.showExtensionConfirm("Session cwd not found",formatMissingSessionCwdPrompt(error2.issue))?error2.issue.fallbackCwd:void 0}showExtensionInput(title,placeholder,opts){return new Promise(resolve47=>{if(opts?.signal?.aborted){resolve47(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve47(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value2=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve47(value2)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve47(void 0)},{tui:this.ui,timeout:opts?.timeout}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionInput),this.ui.setFocus(this.extensionInput),this.ui.requestRender()})}hideExtensionInput(){this.extensionInput?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionInput=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showExtensionEditor(title,prefill){return new Promise(resolve47=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value2=>{this.hideExtensionEditor(),resolve47(value2)},()=>{this.hideExtensionEditor(),resolve47(void 0)},void 0,this.settingsManager.getExternalEditorCommand()),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionEditor),this.ui.setFocus(this.extensionEditor),this.ui.requestRender()})}hideExtensionEditor(){this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionEditor=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showQuestionOverlay(request2,opts){return new Promise(resolve47=>{let settled=!1,previousWorkingMessage=this.workingMessage,finish=response=>{settled||(settled=!0,opts?.signal?.removeEventListener("abort",onAbort),this.workingMessage=previousWorkingMessage,this.updateWorkingIndicatorMessage(),this.blockingQuestionHeader=void 0,this.applyTerminalTitle(),this.hideQuestionOverlay(),resolve47(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve47({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing=this.pendingQuestions.get(request2.requestId);if(existing)return existing.completion;let cancelled2=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled2());let completion=Promise.withResolvers(),onAbort=()=>state.finish(cancelled2()),state={request:request2,timeoutMs:opts?.timeout??request2.timeoutMs,askedAtMs:Date.now(),completion:completion.promise,getDeadlineAtMs:opts?.getDeadlineAtMs,onProgress:opts?.onProgress,draft:opts?.initialDraft??{answers:{}},finish:response=>{this.pendingQuestions.get(request2.requestId)===state&&(this.pendingQuestions.delete(request2.requestId),this.pendingOrder=this.pendingOrder.filter(id=>id!==request2.requestId),opts?.signal?.removeEventListener("abort",onAbort),this.composerDestination.kind==="answer"&&this.composerDestination.requestId===request2.requestId&&(this.setComposerReply(),this.editor.getText()!==""&&this.showStatus("That question is no longer pending")),this.pendingOrder.length===0&&this.questionSurface==="list"&&(this.ui.hideOverlay(),this.questionSurface="collapsed"),this.shownQuestionId===request2.requestId&&(this.questionSurface==="expanded"&&this.hideQuestionOverlay(),this.shownQuestionId=this.pendingOrder[0]),this.refreshAsyncWidget(),completion.resolve(response))}};return this.pendingQuestions.set(request2.requestId,state),this.pendingOrder.push(request2.requestId),this.shownQuestionId??=request2.requestId,this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}sessionControlContext(){return{session:this.session,agentDir:this.session.agentDir,surface:{draftHold:()=>this.sessionControlHost.submissionInFlight()?"draft":this.composerHold(),blockingQuestion:()=>this.askUserQuestion!==void 0,pendingQuestionIds:()=>[...this.pendingQuestions.keys()],pendingQuestion:requestId=>this.pendingQuestions.get(requestId)?.request,answerQuestion:(requestId,response)=>{let state=this.pendingQuestions.get(requestId);return state?.finish(response),state!==void 0},notice:line=>this.showWarning(line),selectModel:model=>_InteractiveMode.applyModelSelection(this,model,{source:"control"}),selectThinkingLevel:(level,remember)=>_InteractiveMode.applyThinkingLevel(this,level,remember),interruptTurn:async()=>{await this.abortAndFireQueuedMessages()}}}}composerHold(){return this.pendingImages.size>0?"attachment":this.editor.getText().trim()===""?void 0:"draft"}refreshAsyncWidget(){this.sessionControlHost?.questionsChanged(),this.syncQuestionMouseCapture(),this.applyTerminalTitle();let state=this.shownQuestion;if(!state||this.questionSurface==="expanded"){this.setExtensionWidget(ASK_USER_WIDGET_KEY,void 0);return}this.setExtensionWidget(ASK_USER_WIDGET_KEY,tui=>new AskUserAsyncWidget({request:state.request,draft:state.draft,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,pendingCount:this.pendingOrder.length,tui,mouseCaptureActive:this.terminalMouseMode!=="off",onExpandClick:()=>this.expandPendingQuestion(state.request.requestId),onNextQuestion:()=>this.cyclePendingQuestion(),onOptionClick:index=>this.clickPendingQuestion(state,index),onOwnAnswerClick:()=>this.clickPendingQuestion(state,"own-answer"),onExpire:()=>state.finish(buildTimedOutResponse(state.request,state.draft,Date.now()-state.askedAtMs))}))}cyclePendingQuestion(){if(this.pendingOrder.length<2)return;let index=this.pendingOrder.indexOf(this.shownQuestionId);this.shownQuestionId=this.pendingOrder[(index+1)%this.pendingOrder.length],this.refreshAsyncWidget()}clickPendingQuestion(state,option){let unanswered=unansweredIds2(state.request,state.draft),index=state.request.questions.findIndex(question=>question.id===unanswered[0]);if(index<0){state.finish(buildAnsweredResponse(state.request,state.draft));return}this.expandPendingQuestion(state.request.requestId,index)&&(option==="own-answer"?this.askUserQuestion.openOwnAnswer():this.askUserQuestion.clickOption(option,!0))}handleAskUserShortcut(data){let state=this.shownQuestion;if(!state||this.askUserQuestion||this.ui.hasOverlay()||this.extensionSelector||this.extensionInput||this.extensionEditor)return!1;if(matchesAskUserAnswerKey(data))return this.expandPendingQuestion();if(this.editor.getText()!==""||this.ui.getFocusedComponent()!==this.editor||this.defaultEditor.isShowingAutocomplete())return!1;if(this.keybindings.matches(data,"app.question.next"))return this.pendingOrder.length<2?!1:(this.cyclePendingQuestion(),!0);let unanswered=unansweredIds2(state.request,state.draft),questionIndex=state.request.questions.findIndex(question2=>question2.id===unanswered[0]),question=state.request.questions[questionIndex];if(/^[1-9]$/.test(data)&&question?.options[Number(data)-1])return this.expandPendingQuestion(state.request.requestId,questionIndex,data),!0;let printable=decodeKittyPrintable(data)??data;return(data.startsWith("\x1B[200~")||printable!==""&&!/[\x00-\x1f\x7f]/.test(printable)&&!/^[/!]/.test(printable))&&this.setComposerReply(state.request.requestId),!1}setComposerReply(requestId){this.composerDestination=requestId===void 0?{kind:"chat"}:{kind:"answer",requestId};let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);this.defaultEditor.setReplyLabel(state?theme.fg("muted",`\u21B3 reply to ${state.request.questions[0].header} \xB7 ${keyText("app.message.followUp")} sends as message`):void 0),this.ui.requestRender()}async handleAnswerCommand(argument){let state=this.shownQuestion;if(!state){this.showStatus("No question is pending.");return}if(argument==="skip"){let response={status:"cancelled",answers:state.draft.answers??{},unanswered:unansweredIds2(state.request,state.draft)};state.finish(response),await state.completion,this.showStatus("The user dismissed the question."),await this.session.sendUserMessage(formatUserMessage(response,state.request.requestId,state.request.questions,state.request.required===!0),{deliverAs:this.session.isStreaming?"steer":"followUp"});return}if(argument!==""){let id=/^[1-9]\d*$/.test(argument)?this.pendingOrder[Number(argument)-1]:void 0;if(id===void 0){this.showStatus("Choose a pending question number or /answer skip.");return}this.expandPendingQuestion(id);return}if(this.pendingOrder.length===1){this.expandPendingQuestion();return}let list4=new SelectList(this.pendingOrder.map(id=>{let pending=this.pendingQuestions.get(id),remaining=(pending.getDeadlineAtMs?.()??pending.askedAtMs+pending.timeoutMs)-Date.now();return{value:id,label:`${pending.request.questions[0].header} \xB7 ${formatCountdownLabel(Date.now()-pending.askedAtMs)} ago \xB7 ${formatCountdownLabel(remaining)} remaining`}}),10,getSelectListTheme()),close=()=>{this.ui.hideOverlay(),this.questionSurface="collapsed"};list4.onCancel=close,list4.onSelect=({value:value2})=>{close(),this.expandPendingQuestion(value2)},this.questionSurface="list",this.ui.showOverlay(list4,{width:"80%",anchor:"bottom-center"})}expandPendingQuestion(requestId=this.shownQuestionId,initialQuestionIndex,initialInput){let state=requestId===void 0?void 0:this.pendingQuestions.get(requestId);if(!state||this.askUserQuestion)return!1;this.shownQuestionId=state.request.requestId;let component=new AskUserQuestionComponent(state.request,response=>{if(this.pendingQuestions.get(state.request.requestId)===state){if(response.status!=="cancelled"){state.finish(response);return}this.hideQuestionOverlay(),this.refreshAsyncWidget()}},{tui:this.ui,timeoutMs:state.timeoutMs,getDeadlineAtMs:state.getDeadlineAtMs,initialDraft:state.draft,initialQuestionIndex,onProgress:draft=>{state.draft=draft,state.onProgress?.(draft)}});return this.askUserQuestion=component,this.questionSurface="expanded",this.refreshAsyncWidget(),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender(),initialInput!==void 0&&component.handleInput(initialInput),!0}submitAsyncQuestionComment(text2){let destination=this.composerDestination,state=destination.kind==="answer"?this.pendingQuestions.get(destination.requestId):void 0;return state?(this.setComposerReply(),this.editor.addToHistory?.(text2),this.editor.setText(""),state.finish(buildCommentResponse(state.request,state.draft,text2)),!0):!1}getExpandedEditorText(){return expandEditorSubmission(this.editor,this.editor.getText())}setCustomEditorComponent(factory){if(this.editorComponentFactory=factory,!(!factory&&this.editor===this.defaultEditor)){if(this.disposeActiveSelector(),this.editorContainer.clear(),factory){let newEditor=factory(this.ui,this.chrome?this.chrome.getEditorTheme():getEditorTheme(),this.keybindings);newEditor.onSubmit=text2=>{this.defaultEditor.onSubmit?.(expandSubmittedText(newEditor,text2))},newEditor.onChange=this.defaultEditor.onChange,transferEditorContent(this.editor,newEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(newEditor),newEditor.borderColor!==void 0&&(newEditor.borderColor=this.defaultEditor.borderColor),newEditor.setPaddingX!==void 0&&newEditor.setPaddingX(this.defaultEditor.getPaddingX()),newEditor.setAutocompleteMaxVisible!==void 0&&newEditor.setAutocompleteMaxVisible(this.defaultEditor.getAutocompleteMaxVisible()),newEditor.setAutocompleteProvider&&this.autocompleteProvider&&newEditor.setAutocompleteProvider(this.autocompleteProvider);let customEditor=newEditor;if("actionHandlers"in customEditor&&customEditor.actionHandlers instanceof Map){customEditor.onEscape||(customEditor.onEscape=()=>this.defaultEditor.onEscape?.()),customEditor.onCtrlD||(customEditor.onCtrlD=()=>this.defaultEditor.onCtrlD?.()),customEditor.onPasteImage||(customEditor.onPasteImage=()=>this.defaultEditor.onPasteImage?.()),customEditor.onExtensionShortcut||(customEditor.onExtensionShortcut=data=>this.defaultEditor.onExtensionShortcut?.(data));for(let[action,handler]of this.defaultEditor.actionHandlers)customEditor.actionHandlers.set(action,handler)}this.editor=newEditor}else this.editor!==this.defaultEditor&&(transferEditorContent(this.editor,this.defaultEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(this.defaultEditor)),this.editor=this.defaultEditor;this.editorContainer.addChild(this.editor),this.activeStatusIndicator&&(this.statusContainer.clear(),this.activeWorkingIndicatorEmbedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,this.activeStatusIndicator),this.activeWorkingIndicatorEmbedded||this.statusContainer.addChild(this.activeStatusIndicator)),this.ui.setFocus(this.editor),this.ui.requestRender()}}showExtensionNotify(message,type2){type2==="error"?this.showError(message):type2==="warning"?this.showWarning(message):this.showStatus(message)}async showExtensionCustom(factory,options){let savedText=this.editor.getText(),isOverlay=options?.overlay??!1,restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.editor.setText(savedText),this.ui.setFocus(this.editor),this.ui.requestRender()};return new Promise((resolve47,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve47(result3);try{component?.dispose?.()}catch{}}};Promise.resolve(factory(this.ui,theme,this.keybindings,close)).then(c=>{if(!closed)if(component=c,isOverlay){let overlayOptions=(()=>{if(options?.overlayOptions)return typeof options.overlayOptions=="function"?options.overlayOptions():options.overlayOptions;let w=component.width;return w?{width:w}:void 0})(),handle=this.ui.showOverlay(component,overlayOptions);options?.onHandle?.(handle)}else this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}).catch(err2=>{closed||(isOverlay||restoreEditor(),reject(err2))})})}showExtensionError(error2){let errorMsg=formatExtensionErrorHeadline(error2),errorText6=new ThemedText(()=>theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText6),error2.stack){let stackLines=error2.stack.split(`
2684
2679
  `).slice(1);if(stackLines.length>0){let renderStack=()=>stackLines.map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
2685
2680
  `);this.chatContainer.addChild(new ThemedText(renderStack,1,0))}}this.ui.requestRender()}setupKeyHandlers(){this.defaultEditor.onEscape=()=>{if(this.refusedUnknownCommandText=void 0,this.session.isStreaming||this.session.retryAttempt>0)this.abortAndFireQueuedMessages().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)));else if(this.session.isBashRunning)this.session.abortBash();else if(this.isBashMode)this.editor.setText(""),this.isBashMode=!1,this.updateEditorBorderColor();else if(!this.editor.getText().trim()){let action=this.settingsManager.getDoubleEscapeAction();if(action!=="none"){let now2=Date.now();now2-this.lastEscapeTime<500?(action==="tree"?this.showTreeSelector():this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2))),this.lastEscapeTime=0):this.lastEscapeTime=now2}}},this.defaultEditor.onAction("app.clear",()=>this.handleCtrlC()),this.defaultEditor.onCtrlD=()=>this.handleCtrlD(),this.defaultEditor.onAction("app.suspend",()=>this.handleCtrlZ()),this.defaultEditor.onAction("app.thinking.cycle",()=>{this.cycleThinkingLevel().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.model.cycleForward",()=>this.cycleModel("forward")),this.defaultEditor.onAction("app.model.cycleBackward",()=>this.cycleModel("backward")),this.ui.onDebug=()=>this.handleDebugCommand(),this.defaultEditor.onAction("app.model.select",()=>this.showModelSelector()),this.defaultEditor.onAction("app.history.search",async()=>{try{await this.session.prompt("/history")}catch(error2){this.showError(`Failed to open history search: ${error2 instanceof Error?error2.message:String(error2)}`)}}),this.defaultEditor.onAction("app.tools.expand",()=>this.toggleToolOutputExpansion()),this.defaultEditor.onAction("app.thinking.toggle",()=>this.toggleThinkingBlockVisibility()),this.defaultEditor.onAction("app.editor.external",()=>{this.handleOpenExternalEditor()}),this.defaultEditor.onAction("app.message.copy",()=>{this.handleCopyCommand({flashConfirmation:!0,preferSelection:!0})}),this.defaultEditor.onAction("app.message.followUp",()=>this.handleFollowUp()),this.defaultEditor.onAction("app.message.dequeue",()=>this.handleDequeue()),this.defaultEditor.onAction("app.session.new",()=>this.handleClearCommand()),this.defaultEditor.onAction("app.session.tree",()=>this.showTreeSelector()),this.defaultEditor.onAction("app.session.fork",()=>{this.showUserMessageSelector().catch(error2=>this.showError(error2 instanceof Error?error2.message:String(error2)))}),this.defaultEditor.onAction("app.session.resume",()=>this.showSessionSelector()),this.defaultEditor.onAction("app.session.renameCurrent",()=>this.showSessionRenameInput()),this.defaultEditor.onChange=text2=>{let wasBashMode=this.isBashMode;this.isBashMode=text2.trimStart().startsWith("!"),wasBashMode!==this.isBashMode&&this.updateEditorBorderColor(),this.updateShortcutOverlay(text2)},this.subscribeImageMarkers(this.defaultEditor),this.defaultEditor.onPasteImage=()=>{this.lastInputWasPaste=!0,this.handleClipboardPaste()};let previousEscapeHandler=this.defaultEditor.onEscape;this.defaultEditor.onEscape=()=>{this.hideShortcutOverlay(),previousEscapeHandler?.()}}async handleRightClickPaste(){let target=this.renderer.getFocusedComponent(),handleInput=target?.handleInput;if(!(!target||!handleInput))try{let text2=await readClipboardText();if(!text2||this.renderer.getFocusedComponent()!==target)return;handleInput.call(target,`\x1B[200~${text2}\x1B[201~`),this.ui.requestRender()}catch{}}async handleClipboardPaste(){try{let filePaths=await readClipboardFilePaths();if(filePaths){if(filePaths.some(filePath=>new RegExp("\\p{Cc}","u").test(filePath)))throw new Error("Clipboard file path contains control characters");let paths=this.isBashMode?filePaths.map(quoteIfNeeded).join(" "):filePaths.join(`
2686
2681
  `),cursor=this.editor.getCursor?.(),currentLine=cursor?this.editor.getText().split(`