@code-yeongyu/senpi 2026.10.9 → 2026.10.10

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 (61) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/bundle/chunks/{app-server-command-2HNDZGTR.js → app-server-command-SZWKEC36.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-MJGHZT4N.js → chunk-3A3C5VVO.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-6EH7QXOG.js → chunk-6VVV27W2.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-CB77NQMN.js → chunk-7GVD54RM.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-CM5QTRC2.js → chunk-H67EVDWG.js} +1 -1
  7. package/dist/bundle/chunks/chunk-IZOTKUWG.js +2 -0
  8. package/dist/bundle/chunks/chunk-N3QEG537.js +14 -0
  9. package/dist/bundle/chunks/{chunk-LUWWM7GA.js → chunk-RADHRQ4K.js} +3 -3
  10. package/dist/bundle/chunks/{chunk-DERNLWDS.js → chunk-WQ77WBQW.js} +26 -26
  11. package/dist/bundle/chunks/{cli-main-VMDAGZCA.js → cli-main-C3AS73Q4.js} +1 -1
  12. package/dist/bundle/chunks/{host-command-HTYYQBSG.js → host-command-X64D7PT3.js} +1 -1
  13. package/dist/bundle/chunks/{host-lifecycle-XZF6IKKO.js → host-lifecycle-GC3GIR2N.js} +1 -1
  14. package/dist/bundle/chunks/{interactive-mode-U7IH4VMJ.js → interactive-mode-KUP43WXL.js} +1 -1
  15. package/dist/bundle/chunks/{multi-session-host-HHIC6N7C.js → multi-session-host-EM24ZBGK.js} +1 -1
  16. package/dist/bundle/chunks/{package-manager-cli-2FXWPM2U.js → package-manager-cli-MGFHGI5O.js} +1 -1
  17. package/dist/bundle/chunks/{rpc-mode-K5YGBGQO.js → rpc-mode-2GT75YBZ.js} +1 -1
  18. package/dist/bundle/chunks/{schedule-command-CVAPK2WQ.js → schedule-command-EQ4PQCRP.js} +1 -1
  19. package/dist/bundle/chunks/{session-control-endpoint-THEF3K7M.js → session-control-endpoint-DOIW7IBF.js} +2 -2
  20. package/dist/bundle/chunks/session-worker.js +37 -37
  21. package/dist/bundle/cli.js +1 -1
  22. package/dist/bundle/index.js +1 -1
  23. package/dist/bundle/rpc-entry.js +1 -1
  24. package/dist/bundle/runtime-manifest.json +1 -1
  25. package/dist/core/agent-session-runtime.d.ts +9 -0
  26. package/dist/core/agent-session-runtime.js +22 -0
  27. package/dist/core/agent-session.d.ts +12 -1
  28. package/dist/core/agent-session.js +36 -4
  29. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +5 -0
  30. package/dist/core/extensions/builtin/compaction/context-pipeline.js +1 -0
  31. package/dist/core/extensions/builtin/compaction/index.js +1 -0
  32. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +7 -0
  33. package/dist/core/extensions/builtin/compaction/lane-policy.js +28 -15
  34. package/dist/core/extensions/builtin/rules/rules/finder.js +8 -3
  35. package/dist/core/sdk.js +7 -3
  36. package/dist/core/thinking-levels.d.ts +23 -1
  37. package/dist/core/thinking-levels.js +37 -0
  38. package/dist/main.js +12 -13
  39. package/dist/modes/interactive/interactive-mode.js +8 -0
  40. package/dist/modes/interactive/session-control-endpoint.js +33 -8
  41. package/dist/modes/interactive/session-control-registry.js +3 -1
  42. package/dist/modes/interactive/session-control-wake.d.ts +11 -5
  43. package/dist/modes/interactive/session-control-wake.js +38 -16
  44. package/dist/modes/rpc/connection-handler.d.ts +5 -0
  45. package/dist/modes/rpc/connection-handler.js +29 -2
  46. package/dist/modes/rpc/custom-capability.d.ts +6 -0
  47. package/dist/modes/rpc/custom-capability.js +6 -0
  48. package/dist/modes/rpc/host-daemon-paths.d.ts +5 -4
  49. package/dist/modes/rpc/host-daemon-paths.js +17 -9
  50. package/dist/modes/rpc/host-daemon-registration.d.ts +6 -1
  51. package/dist/modes/rpc/host-daemon-registration.js +6 -2
  52. package/dist/modes/rpc/host-session-control.js +6 -4
  53. package/dist/modes/rpc/rpc-client.d.ts +5 -0
  54. package/dist/modes/rpc/rpc-client.js +7 -0
  55. package/dist/modes/rpc/rpc-mode.js +1 -1
  56. package/dist/modes/rpc/rpc-types.d.ts +9 -0
  57. package/docs/json.md +3 -0
  58. package/docs/rpc.md +35 -0
  59. package/package.json +6 -6
  60. package/dist/bundle/chunks/chunk-M3BQ2PAQ.js +0 -14
  61. package/dist/bundle/chunks/chunk-VJJ53ORU.js +0 -2
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,trackTurnAdmission,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-M3BQ2PAQ.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-QNAG7FYM.js";import{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,unregisterSessionWriter,withVirtualModels}from"./chunk-3YXB7Z7O.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-SB22X6ZR.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-M2IHGL3M.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-J5MUMVWB.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clientMessageIdentity,createFsWatchEventSource,readClientMessageIdentity}from"./chunk-6EH7QXOG.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-CB77NQMN.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-VJJ53ORU.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-CM5QTRC2.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-Q2ZTPMWD.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-F6EQ7EV3.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-MJGHZT4N.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-LUWWM7GA.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7Q3EY6HH.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6SMU7ANE.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-MH2BFYGN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-LSE7KE2C.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-KC5TT7DH.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-KEMQXWPY.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getInteractiveAssetsDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,getThemesDir,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-YSPHACIN.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-2WEI2XTZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-XL5KIYQF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path15,{windows}={})=>{let segs=path15.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse7=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open8.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse7(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse7.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse7(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync48,mkdirSync as mkdirSync26,readFileSync as readFileSync46,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname51}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await result3(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await result3();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve46=>{let abortHandler=()=>resolve46(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve46,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve46(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve46=>{signal.addEventListener("abort",()=>resolve46(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve46=>{resolvePromise=resolve46});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve46,reject)=>{resolveCompletion=resolve46,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
2
+ import{ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,AssistantEditError,BUILT_IN_PROVIDER_DISPLAY_NAMES,CODEX_RESPONSES_API,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,ContinueFromLeafError,MCP_CONTROL_INVENTORY_CHANGED_EVENT,MCP_CONTROL_INVENTORY_REQUEST_EVENT,RESERVED_MEMORY_REPORT_KEYS,RPC_ERROR_UNKNOWN_COMMAND,SENTINEL_OAUTH_FIELDS,SessionStreamingError,UnknownCommandError,UserEditError,addAccount,all_exports,assertExpectedLeaf,assertExpectedUserLeaf,assertValidAccountName,assistantTextEquals,buildEditedAssistantMessage,buildEditedUserMessage,builtinProviders,clampThinkingSelection,classifyReasoningCapability,commandShapedName,compat_exports,completeSimple,cursorProvider,emitProviderAccountFailover,emitProviderAccountsChanged,emptyCredential,envSlotToken,findUnknownCommand,formatThinkingClampWarning,generateImages,getBuiltinModelDataGeneratedAt,getCredentialAccounts,getCursorContextLimit,getImageModel,getModels,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,installMemoryReportSignal,isMcpControlInventoryRequest,listAccounts,loadAnthropicOAuth,pinCredentialAccount,pinProviderAccount,readOwnFootprint,readProcessFootprint,refreshSlot,registerBundledOAuthFlowLoaders,registerMemoryReportSession,registerTuiRenderCacheSource,removeCredentialAccount,removeProviderAccount,renameCredentialAccount,resetApiProviders,resolveCursorContextWindow,runRpcMode,serviceTierExtension,serviceTierForProvider,stream,streamSimple,summarizeCredentialAccounts,supportsMax,supportsServiceTier,supportsXhigh,toJsonEvent,trackTurnAdmission,ultrafastSelectionWarning,unknownCommandErrorFromWire,upsertAccount,userTextEquals}from"./chunk-N3QEG537.js";import{InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock}from"./chunk-QNAG7FYM.js";import{CURRENT_SESSION_VERSION,CountdownTimer,DefaultPackageManager,DynamicBorder,ExtensionInputComponent,ExtensionSelectorComponent,GOAL_CONTINUATION_MESSAGE_TYPE,InteractiveThemeController,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SessionManager,SessionSelectorComponent,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,areExperimentalFeaturesEnabled,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createBranchSummaryMessage,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,environmentContextMessageIfChanged,findLatestResponse,formatKeyText,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,isContextExcludedCustomMessage,isVirtualModel,keyDisplayText,keyHint,keyText,listSessionsFromDir,loadEntriesFromFile,migrateSessionEntries,minimatch,parseGitUrl,parseRepositoryIdentity,parseSessionEntries,rawKeyHint,readFileLines,readPiManifest,readRepositoryIdentity,readSkillMarkdownSource,rejectedImageSources,require_ignore,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionEntryToContextMessages,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,unregisterSessionWriter,withVirtualModels}from"./chunk-3YXB7Z7O.js";import{DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,SYSTEM_THEME_NAME,SettingsManager,TERMINAL_MOUSE_MODES,Theme,acquireFallbackCircuits,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,applyHttpProxySettings,configureHttpDispatcher,createFallbackCircuitAccess,flushRawStdout,formatHttpIdleTimeoutMs,formatSkillInvocationPrompt,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getSettingsPath,getThemeByName,getThemeExportColors,highlightCode,initTheme,isTerminalMouseMode,loadThemeFromPath,monotonicNow,observeVisibleStderrWrites,onThemeChange,parseAutoThemeSetting,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,redactSensitiveOutput,redactSensitiveTokenValues,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,setRegisteredThemes,stopThemeWatcher,takeOverStderr,takeOverStdout,theme,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-SB22X6ZR.js";import{TIP_DEFINITIONS}from"./chunk-LYYI74CY.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,migrateKeybindingsConfig}from"./chunk-M2IHGL3M.js";import{Box,CancellableLoader,CombinedAutocompleteProvider,Container,Editor,Image,Input,Key,Loader,Markdown,MouseRegion,ProcessTerminal,Q,ScrollView,SelectList,SettingsList,Spacer,Text,TruncatedText,TuiAltScreen,TuiMainScreen,VStack,claimFrameRow,currentRenderRevision,decodeKittyPrintable,detectCapabilities,dispatchMouseEvent,dist_exports,expandPasteMarkers,frameMode,frameScrollbackRows,fuzzyFilter,fuzzyMatch,getCapabilities,getGraphemeSegmenter,getImageDimensions,getKeybindings,getNativeClipboard,getTerminalColorMode,hyperlink,imageFallback,isKeyRelease,isViewportTUI,isWarpWslSession,joinLineArrays,mainScreenHistoryLines,matchesKey,nextRenderRevision,outerKittyGraphicsMode,renderAtFrameRow,sanitizeTerminalLabel,setCapabilityOverrides,setKeybindings,sliceByColumn,stripTerminalSequences,truncateToWidth,visibleWidth,wrapTextWithAnsi}from"./chunk-J5MUMVWB.js";import{BACKGROUND_START_GRACE_MS,DEFAULT_COLS,DEFAULT_DURABLE_MONITOR_FIRE_BUDGET,DEFAULT_MAX_SESSIONS,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_AUTO_MUTE_SUMMARY,FIRE_BUDGET_WINDOW_MS,FOREGROUND_ENV_OVERRIDES,KILLED_SESSION_EXIT_GRACE_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,RESTORE_GRACE_MS,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_INPUT_TOOL,TERMINAL_KILL_TOOL,TERMINAL_MONITOR_TOOL,TERMINAL_OUTPUT_TOOL,TERMINAL_RESIZE_TOOL,encodeKeys,loadPty,safeRegExp}from"./chunk-WIAXG52U.js";import{PROCESS_START_TOLERANCE_MS,ownProcessStartedAtMs,processBootAtMs,sameBoot,sameProcessStart}from"./chunk-U5KVIAHJ.js";import{clientMessageIdentity,createFsWatchEventSource,readClientMessageIdentity}from"./chunk-6VVV27W2.js";import{FS_WATCH_RETRY_DELAY_MS,canonicalWatchPath,closeWatcher,probeDirectoryOpenable,watchWithErrorHandler}from"./chunk-JABBHOD5.js";import{DEFAULT_HOST_LAUNCH_SPEC,GENERATION_HANDOFF_CAPABILITY,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,REQUIRED_HOST_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,decideHostAction,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,parseHostProtocolInfo,probeHost,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest,stopHost}from"./chunk-7GVD54RM.js";import{AUTO_TITLE_SESSIONS_CAPABILITY,parseClientCapabilities}from"./chunk-IZOTKUWG.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{gcHostEndpoints,listHostEndpoints,socketNeedsHandshake}from"./chunk-H67EVDWG.js";import{compareEngineOrdinal,engineBuildIdentity,engineBuildIdentityFrom}from"./chunk-ZJHRDQCH.js";import{createRgEngine,ensureTool}from"./chunk-UWYQPA26.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{CredentialFailoverError,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigValueConfigured,rendezvousOrder,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,usageLimitResetMs}from"./chunk-Q2ZTPMWD.js";import{activeModelBlockUntil,describeModelBlocks,discoverEnvSlots,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,withModelBlock}from"./chunk-F6EQ7EV3.js";import{getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,pruneTrackedDetachedChildren,sanitizeBinaryOutput,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-JEZWV7JW.js";import{CredentialStoreBusyError,FILE_STORAGE_LOCK_OPTIONS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS,isLockError}from"./chunk-7X72IACK.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{composeFoldResult}from"./chunk-BMX2U22F.js";import{recordProcessLifetime}from"./chunk-3A3C5VVO.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,readSocketSecret,resolveSocketTransportAddress,sendSocketHandshake,shardKey,shardSocketPath,shardSocketPathForKey,socketSecretPath}from"./chunk-RADHRQ4K.js";import{attachJsonlLineReader,serializeJsonLine}from"./chunk-YI7SPFDN.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-7Q3EY6HH.js";import{ProjectTrustStore,getProjectTrustOptions,hasTrustRequiringProjectResources}from"./chunk-6SMU7ANE.js";import{isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime}from"./chunk-MH2BFYGN.js";import{source_default}from"./chunk-26UBFF6N.js";import{AssistantMessageFrameEncoder,Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,hasKimiTextToolCallRecovery,hasVisibleAssistantContent,hasVisibleText,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorExecResolved,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,reduceAssistantMessageFrames,renderCursorCliModelString,require_dist,shouldRecoverTextToolCalls,shouldRetryOverflowWithoutCompact,supportsAllowedToolChoice,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-LSE7KE2C.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity,uuidv7}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,copyContextProvenance,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-KC5TT7DH.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,isRecoverableInspectorVmImportError,processBunRuntimeOptions}from"./chunk-KEMQXWPY.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getInteractiveAssetsDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerUrl,getThemesDir,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-463OK2Y4.js";import{build_exports,typebox_exports,value_exports2 as value_exports}from"./chunk-RBCQOIAD.js";import{installClaudeCodeVersionStore,resolveToolNameMatch}from"./chunk-JRGNL6WM.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-RKJNJ3GI.js";import{resolveRootObjectSchema}from"./chunk-CWLCGRUS.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-6WCOSBI7.js";import{hasRefusedForcedToolChoice}from"./chunk-YSPHACIN.js";import{readProviderDiagnostic,sanitizeProviderDiagnostic}from"./chunk-YOPVJDSU.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{estimateContextTokens}from"./chunk-2WEI2XTZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_AGENT_RETRY_DELAY_MS,EMPTY_RESPONSE_ERROR,EMPTY_TOOL_USE_ERROR,FORWARDED_EMPTY_RESPONSE_ERROR,FORWARDED_EMPTY_TOOL_USE_ERROR,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,createInitialSystemMessage,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,getToolStateChanges,imageErrorResult,isModelType,isProviderStreamStallError,isProviderTimeoutError,isQuotaExhaustionMessage,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,providerNotConfiguredMessage,readByProviderId,removeSlot,repairManagedSentinelSlots,retryAssistantCall,retryDelayMs,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-XL5KIYQF.js";import{EventStream,createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{__commonJS,__export,__toESM}from"./chunk-IKOFCODM.js";var require_constants=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/constants.js"(exports,module){"use strict";var WIN_NO_SLASH="[^\\\\/]",ONE_CHAR="(?=.)",QMARK="[^/]",END_ANCHOR="(?:\\/|$)",START_ANCHOR="(?:^|\\/)",DOTS_SLASH=`\\.{1,2}${END_ANCHOR}`,NO_DOT="(?!\\.)",NO_DOTS=`(?!${START_ANCHOR}${DOTS_SLASH})`,NO_DOT_SLASH=`(?!\\.{0,1}${END_ANCHOR})`,NO_DOTS_SLASH=`(?!${DOTS_SLASH})`,QMARK_NO_DOT="[^.\\/]",STAR=`${QMARK}*?`,SEP="/",POSIX_CHARS={DOT_LITERAL:"\\.",PLUS_LITERAL:"\\+",QMARK_LITERAL:"\\?",SLASH_LITERAL:"\\/",ONE_CHAR,QMARK,END_ANCHOR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK_NO_DOT,STAR,START_ANCHOR,SEP},WINDOWS_CHARS={...POSIX_CHARS,SLASH_LITERAL:"[\\\\/]",QMARK:WIN_NO_SLASH,STAR:`${WIN_NO_SLASH}*?`,DOTS_SLASH:"\\.{1,2}(?:[\\\\/]|$)",NO_DOT:"(?!\\.)",NO_DOTS:"(?!(?:^|[\\\\/])\\.{1,2}(?:[\\\\/]|$))",NO_DOT_SLASH:"(?!\\.{0,1}(?:[\\\\/]|$))",NO_DOTS_SLASH:"(?!\\.{1,2}(?:[\\\\/]|$))",QMARK_NO_DOT:"[^.\\\\/]",START_ANCHOR:"(?:^|[\\\\/])",END_ANCHOR:"(?:[\\\\/]|$)",SEP:"\\"},POSIX_REGEX_SOURCE={__proto__:null,alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};module.exports={DEFAULT_MAX_EXTGLOB_RECURSION:0,MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{__proto__:null,"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,extglobChars(chars){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${chars.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(win325){return win325===!0?WINDOWS_CHARS:POSIX_CHARS}}}});var require_utils=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/utils.js"(exports){"use strict";var{REGEX_BACKSLASH,REGEX_REMOVE_BACKSLASH,REGEX_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_GLOBAL}=require_constants();exports.isObject=val=>val!==null&&typeof val=="object"&&!Array.isArray(val);exports.hasRegexChars=str3=>REGEX_SPECIAL_CHARS.test(str3);exports.isRegexChar=str3=>str3.length===1&&exports.hasRegexChars(str3);exports.escapeRegex=str3=>str3.replace(REGEX_SPECIAL_CHARS_GLOBAL,"\\$1");exports.toPosixSlashes=str3=>str3.replace(REGEX_BACKSLASH,"/");exports.isWindows=()=>{if(typeof navigator<"u"&&navigator.platform){let platform5=navigator.platform.toLowerCase();return platform5==="win32"||platform5==="windows"}return typeof process<"u"&&process.platform?process.platform==="win32":!1};exports.removeBackslashes=str3=>str3.replace(REGEX_REMOVE_BACKSLASH,match=>match==="\\"?"":match);exports.escapeLast=(input,char,lastIdx)=>{let idx=input.lastIndexOf(char,lastIdx);return idx===-1?input:input[idx-1]==="\\"?exports.escapeLast(input,char,idx-1):`${input.slice(0,idx)}\\${input.slice(idx)}`};exports.removePrefix=(input,state={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state.prefix="./"),output};exports.wrapOutput=(input,state={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path15,{windows}={})=>{let segs=path15.split(windows?/[\\/]/:"/"),last=segs[segs.length-1];return last===""?segs[segs.length-2]:last}}});var require_scan=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/scan.js"(exports,module){"use strict";var utils=require_utils(),{CHAR_ASTERISK,CHAR_AT,CHAR_BACKWARD_SLASH,CHAR_COMMA,CHAR_DOT,CHAR_EXCLAMATION_MARK,CHAR_FORWARD_SLASH,CHAR_LEFT_CURLY_BRACE,CHAR_LEFT_PARENTHESES,CHAR_LEFT_SQUARE_BRACKET,CHAR_PLUS,CHAR_QUESTION_MARK,CHAR_RIGHT_CURLY_BRACE,CHAR_RIGHT_PARENTHESES,CHAR_RIGHT_SQUARE_BRACKET}=require_constants(),isPathSeparator=code=>code===CHAR_FORWARD_SLASH||code===CHAR_BACKWARD_SLASH,depth=token=>{token.isPrefix!==!0&&(token.depth=token.isGlobstar?1/0:1)},scan2=(input,options)=>{let opts=options||{},length=input.length-1,scanToEnd=opts.parts===!0||opts.tokens===!0||opts.scanToEnd===!0,slashes=[],tokens=[],parts=[],str3=input,index=-1,start=0,lastIndex=0,isBrace=!1,isBracket=!1,isGlob=!1,isExtglob=!1,isGlobstar=!1,braceEscaped=!1,backslashes=!1,negated=!1,negatedExtglob=!1,finished=!1,braces=0,prev,code,token={value:"",depth:0,isGlob:!1},eos=()=>index>=length,peek=()=>str3.charCodeAt(index+1),advance=()=>(prev=code,str3.charCodeAt(++index));for(;index<length;){code=advance();let next;if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,code=advance(),code===CHAR_LEFT_CURLY_BRACE&&(braceEscaped=!0);continue}if(braceEscaped===!0||code===CHAR_LEFT_CURLY_BRACE){for(braces++;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_CURLY_BRACE){braces++;continue}if(braceEscaped!==!0&&code===CHAR_DOT&&(code=advance())===CHAR_DOT){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(braceEscaped!==!0&&code===CHAR_COMMA){if(isBrace=token.isBrace=!0,isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_RIGHT_CURLY_BRACE&&(braces--,braces===0)){braceEscaped=!1,isBrace=token.isBrace=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(code===CHAR_FORWARD_SLASH){if(slashes.push(index),tokens.push(token),token={value:"",depth:0,isGlob:!1},finished===!0)continue;if(prev===CHAR_DOT&&index===start+1){start+=2;continue}lastIndex=index+1;continue}if(opts.noext!==!0&&(code===CHAR_PLUS||code===CHAR_AT||code===CHAR_ASTERISK||code===CHAR_QUESTION_MARK||code===CHAR_EXCLAMATION_MARK)===!0&&peek()===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,isExtglob=token.isExtglob=!0,finished=!0,code===CHAR_EXCLAMATION_MARK&&index===start&&(negatedExtglob=!0),scanToEnd===!0){let parens=0;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(code===CHAR_ASTERISK){if(prev===CHAR_ASTERISK&&(isGlobstar=token.isGlobstar=!0),isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_QUESTION_MARK){if(isGlob=token.isGlob=!0,finished=!0,scanToEnd===!0)continue;break}if(code===CHAR_LEFT_SQUARE_BRACKET){for(;eos()!==!0&&(next=advance());){if(next===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(next===CHAR_RIGHT_SQUARE_BRACKET){isBracket=token.isBracket=!0,isGlob=token.isGlob=!0,finished=!0;break}}if(scanToEnd===!0)continue;break}if(opts.nonegate!==!0&&code===CHAR_EXCLAMATION_MARK&&index===start){negated=token.negated=!0,start++;continue}if(opts.noparen!==!0&&code===CHAR_LEFT_PARENTHESES){if(isGlob=token.isGlob=!0,scanToEnd===!0){let parens=1;for(;eos()!==!0&&(code=advance());){if(code===CHAR_BACKWARD_SLASH){backslashes=token.backslashes=!0,advance();continue}if(code===CHAR_LEFT_PARENTHESES){parens++;continue}if(code===CHAR_RIGHT_PARENTHESES&&--parens===0){finished=!0;break}}continue}break}if(isGlob===!0){if(finished=!0,scanToEnd===!0)continue;break}}opts.noext===!0&&(isExtglob=!1,isGlob=!1);let base=str3,prefix="",glob="";start>0&&(prefix=str3.slice(0,start),str3=str3.slice(start),lastIndex-=start),base&&isGlob===!0&&lastIndex>0?(base=str3.slice(0,lastIndex),glob=str3.slice(lastIndex)):isGlob===!0?(base="",glob=str3):base=str3,base&&base!==""&&base!=="/"&&base!==str3&&isPathSeparator(base.charCodeAt(base.length-1))&&(base=base.slice(0,-1)),opts.unescape===!0&&(glob&&(glob=utils.removeBackslashes(glob)),base&&backslashes===!0&&(base=utils.removeBackslashes(base)));let state={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state.maxDepth=0,isPathSeparator(code)||tokens.push(token),state.tokens=tokens),opts.parts===!0||opts.tokens===!0){let prevIndex;for(let idx=0;idx<slashes.length;idx++){let n2=prevIndex!==void 0?prevIndex+1:start,i=slashes[idx],value3=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value3,depth(tokens[idx]),state.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value3),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value2=input.slice(n);parts.push(value2),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value2,depth(tokens[tokens.length-1]),state.maxDepth+=tokens[tokens.length-1].depth),state.slashes=slashes,state.parts=parts}return state};module.exports=scan2}});var require_parse=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/parse.js"(exports,module){"use strict";var constants11=require_constants(),utils=require_utils(),{MAX_LENGTH,POSIX_REGEX_SOURCE,REGEX_NON_SPECIAL_CHARS,REGEX_SPECIAL_CHARS_BACKREF,REPLACEMENTS}=constants11,expandRange=(args,options)=>{if(typeof options.expandRange=="function")return options.expandRange(...args,options);args.sort();let value2=`[${args.join("-")}]`;try{new RegExp(value2)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value2},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value2="",escaped=!1;for(let ch of input){if(escaped===!0){value2+=ch,escaped=!1;continue}if(ch==="\\"){value2+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value2+=ch;continue}if(quote===0){if(ch==="[")bracket++;else if(ch==="]"&&bracket>0)bracket--;else if(bracket===0){if(ch==="(")paren++;else if(ch===")"&&paren>0)paren--;else if(ch==="|"&&paren===0){parts.push(value2),value2="";continue}}}value2+=ch}return parts.push(value2),parts},isPlainBranch=branch=>{let escaped=!1;for(let ch of branch){if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(/[?*+@!()[\]{}]/.test(ch))return!1}return!0},normalizeSimpleBranch=branch=>{let value2=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value2)&&(value2=value2.slice(2,-1),changed=!0);if(isPlainBranch(value2))return value2.replace(/\\(.)/g,"$1")},hasRepeatedCharPrefixOverlap=branches=>{let values=branches.map(normalizeSimpleBranch).filter(Boolean);for(let i=0;i<values.length;i++)for(let j=i+1;j<values.length;j++){let a=values[i],b=values[j],char=a[0];if(!(!char||a!==char.repeat(a.length)||b!==char.repeat(b.length))&&(a===b||a.startsWith(b)||b.startsWith(a)))return!0}return!1},parseRepeatedExtglob=(pattern,requireEnd=!0)=>{if(pattern[0]!=="+"&&pattern[0]!=="*"||pattern[1]!=="(")return;let bracket=0,paren=0,quote=0,escaped=!1;for(let i=1;i<pattern.length;i++){let ch=pattern[i];if(escaped===!0){escaped=!1;continue}if(ch==="\\"){escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1;continue}if(quote!==1){if(ch==="["){bracket++;continue}if(ch==="]"&&bracket>0){bracket--;continue}if(!(bracket>0)){if(ch==="("){paren++;continue}if(ch===")"&&(paren--,paren===0))return requireEnd===!0&&i!==pattern.length-1?void 0:{type:pattern[0],body:pattern.slice(2,i),end:i}}}}},buildCharClassStar=chars=>`${chars.length===1?utils.escapeRegex(chars[0]):`[${chars.map(ch=>utils.escapeRegex(ch)).join("")}]`}*`,getStarExtglobSequenceChars=pattern=>{let index=0,chars=[];for(;index<pattern.length;){let match=parseRepeatedExtglob(pattern.slice(index),!1);if(!match||match.type!=="*")return;let branches=splitTopLevel(match.body).map(branch2=>branch2.trim());if(branches.length!==1)return;let branch=normalizeSimpleBranch(branches[0]);if(!branch||branch.length!==1)return;chars.push(branch),index+=match.end+1}if(!(chars.length<1))return chars},repeatedExtglobRecursion=pattern=>{let depth=0,value2=pattern.trim(),match=parseRepeatedExtglob(value2);for(;match;)depth++,value2=match.body.trim(),match=parseRepeatedExtglob(value2);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse7=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state={input,index:-1,start:0,dot:opts.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens};input=utils.removePrefix(input,state),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value2,eos=()=>state.index===len-1,peek=state.peek=(n=1)=>input[state.index+n],advance=state.advance=()=>input[++state.index]||"",remaining=()=>input.slice(state.index+1),consume=(value3="",num2=0)=>{state.consumed+=value3,state.index+=num2},append=token=>{state.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state.start++,count++;return count%2===0?!1:(state.negated=!0,state.start++,!0)},increment=type2=>{state[type2]++,stack.push(type2)},decrement=type2=>{state[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state.braces>0&&(tok.type==="comma"||tok.type==="brace"),isExtglob=tok.extglob===!0||extglobs.length&&(tok.type==="pipe"||tok.type==="paren");tok.type!=="slash"&&tok.type!=="paren"&&!isBrace&&!isExtglob&&(state.output=state.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state.output+=prev.output)}if(extglobs.length&&tok.type!=="paren"&&(extglobs[extglobs.length-1].inner+=tok.value),(tok.value||tok.output)&&append(tok),prev&&prev.type==="text"&&tok.type==="text"){prev.output=(prev.output||prev.value)+tok.value,prev.value+=tok.value;return}tok.prev=prev,tokens.push(tok),prev=tok},extglobOpen=(type2,value3)=>{let token={...EXTGLOB_CHARS[value3],conditions:1,inner:""};token.prev=prev,token.parens=state.parens,token.output=state.output,token.startIndex=state.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value3,output:state.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state.index+1),body=input.slice(token.startIndex+2,state.index),analysis=analyzeRepeatedExtglob(body,opts);if((token.type==="plus"||token.type==="star")&&analysis.risky){let safeOutput=analysis.safeOutput?(token.output?"":ONE_CHAR)+(opts.capture?`(${analysis.safeOutput})`:analysis.safeOutput):void 0,open8=tokens[token.tokensIndex];open8.type="text",open8.value=literal,open8.output=safeOutput||utils.escapeRegex(literal);for(let i=token.tokensIndex+1;i<tokens.length;i++)tokens[i].value="",tokens[i].output="",delete tokens[i].suffix;state.output=token.output+open8.output,state.backtrack=!0,push({type:"paren",extglob:!0,value:value2,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse7(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state.negatedExtglob=!0)}push({type:"paren",extglob:!0,value:value2,output}),decrement("parens")};if(opts.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(input)){let backslashes=!1,output=input.replace(REGEX_SPECIAL_CHARS_BACKREF,(m,esc,chars,first,rest,index)=>first==="\\"?(backslashes=!0,m):first==="?"?esc?esc+first+(rest?QMARK.repeat(rest.length):""):index===0?qmarkNoDot+(rest?QMARK.repeat(rest.length):""):QMARK.repeat(chars.length):first==="."?DOT_LITERAL.repeat(chars.length):first==="*"?esc?esc+first+(rest?star:""):star:esc?m:`\\${m}`);return backslashes===!0&&(opts.unescape===!0?output=output.replace(/\\/g,""):output=output.replace(/\\+/g,m=>m.length%2===0?"\\\\":m?"\\":"")),output===input&&opts.contains===!0?(state.output=input,state):(state.output=utils.wrapOutput(output,state,options),state)}for(;!eos();){if(value2=advance(),value2==="\0")continue;if(value2==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value2+="\\",push({type:"text",value:value2});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state.index+=slashes,slashes%2!==0&&(value2+="\\")),opts.unescape===!0?value2=advance():value2+=advance(),state.brackets===0){push({type:"text",value:value2});continue}}if(state.brackets>0&&(value2!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value2===":"){let inner=prev.value.slice(1);if(inner.includes("[")&&(prev.posix=!0,inner.includes(":"))){let idx=prev.value.lastIndexOf("["),pre=prev.value.slice(0,idx),rest2=prev.value.slice(idx+2),posix5=POSIX_REGEX_SOURCE[rest2];if(posix5){prev.value=pre+posix5,state.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value2==="["&&peek()!==":"||value2==="-"&&peek()==="]")&&(value2=`\\${value2}`),value2==="]"&&(prev.value==="["||prev.value==="[^")&&(value2=`\\${value2}`),opts.posix===!0&&value2==="!"&&prev.value==="["&&(value2="^"),prev.value+=value2,append({value:value2});continue}if(state.quotes===1&&value2!=='"'){value2=utils.escapeRegex(value2),prev.value+=value2,append({value:value2});continue}if(value2==='"'){state.quotes=state.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value:value2});continue}if(value2==="("){increment("parens"),push({type:"paren",value:value2});continue}if(value2===")"){if(state.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value:value2,output:state.parens?")":"\\)"}),decrement("parens");continue}if(value2==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value2=`\\${value2}`}else increment("brackets");push({type:"bracket",value:value2});continue}if(value2==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value:value2,output:`\\${value2}`});continue}if(state.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value:value2,output:`\\${value2}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value2=`/${value2}`),prev.value+=value2,append({value:value2}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state.output=state.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state.output+=prev.value;continue}if(value2==="{"&&opts.nobrace!==!0){increment("braces");let open8={type:"brace",value:value2,output:"(",outputIndex:state.output.length,tokensIndex:state.tokens.length};braces.push(open8),push(open8);continue}if(value2==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value:value2,output:value2});continue}let output=")";if(brace.dots===!0){let arr=tokens.slice(),range=[];for(let i=arr.length-1;i>=0&&(tokens.pop(),arr[i].type!=="brace");i--)arr[i].type!=="dots"&&range.unshift(arr[i].value);output=expandRange(range,opts),state.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state.output.slice(0,brace.outputIndex),toks=state.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value2=output="\\}",state.output=out;for(let t of toks)state.output+=t.output||t.value}push({type:"brace",value:value2,output}),decrement("braces"),braces.pop();continue}if(value2==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value:value2});continue}if(value2===","){let output=value2,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value:value2,output});continue}if(value2==="/"){if(prev.type==="dot"&&state.index===state.start+1){state.start=state.index+1,state.consumed="",state.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value:value2,output:SLASH_LITERAL});continue}if(value2==="."){if(state.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value2,prev.value+=value2,brace.dots=!0;continue}if(state.braces+state.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value:value2,output:DOT_LITERAL});continue}push({type:"dot",value:value2,output:DOT_LITERAL});continue}if(value2==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value2);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value2;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value2}`),push({type:"text",value:value2,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value:value2,output:QMARK_NO_DOT});continue}push({type:"qmark",value:value2,output:QMARK});continue}if(value2==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value2);continue}if(opts.nonegate!==!0&&state.index===0){negate();continue}}if(value2==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value2);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value:value2,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state.parens>0){push({type:"plus",value:value2});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value2==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value:value2,output:""});continue}push({type:"text",value:value2});continue}if(value2!=="*"){(value2==="$"||value2==="^")&&(value2=`\\${value2}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value2+=match[0],state.index+=match[0].length),push({type:"text",value:value2});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value2,prev.output=star,state.backtrack=!0,state.globstar=!0,consume(value2);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value2);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value2);continue}let prior=prev.prev,before=prior.prev,isStart=prior.type==="slash"||prior.type==="bos",afterStar=before&&(before.type==="star"||before.type==="globstar");if(opts.bash===!0&&(!isStart||rest[0]&&rest[0]!=="/")){push({type:"star",value:value2,output:""});continue}let isBrace=state.braces>0&&(prior.type==="comma"||prior.type==="brace"),isExtglob=extglobs.length&&(prior.type==="pipe"||prior.type==="paren");if(!isStart&&prior.type!=="paren"&&!isBrace&&!isExtglob){push({type:"star",value:value2,output:""});continue}for(;rest.slice(0,3)==="/**";){let after=input[state.index+4];if(after&&after!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state.parens>0&&rest===")".repeat(state.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value2,prev.output=globstar(opts),state.output=prev.output,state.globstar=!0,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value2,state.globstar=!0,state.output+=prior.output+prev.output,consume(value2);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state.output=state.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=`${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`,prev.value+=value2,state.output+=prior.output+prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value2,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state.output=prev.output,state.globstar=!0,consume(value2+advance()),push({type:"slash",value:"/",output:""});continue}state.output=state.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value2,state.output+=prev.output,state.globstar=!0,consume(value2);continue}let token={type:"star",value:value2,output:star};if(opts.bash===!0){token.output=".*?",(prev.type==="bos"||prev.type==="slash")&&(token.output=nodot+token.output),push(token);continue}if(prev&&(prev.type==="bracket"||prev.type==="paren")&&opts.regex===!0){token.output=value2,push(token);continue}(state.index===state.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state.output=utils.escapeLast(state.output,"["),decrement("brackets")}for(;state.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state.output=utils.escapeLast(state.output,"("),decrement("parens")}for(;state.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state.output=utils.escapeLast(state.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state.backtrack===!0){state.output="";for(let token of state.tokens)state.output+=token.output!=null?token.output:token.value,token.suffix&&(state.output+=token.suffix)}return state};parse7.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state={negated:!1,prefix:""},star=opts.bash===!0?".*?":STAR;opts.capture&&(star=`(${star})`);let globstar=opts2=>opts2.noglobstar===!0?star:`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,create2=str3=>{switch(str3){case"*":return`${nodot}${ONE_CHAR}${star}`;case".*":return`${DOT_LITERAL}${ONE_CHAR}${star}`;case"*.*":return`${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"*/*":return`${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;case"**":return nodot+globstar(opts);case"**/*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;case"**/*.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;case"**/.*":return`(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;default:{let match=/^(.*?)\.(\w+)$/.exec(str3);if(!match)return;let source3=create2(match[1]);return source3?source3+DOT_LITERAL+match[2]:void 0}}},output=utils.removePrefix(input,state),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse7}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse7=require_parse(),utils=require_utils(),constants11=require_constants(),isObject4=val=>val&&typeof val=="object"&&!Array.isArray(val),picomatch4=(glob,options,returnState=!1)=>{if(Array.isArray(glob)){let fns=glob.map(input=>picomatch4(input,options,returnState));return str3=>{for(let isMatch of fns){let state2=isMatch(str3);if(state2)return state2}return!1}}let isState=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix5=opts.windows,regex2=isState?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state=regex2.state;delete regex2.state;let isIgnored=()=>!1;if(opts.ignore){let ignoreOpts={...options,ignore:null,onMatch:null,onResult:null};isIgnored=picomatch4(opts.ignore,ignoreOpts,returnState)}let matcher=(input,returnObject=!1)=>{let{isMatch,match,output}=picomatch4.test(input,regex2,options,{glob,posix:posix5}),result3={glob,state,regex:regex2,posix:posix5,input,output,match,isMatch};return typeof opts.onResult=="function"&&opts.onResult(result3),isMatch===!1?(result3.isMatch=!1,returnObject?result3:!1):isIgnored(input)?(typeof opts.onIgnore=="function"&&opts.onIgnore(result3),result3.isMatch=!1,returnObject?result3:!1):(typeof opts.onMatch=="function"&&opts.onMatch(result3),returnObject?result3:!0)};return returnState&&(matcher.state=state),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix5}={})=>{if(typeof input!="string")throw new TypeError("Expected input to be a string");if(input==="")return{isMatch:!1,output:""};let opts=options||{},format2=opts.format||(posix5?utils.toPosixSlashes:null),match=input===glob,output=match&&format2?format2(input):input;return match===!1&&(output=format2?format2(input):input,match=output===glob),(match===!1||opts.capture===!0)&&(opts.matchBase===!0||opts.basename===!0?match=picomatch4.matchBase(input,regex2,options,posix5):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix5=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix5}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse7(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state.output})${append}`;state&&state.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse7.fastpaths(input,options)),parsed.output||(parsed=parse7(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err2){if(options&&options.debug===!0)throw err2;return/$^/}};picomatch4.constants=constants11;module.exports=picomatch4}});var require_picomatch2=__commonJS({"packages/coding-agent/node_modules/picomatch/index.js"(exports,module){"use strict";var pico=require_picomatch(),utils=require_utils();function picomatch4(glob,options,returnState=!1){return options&&(options.windows===null||options.windows===void 0)&&(options={...options,windows:utils.isWindows()}),pico(glob,options,returnState)}Object.assign(picomatch4,pico);module.exports=picomatch4}});import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path14 from"node:path";import{spawn as spawn12,spawnSync}from"child_process";import{randomUUID as randomUUID13}from"node:crypto";import{existsSync as existsSync48,mkdirSync as mkdirSync26,readFileSync as readFileSync46,writeFileSync as writeFileSync24}from"node:fs";import{rm as rm10}from"node:fs/promises";import{dirname as dirname51}from"node:path";import{isDeepStrictEqual as isDeepStrictEqual4}from"node:util";var dist_exports2={};__export(dist_exports2,{AGENT_TELEMETRY_SCHEMAS:()=>AGENT_TELEMETRY_SCHEMAS,AI_TELEMETRY_SCHEMA:()=>AI_TELEMETRY_SCHEMA,Agent:()=>Agent,AgentHarness:()=>AgentHarness,BACKGROUND_CONTEXT:()=>BACKGROUND_CONTEXT,BRANCH_SUMMARY_PREFIX:()=>BRANCH_SUMMARY_PREFIX,BRANCH_SUMMARY_SUFFIX:()=>BRANCH_SUMMARY_SUFFIX,BranchSummaryError:()=>BranchSummaryError,COMPACTION_SUMMARY_PREFIX:()=>COMPACTION_SUMMARY_PREFIX,COMPACTION_SUMMARY_SUFFIX:()=>COMPACTION_SUMMARY_SUFFIX,Closed:()=>Closed,CompactionError:()=>CompactionError,DEFAULT_COMPACTION_SETTINGS:()=>DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES:()=>DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES:()=>DEFAULT_MAX_LINES,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC:()=>EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ExecutionError:()=>ExecutionError,FileError:()=>FileError,GREP_MAX_LINE_LENGTH:()=>GREP_MAX_LINE_LENGTH,HARNESS_TELEMETRY_SCHEMA:()=>HARNESS_TELEMETRY_SCHEMA,HarnessClosed:()=>HarnessClosed,HarnessFault:()=>HarnessFault,InMemoryTelemetryContext:()=>InMemoryTelemetryContext,InvalidLane:()=>InvalidLane,InvalidMessage:()=>InvalidMessage,InvalidNavigation:()=>InvalidNavigation,InvalidReadSegmentsError:()=>InvalidReadSegmentsError,JSONL_STORAGE_VERSION:()=>JSONL_STORAGE_VERSION,JsonlSessionRepo:()=>JsonlSessionRepo,LaneBusy:()=>LaneBusy,MemorySessionRepo:()=>MemorySessionRepo,NOOP_TELEMETRY_CONTEXT:()=>NOOP_TELEMETRY_CONTEXT,NoActiveOperation:()=>NoActiveOperation,NoActiveRun:()=>NoActiveRun,NothingToCompact:()=>NothingToCompact,NothingToResume:()=>NothingToResume,OperationMismatch:()=>OperationMismatch,ProviderRetryWatchdogAbortError:()=>ProviderRetryWatchdogAbortError,READ_FOLDER_SELECTION:()=>READ_FOLDER_SELECTION,READ_FOLD_SETTINGS:()=>READ_FOLD_SETTINGS,Result:()=>Result,SessionBranchExistsError:()=>SessionBranchExistsError,SessionInvalidBranchError:()=>SessionInvalidBranchError,SessionInvariantError:()=>SessionInvariantError,SessionPendingAssistantMessageError:()=>SessionPendingAssistantMessageError,SessionUnknownTargetError:()=>SessionUnknownTargetError,SliceNotImplemented:()=>SliceNotImplemented,StorageBackedSession:()=>StorageBackedSession,StreamStartTimeoutError:()=>StreamStartTimeoutError,TODO_CONTEXT:()=>TODO_CONTEXT,TaggedError:()=>TaggedError,UnknownSkill:()=>UnknownSkill,UnknownTarget:()=>UnknownTarget,UnknownTemplate:()=>UnknownTemplate,agentLoop:()=>agentLoop,agentLoopContinue:()=>agentLoopContinue,appendList:()=>appendList,applyShellOutputUpdate:()=>applyShellOutputUpdate,awaitWithContext:()=>awaitWithContext,bashExecutionToText:()=>bashExecutionToText,branchTip:()=>branchTip,branchTipInventoryPrefix:()=>branchTipInventoryPrefix,buildProviderContext:()=>buildProviderContext,calculateContextTokens:()=>calculateContextTokens,collectEntriesForBranchSummary:()=>collectEntriesForBranchSummary,commitWrite:()=>commitWrite,compact:()=>compact,convertToLlm:()=>convertToLlm2,createBashTool:()=>createBashTool,createBranchSummaryMessage:()=>createBranchSummaryMessage2,createCompactionSummaryMessage:()=>createCompactionSummaryMessage2,createContextKey:()=>createContextKey,createCustomMessage:()=>createCustomMessage2,createDefaultReadSummary:()=>createDefaultReadSummary,createEditTool:()=>createEditTool,createForkSnapshot:()=>createForkSnapshot,createReadTool:()=>createReadTool,createSegmentedReadView:()=>createSegmentedReadView,createTypedSpanStarter:()=>createTypedSpanStarter,createWriteTool:()=>createWriteTool,defineTelemetrySchema:()=>defineTelemetrySchema,deleteList:()=>deleteList,deleteValue:()=>deleteValue,entryLabel:()=>entryLabel,err:()=>err,estimateContextTokens:()=>estimateContextTokens2,estimateTokens:()=>estimateTokens,executeShellWithCapture:()=>executeShellWithCapture,findCutPoint:()=>findCutPoint,findTurnStartIndex:()=>findTurnStartIndex,formatPromptTemplateInvocation:()=>formatPromptTemplateInvocation,formatSize:()=>formatSize,formatSkillInvocation:()=>formatSkillInvocation,formatSkillsForSystemPrompt:()=>formatSkillsForSystemPrompt,generateBranchSummary:()=>generateBranchSummary,generateSummary:()=>generateSummary,generateSummaryWithUsage:()=>generateSummaryWithUsage,getLastAssistantUsage:()=>getLastAssistantUsage,getOrThrow:()=>getOrThrow,getOrUndefined:()=>getOrUndefined,getTelemetryContext:()=>getTelemetryContext,insertEntry:()=>insertEntry,insertUsage:()=>insertUsage,isReadSummaryPath:()=>isReadSummaryPath,laneConfig:()=>laneConfig,laneState:()=>laneState,languageForPath:()=>languageForPath,list:()=>list,loadPromptTemplates:()=>loadPromptTemplates,loadSkills:()=>loadSkills,loadSourcedPromptTemplates:()=>loadSourcedPromptTemplates,loadSourcedSkills:()=>loadSourcedSkills,matchError:()=>matchError,ok:()=>ok,operationMeta:()=>operationMeta,operationPreparation:()=>operationPreparation,operationPreparationPrefix:()=>operationPreparationPrefix,operationResult:()=>operationResult,operationScopeOf:()=>operationScopeOf,operationState:()=>operationState,operationToolArgs:()=>operationToolArgs,operationToolArgsPrefix:()=>operationToolArgsPrefix,operationToolMemo:()=>operationToolMemo,operationToolMemoPrefix:()=>operationToolMemoPrefix,parseCommandArgs:()=>parseCommandArgs,pendingAssistantFrames:()=>pendingAssistantFrames,pendingEntry:()=>pendingEntry,pendingToolOutput:()=>pendingToolOutput,pendingToolOutputPrefix:()=>pendingToolOutputPrefix,prepareAgentToolCall:()=>prepareAgentToolCall,prepareAgentToolCallArguments:()=>prepareAgentToolCallArguments,prepareBranchEntries:()=>prepareBranchEntries,prepareCompaction:()=>prepareCompaction,prepareReadFolder:()=>prepareReadFolder,prepareStorageCommit:()=>prepareStorageCommit,prepareToolArguments:()=>prepareToolArguments,projectForkCurrentStateWrite:()=>projectForkCurrentStateWrite,readSummaryEngineForPath:()=>readSummaryEngineForPath,reduceLaneSnapshot:()=>reduceLaneSnapshot,renderSegmentedReadView:()=>renderSegmentedReadView,resolveListReadOptions:()=>resolveListReadOptions,resolveToolNameAlias:()=>resolveToolNameAlias,runAgentLoop:()=>runAgentLoop,runAgentLoopContinue:()=>runAgentLoopContinue,runToolCall:()=>runToolCall,sanitizeBinaryOutput:()=>sanitizeShellOutput,selectedReadFolder:()=>selectedReadFolder,serializeConversation:()=>serializeConversation,sessionName:()=>sessionName,setDefaultStreamFn:()=>setDefaultStreamFn,setValue:()=>setValue,shouldCompact:()=>shouldCompact,startAiSpan:()=>startAiSpan,startHarnessSpan:()=>startHarnessSpan,streamProxy:()=>streamProxy,substituteArgs:()=>substituteArgs,toError:()=>toError,truncateHead:()=>truncateHead,truncateLine:()=>truncateLine,truncateTail:()=>truncateTail,utf8ByteLength:()=>utf8ByteLength,uuidv7:()=>uuidv7,validateCommittedWrites:()=>validateCommittedWrites,value:()=>value,withAbortSignal:()=>withAbortSignal,withCancel:()=>withCancel,withContextValue:()=>withContextValue,withTelemetryContext:()=>withTelemetryContext,withoutAbortSignal:()=>withoutAbortSignal});function startNoopSpan(_options,callback){try{return Promise.resolve(callback(noopTelemetrySpan))}catch(error2){return Promise.reject(error2)}}var noopTelemetrySpan={startSpan:startNoopSpan,addEvent:()=>{},setAttributes:()=>{},setStatus:()=>{}};Object.freeze(noopTelemetrySpan);var NOOP_TELEMETRY_CONTEXT=noopTelemetrySpan;function copyAttributeValue(value2){return Array.isArray(value2)?[...value2]:value2}function copyAttributes(attributes){let copy={};if(!attributes)return copy;for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(copy[name]=copyAttributeValue(value2));return copy}function mergeAttributes(current,attributes){let merged=copyAttributes(current);for(let[name,value2]of Object.entries(attributes))value2!==void 0&&(merged[name]=copyAttributeValue(value2));return merged}function copyStatus(status){return status.status==="ok"?{status:"ok"}:status.error?{status:"error",error:{name:status.error.name,message:status.error.message}}:{status:"error"}}function automaticErrorStatus(error2){try{if(error2 instanceof Error)return{status:"error",error:{name:error2.name,message:error2.message}}}catch{}return{status:"error"}}function settleSpan(state,span,failed,error2){span.settled||(failed&&!span.explicitStatus&&(span.status=automaticErrorStatus(error2)),span.settled=!0,span.endSequence=state.nextEndSequence++)}function createSpan(state,parent,options){let name=options.name,attributes=copyAttributes(options.attributes);return{id:state.nextSpanId++,parentId:parent?.id??null,name,attributes,events:[],status:{status:"ok"},explicitStatus:!1,settled:!1}}function startInMemorySpan(state,parent,options,callback){if(parent?.settled)return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback);let recordedSpan;try{recordedSpan=createSpan(state,parent,options),state.spans.push(recordedSpan)}catch{return NOOP_TELEMETRY_CONTEXT.startSpan(options,callback)}let span={startSpan:(childOptions,childCallback)=>startInMemorySpan(state,recordedSpan,childOptions,childCallback),addEvent(name,attributes){if(!recordedSpan.settled)try{recordedSpan.events.push({name,attributes:copyAttributes(attributes)})}catch{}},setAttributes(attributes){if(!recordedSpan.settled)try{recordedSpan.attributes=mergeAttributes(recordedSpan.attributes,attributes)}catch{}},setStatus(status){if(!recordedSpan.settled)try{recordedSpan.status=copyStatus(status),recordedSpan.explicitStatus=!0}catch{}}},result3;try{result3=callback(span)}catch(error2){return settleSpan(state,recordedSpan,!0,error2),Promise.reject(error2)}return Promise.resolve(result3).then(value2=>(settleSpan(state,recordedSpan,!1),value2),error2=>{throw settleSpan(state,recordedSpan,!0,error2),error2})}var InMemoryTelemetryContext=class{constructor(){this.state={spans:[],nextSpanId:1,nextEndSequence:1}}startSpan(options,callback){return startInMemorySpan(this.state,void 0,options,callback)}getSpans(){return this.state.spans.map(span=>({id:span.id,parentId:span.parentId,name:span.name,attributes:copyAttributes(span.attributes),events:span.events.map(event=>({name:event.name,attributes:copyAttributes(event.attributes)})),status:copyStatus(span.status),settled:span.settled,...span.endSequence===void 0?{}:{endSequence:span.endSequence}}))}};function defineTelemetrySchema(schema){return schema}function bindTypedSpanStarter(telemetryContext){return(name,attributes,callback)=>telemetryContext.startSpan({name,attributes},span=>callback(span,bindTypedSpanStarter(span)))}function createTypedSpanStarter(telemetryContext,_schemas){return bindTypedSpanStarter(telemetryContext)}var EMPTY_USAGE={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ProviderRetryWatchdogAbortError=class extends Error{constructor(providerCause){super(providerCause),this.providerCause=providerCause,this.name="ProviderRetryWatchdogAbortError"}},EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC="empty_tool_use_terminal_state";function demoteToolUseWithoutToolCalls(message){return message.stopReason!=="toolUse"||message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"stop",diagnostics:[...message.diagnostics??[],{type:EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,timestamp:Date.now(),details:{}}]}}function promoteStopWithPendingToolCalls(message){return message.stopReason!=="stop"||!message.content.some(block=>block.type==="toolCall")?message:{...message,stopReason:"toolUse"}}function shouldTerminateAssistantTurn(message){return message.stopReason==="error"||message.stopReason==="aborted"||isClassifierRefusal(message)}function isStreamIdleTimeoutError(error2){return error2 instanceof Error&&error2.name==="StreamIdleTimeoutError"}function shouldFinalizeIdleAsStop(partialMessage,providerToolResults){if(!partialMessage)return!1;let toolCalls=partialMessage.content.filter(block=>block.type==="toolCall");return toolCalls.length===0?!1:providerToolResults.length>0?!0:toolCalls.every(block=>isCursorExecResolved(block))}function createTerminalFailureAssistantMessage(model,reason,error2,partialMessage){let errorMessage8=error2 instanceof Error?error2.message:String(error2),providerDiagnostic=reason==="error"?readProviderDiagnostic(error2):void 0;return{role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??model.api,provider:partialMessage?.provider??model.provider,model:partialMessage?.model??model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??EMPTY_USAGE,stopReason:reason,errorMessage:errorMessage8||(reason==="aborted"?"Request was aborted":"Error"),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:partialMessage?.timestamp??Date.now()}}function normalizeTerminalAssistantMessage(message,event){if(event.type==="done")return message;let errorMessage8=message.errorMessage??(event.reason==="aborted"?"Request was aborted":"Error");return message.stopReason===event.reason&&message.errorMessage===errorMessage8?message:{...message,stopReason:event.reason,errorMessage:errorMessage8}}function isEmptyStop(message){return message.stopReason==="stop"&&!hasVisibleAssistantContent(message)}function isEmptyToolUse(message){return message.stopReason==="toolUse"&&!message.content.some(block=>block.type==="toolCall")}function isMeaningfulContentEvent(event,policy){switch(event.type){case"toolcall_start":return!0;case"text_delta":return hasVisibleText(event.delta);case"text_end":return hasVisibleText(event.content);case"thinking_delta":return policy.thinkingCommits&&hasVisibleText(event.delta);case"thinking_end":return policy.thinkingCommits&&hasVisibleText(event.content);default:return!1}}function appendRetryDiagnostic(message,type2="empty_assistant_response_recovery",details={retries:1}){return{...message,diagnostics:[...message.diagnostics??[],{type:type2,timestamp:Date.now(),details}]}}function recoveryDiagnosticType(toolUse){return toolUse?"empty_tool_use_response_recovery":"empty_assistant_response_recovery"}function createEmptyResponseFailure(message,toolUse=!1){let errorMessage8=toolUse?EMPTY_TOOL_USE_ERROR:EMPTY_RESPONSE_ERROR;return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse)),content:[{type:"text",text:errorMessage8}],stopReason:"error",errorMessage:errorMessage8}}function createForwardedEmptyFailure(message,toolUse){return{...appendRetryDiagnostic(message,recoveryDiagnosticType(toolUse),{retries:0,forwarded:!0}),stopReason:"error",errorMessage:toolUse?FORWARDED_EMPTY_TOOL_USE_ERROR:FORWARDED_EMPTY_RESPONSE_ERROR}}function createRetryingStream(firstStream,createStream,policy){let outerStream=createAssistantMessageEventStream();return(async()=>{try{let stream2=firstStream,retrying=!1;for(;;){let buffered=[],forwarding=!1,retry=!1;for await(let event of stream2){if(event.type==="done"){let emptyToolUse=isEmptyToolUse(event.message);if(isEmptyStop(event.message)||emptyToolUse){if(forwarding){outerStream.push({type:"error",reason:"error",error:createForwardedEmptyFailure(event.message,emptyToolUse)}),outerStream.end();return}if(!retrying){retry=!0;break}let error2=createEmptyResponseFailure(event.message,emptyToolUse);outerStream.push({type:"error",reason:"error",error:error2}),outerStream.end();return}let terminal=retrying?{...event,message:appendRetryDiagnostic(event.message,recoveryDiagnosticType(isEmptyToolUse(event.message)))}:event;if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(terminal),outerStream.end();return}if(event.type==="error"){if(!forwarding)for(let pending of buffered)outerStream.push(pending);outerStream.push(event),outerStream.end();return}if(forwarding){outerStream.push(event);continue}if(buffered.push(event),isMeaningfulContentEvent(event,policy)){for(let pending of buffered)outerStream.push(pending);forwarding=!0}}if(!retry){outerStream.end(retrying?appendRetryDiagnostic(await stream2.result()):await stream2.result());return}retrying=!0,stream2=await createStream()}}catch(error2){outerStream.fail(error2)}})(),outerStream}function withEmptyAssistantRecovery(model,streamFunction){if(!shouldRecoverTextToolCalls(model)&&getToolCallFormat(model)===void 0)return streamFunction;let policy={thinkingCommits:!hasKimiTextToolCallRecovery(model)};return async(requestedModel,context,options)=>{let createStream=()=>streamFunction(requestedModel,context,options);return createRetryingStream(await createStream(),createStream,policy)}}var defaultStreamFn;function setDefaultStreamFn(streamFn){defaultStreamFn=streamFn}function getDefaultStreamFn(){if(!defaultStreamFn)throw new Error("No default stream function configured. Pass streamFn explicitly or call setDefaultStreamFn().");return defaultStreamFn}function prepareToolArguments(shim,args){return shim?shim(structuredClone(args)):args}function prepareAgentToolCallArguments(tool,toolCall){return tool.prepareArguments?{...toolCall,arguments:prepareToolArguments(tool.prepareArguments,toolCall.arguments)}:toolCall}function resolveToolNameAlias(requested,available){return resolveToolNameMatch(requested,available)}function toolNameCorrectionNotice(requested,resolved){return`[auto-corrected] no tool is named "${requested}"; ran "${resolved}". Call tools by their exact listed name.`}async function resolveCallTool(currentContext,toolCall,config){if(toolCall.incomplete===!0)return;let exact=currentContext.tools?.find(candidate=>candidate.name===toolCall.name);if(exact)return exact;let resolved=await config.resolveUnknownToolCall?.(toolCall.name,currentContext);if(resolved)return resolved;let aliasedName=resolveToolNameAlias(toolCall.name,(currentContext.tools??[]).map(candidate=>candidate.name));return currentContext.tools?.find(candidate=>candidate.name===aliasedName)}function withToolNameCorrection(result3,requestedName,resolvedName){return{...result3,content:[{type:"text",text:toolNameCorrectionNotice(requestedName,resolvedName),audience:"model"},...result3.content??[]]}}function agentLoop(prompts,context,config,signal,streamFn){let stream2=createAgentStream();return runAgentLoop(prompts,context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}function agentLoopContinue(context,config,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let stream2=createAgentStream();return runAgentLoopContinue(context,config,async event=>{stream2.push(event)},signal,streamFn).then(messages=>{stream2.end(messages)}),stream2}async function runAgentLoop(prompts,context,config,emit,signal,streamFn){let initialMessages=declareToolChanges(context,prompts,config.model),newMessages=[...initialMessages],currentContext={...context,messages:[...context.messages,...initialMessages]};await emit({type:"agent_start"}),await emit({type:"turn_start"});for(let message of initialMessages)await emit({type:"message_start",message}),await emit({type:"message_end",message});return await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}async function runAgentLoopContinue(context,config,emit,signal,streamFn){if(context.messages.length===0)throw new Error("Cannot continue: no messages in context");if(context.messages[context.messages.length-1].role==="assistant")throw new Error("Cannot continue from message role: assistant");let newMessages=[],currentContext={...context};return await emit({type:"agent_start"}),await emit({type:"turn_start"}),await runLoop(currentContext,newMessages,config,signal,emit,streamFn??getDefaultStreamFn()),newMessages}function createAgentStream(){return new EventStream(event=>event.type==="agent_end",event=>event.type==="agent_end"?event.messages:[])}var StreamIdleTimeoutError=class extends Error{constructor(timeoutMs){super(`Idle timeout waiting for provider stream after ${timeoutMs}ms`),this.name="StreamIdleTimeoutError"}},StreamStartTimeoutError=class extends Error{constructor(timeoutMs){super(`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs \u2014 retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`),this.name="StreamStartTimeoutError"}};async function runLoop(initialContext,newMessages,initialConfig,signal,emit,streamFunction){let currentContext=initialContext,config=initialConfig,firstTurn=!0,firstProviderRequest=!0,drainedTerminatingQueue,turnStartAlreadyEmitted=!1,explicitContinuation=!1,preparedMessages=[],refreshTerminatingQueueDrain=async()=>{!drainedTerminatingQueue||!config.restorePendingMessages||(await config.restorePendingMessages(drainedTerminatingQueue,pendingMessages),pendingMessages=await config.getSteeringMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"steering":void 0,pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],drainedTerminatingQueue=pendingMessages.length>0?"followUp":void 0))},pendingMessages=await config.getSteeringMessages?.()||[];for(;;){let hasMoreToolCalls=!0;for(;hasMoreToolCalls||pendingMessages.length>0;){if(turnStartAlreadyEmitted?turnStartAlreadyEmitted=!1:firstTurn?firstTurn=!1:await emit({type:"turn_start"}),drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}for(let message2 of declareToolChanges(currentContext,[...preparedMessages,...pendingMessages],config.model))await emit({type:"message_start",message:message2}),await emit({type:"message_end",message:message2}),currentContext.messages.push(message2),newMessages.push(message2);preparedMessages=[],pendingMessages=[];let requestUpdate=await config.prepareRequest?.({context:currentContext,model:config.model,thinkingLevel:config.reasoning??"off"},signal);requestUpdate&&(currentContext=requestUpdate.context??currentContext,config=applyLoopUpdate(config,requestUpdate));let isInitialProviderRequest=firstProviderRequest;firstProviderRequest=!1;let requestConfig=isInitialProviderRequest?{...config,timeoutMs:config.initialRequestTimeoutMs??config.timeoutMs,streamStartTimeoutMs:config.initialRequestStreamStartTimeoutMs??config.streamStartTimeoutMs}:config,streamed=await streamAssistantResponse(currentContext,requestConfig,signal,emit,withEmptyAssistantRecovery(requestConfig.model,streamFunction),isInitialProviderRequest?config.timeoutMs:requestConfig.timeoutMs),message=demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message)),providerToolResults=streamed.providerToolResults;newMessages.push(message);let toolResults=[];for(let result3 of providerToolResults)await emit({type:"message_start",message:result3}),await emit({type:"message_end",message:result3}),currentContext.messages.push(result3),newMessages.push(result3),toolResults.push(result3);if(shouldTerminateAssistantTurn(message)){await config.finishTurn?.({message,toolResults,context:currentContext,newMessages},signal),await emit({type:"turn_end",message,toolResults}),await emit({type:"agent_end",messages:newMessages});return}let toolCalls=message.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));hasMoreToolCalls=!1;let toolBatchTerminated=!1;if(toolCalls.length>0){let executedToolBatch=message.stopReason==="length"?await failToolCallsFromTruncatedMessage(toolCalls,emit):await executeToolCalls(currentContext,message,config,signal,emit);toolResults.push(...executedToolBatch.messages),toolBatchTerminated=executedToolBatch.terminate,hasMoreToolCalls=!executedToolBatch.terminate;for(let result3 of executedToolBatch.messages)currentContext.messages.push(result3),newMessages.push(result3)}let nextTurnContext={message,toolResults,context:currentContext,newMessages},decision=await config.finishTurn?.(nextTurnContext,signal);if(await emit({type:"turn_end",message,toolResults}),signal?.aborted){await emit({type:"agent_end",messages:newMessages});return}if(decision?.action==="end"){await emit({type:"agent_end",messages:newMessages});return}if(explicitContinuation=decision?.action==="continue",toolBatchTerminated){if(pendingMessages=await config.getSteeringMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="steering"),pendingMessages.length===0&&(pendingMessages=await config.getFollowUpMessages?.()||[],pendingMessages.length>0&&(drainedTerminatingQueue="followUp")),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}pendingMessages.length>0&&(await emit({type:"turn_start"}),turnStartAlreadyEmitted=!0)}let nextTurnSnapshot;try{nextTurnSnapshot=await config.prepareNextTurn?.(nextTurnContext)}catch(error2){throw drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),error2}if(nextTurnSnapshot&&(currentContext=nextTurnSnapshot.context??currentContext,preparedMessages=nextTurnSnapshot.messages??[],config=applyLoopUpdate(config,nextTurnSnapshot)),signal?.aborted){drainedTerminatingQueue&&await config.restorePendingMessages?.(drainedTerminatingQueue,pendingMessages),await emit({type:"agent_end",messages:newMessages});return}if(drainedTerminatingQueue){if(await refreshTerminatingQueueDrain(),pendingMessages.length===0&&!explicitContinuation){await emit({type:"agent_end",messages:newMessages});return}drainedTerminatingQueue=void 0}toolBatchTerminated||(pendingMessages=await config.getSteeringMessages?.()||[]),(hasMoreToolCalls||pendingMessages.length>0)&&(explicitContinuation=!1)}let followUpMessages=await config.getFollowUpMessages?.()||[];if(followUpMessages.length>0){explicitContinuation=!1,pendingMessages=followUpMessages;continue}if(explicitContinuation){explicitContinuation=!1;continue}break}await emit({type:"agent_end",messages:newMessages})}function applyLoopUpdate(config,update){return{...config,model:update.model??config.model,reasoning:update.thinkingLevel===void 0?config.reasoning:update.thinkingLevel==="off"?void 0:update.thinkingLevel,thinkingSelection:update.thinkingSelection===void 0?config.thinkingSelection:update.thinkingSelection??void 0,abortServerSideFallback:update.abortServerSideFallback??config.abortServerSideFallback}}function declareToolChanges(context,pendingMessages,model){let systemIndex=-1;for(let i=pendingMessages.length-1;i>=0;i--)if(pendingMessages[i].role==="system"){systemIndex=i;break}let pending=pendingMessages[systemIndex],baseline=pending?pendingMessages.map((message,index2)=>index2===systemIndex?withToolChanges(pending,NO_CHANGES):message):pendingMessages,declared=(providerTools(context,model).tools??[]).map(toProviderToolDeclaration),shorthand=createInitialSystemMessage(context.systemPrompt,declared),committed=shorthand?[shorthand,...context.messages,...baseline]:[...context.messages,...baseline],delta=getToolStateChanges(getCurrentTools(committed),declared),declaredByName=new Map(declared.map(tool=>[tool.name,tool])),changes={toolsAdded:delta.toolsAdded.map(tool=>declaredByName.get(tool.name)??tool),toolsRemoved:delta.toolsRemoved},unchanged=changes.toolsAdded.length===0&&changes.toolsRemoved.length===0;if(pending)return unchanged&&!pending.toolsAdded?.length&&!pending.toolsRemoved?.length?pendingMessages:baseline.map((message,index2)=>index2===systemIndex?withToolChanges(pending,changes):message);if(unchanged)return pendingMessages;let update=withToolChanges({role:"system",content:"",timestamp:Date.now()},changes),insertIndex=pendingMessages.findIndex(message=>message.role!=="system"),index=insertIndex===-1?pendingMessages.length:insertIndex;return[...pendingMessages.slice(0,index),update,...pendingMessages.slice(index)]}var NO_CHANGES={toolsAdded:[],toolsRemoved:[]};function toProviderToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:tool.parameters,...tool.freeform===void 0?{}:{freeform:tool.freeform},...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function withToolChanges(message,{toolsAdded,toolsRemoved}){let{toolsAdded:_added,toolsRemoved:_removed,...rest}=message;return{...rest,...toolsAdded.length>0?{toolsAdded}:{},...toolsRemoved.length>0?{toolsRemoved}:{}}}function providerTools(context,model){let declaredTools=context.declaredTools;if(declaredTools===void 0||model===void 0||!supportsAllowedToolChoice(model))return{tools:context.tools};let activeTools=context.tools??[],declaredNames=new Set(declaredTools.map(tool=>tool.name));return{tools:[...declaredTools,...activeTools.filter(tool=>!declaredNames.has(tool.name))],activeToolNames:activeTools.map(tool=>tool.name)}}async function buildProviderContext(context,config,signal){let messages=context.messages;config.transformContext&&(messages=await config.transformContext(messages,signal));let{tools,activeToolNames}=providerTools(context,config.model);return normalizeContext({systemPrompt:context.systemPrompt,messages:await config.convertToLlm(messages),...tools===void 0?{}:{tools:tools.map(toProviderToolDeclaration)},...activeToolNames===void 0?{}:{activeToolNames}})}async function streamAssistantResponse(context,config,signal,emit,streamFunction,streamIdleTimeoutMs){let partialMessage=null,addedPartial=!1,providerToolResults=[],thinkingTiming=new Map;function propagateThinkingTiming(finalMessage){for(let timing of thinkingTiming.values())timing.endedAt===void 0&&(timing.endedAt=Date.now());for(let[contentIndex,timing]of thinkingTiming){let block=finalMessage.content[contentIndex];block?.type==="thinking"&&(block.startedAt=timing.startedAt,block.endedAt=timing.endedAt)}}let requestAbortController=new AbortController,detachCallerAbort;if(signal!==void 0)if(signal.aborted)requestAbortController.abort(signal.reason);else{let onCallerAbort=()=>requestAbortController.abort(signal.reason);signal.addEventListener("abort",onCallerAbort,{once:!0}),detachCallerAbort=()=>signal.removeEventListener("abort",onCallerAbort)}try{let llmContext=await buildProviderContext(context,config,signal),resolvedApiKey=(config.getApiKey?await config.getApiKey(config.model.provider):void 0)||config.apiKey,response=await streamFunction(config.model,llmContext,{...config,streamKind:"main",apiKey:resolvedApiKey,signal:requestAbortController.signal,...config.cursorExecHandlers?{execHandlers:typeof config.cursorExecHandlers=="function"?config.cursorExecHandlers(signal??requestAbortController.signal):config.cursorExecHandlers,onToolResult:result4=>{providerToolResults.push(result4)}}:{}}),result3=async()=>Object.assign(await response.result(),{thinkingLevel:config.reasoning??"off"}),iterator=response[Symbol.asyncIterator](),eventReader=createAssistantEventReader(iterator,streamIdleTimeoutMs,requestAbortController.signal,error2=>requestAbortController.abort(error2),config.streamStartTimeoutMs,response);try{for(;;){let next=await eventReader.next();if(next.done)break;let event=next.value;switch(event.type){case"start":partialMessage=event.partial,context.messages.push(partialMessage),addedPartial=!0,await emit({type:"message_start",message:{...partialMessage}});break;case"text_start":case"text_delta":case"text_end":case"thinking_start":case"thinking_delta":case"thinking_end":case"toolcall_start":case"toolcall_delta":case"toolcall_end":if(partialMessage){if(partialMessage=event.partial,event.type==="thinking_start"||event.type==="thinking_delta"||event.type==="thinking_end"){let timing=thinkingTiming.get(event.contentIndex);event.type==="thinking_start"&&timing===void 0&&(timing={startedAt:Date.now()},thinkingTiming.set(event.contentIndex,timing)),event.type==="thinking_end"&&timing!==void 0&&(timing.endedAt=Date.now());let block=partialMessage.content[event.contentIndex];block?.type==="thinking"&&timing!==void 0&&(block.startedAt=timing.startedAt,timing.endedAt!==void 0&&(block.endedAt=timing.endedAt))}context.messages[context.messages.length-1]=partialMessage,await emit({type:"message_update",assistantMessageEvent:event,message:{...partialMessage}})}break;case"done":case"error":{let finalMessage2=normalizeTerminalAssistantMessage(await result3(),event);return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:context.messages.push(finalMessage2),addedPartial||await emit({type:"message_start",message:{...finalMessage2}}),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}}}}finally{eventReader.dispose()}let finalMessage=await result3();return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}catch(error2){if(isStreamIdleTimeoutError(error2)&&shouldFinalizeIdleAsStop(partialMessage,providerToolResults)){let finalMessage2={role:"assistant",content:partialMessage?.content??[{type:"text",text:""}],api:partialMessage?.api??config.model.api,provider:partialMessage?.provider??config.model.provider,model:partialMessage?.model??config.model.id,responseModel:partialMessage?.responseModel,responseId:partialMessage?.responseId,diagnostics:partialMessage?.diagnostics,usage:partialMessage?.usage??{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:partialMessage?.timestamp??Date.now()};return propagateThinkingTiming(finalMessage2),addedPartial?context.messages[context.messages.length-1]=finalMessage2:(context.messages.push(finalMessage2),await emit({type:"message_start",message:{...finalMessage2}})),await emit({type:"message_end",message:finalMessage2}),{message:finalMessage2,providerToolResults}}let finalMessage=createTerminalFailureAssistantMessage(config.model,signal?.aborted?"aborted":"error",error2,partialMessage);return propagateThinkingTiming(finalMessage),addedPartial?context.messages[context.messages.length-1]=finalMessage:(context.messages.push(finalMessage),await emit({type:"message_start",message:{...finalMessage}})),await emit({type:"message_end",message:finalMessage}),{message:finalMessage,providerToolResults}}finally{requestAbortController.abort(),detachCallerAbort?.()}}var ABORTED=Symbol("aborted");function abortError(reason){return reason instanceof Error?reason:new Error("Request was aborted")}function closeAssistantIterator(iterator){Promise.resolve(iterator.return?.()).catch(()=>{})}function normalizeTimeoutMs(timeoutMs){return typeof timeoutMs=="number"&&Number.isFinite(timeoutMs)&&timeoutMs>0?timeoutMs:void 0}function createAssistantEventReader(iterator,timeoutMs,signal,onIdleTimeout,streamStartTimeoutMs,stream2){let idleTimeoutMs=normalizeTimeoutMs(timeoutMs),startTimeoutMs=normalizeTimeoutMs(streamStartTimeoutMs),sawFirstEvent=!1,removeAbortListener2,abortPromise;return signal!==void 0&&(signal.aborted?abortPromise=Promise.resolve(ABORTED):abortPromise=new Promise(resolve46=>{let abortHandler=()=>resolve46(ABORTED);signal.addEventListener("abort",abortHandler,{once:!0}),removeAbortListener2=()=>signal.removeEventListener("abort",abortHandler)})),{next:async()=>{if(signal?.aborted)return closeAssistantIterator(iterator),Promise.reject(abortError(signal.reason));let useStartBound=!sawFirstEvent&&startTimeoutMs!==void 0,result3=await readNextAssistantEvent(iterator,useStartBound?startTimeoutMs:idleTimeoutMs,useStartBound?ms=>new StreamStartTimeoutError(ms):ms=>new StreamIdleTimeoutError(ms),abortPromise,onIdleTimeout,stream2,signal);return result3.done||(sawFirstEvent=!0),result3},dispose:()=>removeAbortListener2?.()}}async function readNextAssistantEvent(iterator,idleTimeoutMs,makeTimeoutError,abortPromise,onIdleTimeout,stream2,signal){if(idleTimeoutMs===void 0&&abortPromise===void 0)return iterator.next();let timeout,settled=!1;return new Promise((resolve46,reject)=>{let settle=complete=>{settled||(settled=!0,timeout!==void 0&&clearTimeout(timeout),complete())};if(idleTimeoutMs!==void 0){let onIdleDeadline=()=>{if(stream2?.hasPendingLocalWork?.()){timeout=setTimeout(onIdleDeadline,idleTimeoutMs);return}let error2=makeTimeoutError(idleTimeoutMs);closeAssistantIterator(iterator),settle(()=>reject(error2)),onIdleTimeout?.(error2)};timeout=setTimeout(onIdleDeadline,idleTimeoutMs)}(abortPromise?Promise.race([iterator.next(),abortPromise]):iterator.next()).then(result3=>{if(result3===ABORTED){closeAssistantIterator(iterator),settle(()=>reject(abortError(signal?.reason)));return}settle(()=>resolve46(result3))},error2=>settle(()=>reject(error2)))})}function createIncompleteToolCallErrorMessage(toolName,errorMessage8){return errorMessage8!==void 0?`${errorMessage8}${errorMessage8.endsWith(".")?"":"."} Re-issue the tool call with complete arguments.`:`Tool call "${toolName}" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`}async function failToolCallsFromTruncatedMessage(toolCalls,emit){let messages=[];for(let toolCall of toolCalls){await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments});let finalized={toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),isError:!0};await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:!1}}async function executeToolCalls(currentContext,assistantMessage,config,signal,emit){let toolCalls=assistantMessage.content.filter(c=>c.type==="toolCall"&&!isCursorExecResolved(c));return config.toolExecution==="sequential"?executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit):executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit)}async function executeToolCallsSequential(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],messages=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),finalized;if(preparation.kind==="immediate")finalized={toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};else{let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));finalized=await finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}await emitToolExecutionEnd(finalized,emit);let toolResultMessage=createToolResultMessage(finalized);if(await emitToolResultMessage(toolResultMessage,emit),finalizedCalls.push(finalized),messages.push(toolResultMessage),signal?.aborted)break}return{messages,terminate:shouldTerminateToolBatch(finalizedCalls)}}async function executeToolCallsParallel(currentContext,assistantMessage,toolCalls,config,signal,emit){let finalizedCalls=[],preparedCalls=[],lastSequentialCall,currentParallelWave=[];for(let toolCall of toolCalls){let tool=await resolveCallTool(currentContext,toolCall,config);await emit({type:"tool_execution_start",toolCallId:toolCall.id,toolName:tool?.name??toolCall.name,args:toolCall.arguments});let preparation=await prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal),isSequential=isSequentialToolCall(currentContext,preparation.toolCall),dependencies=isSequential?[...lastSequentialCall?[lastSequentialCall]:[],...currentParallelWave]:lastSequentialCall?[lastSequentialCall]:[];if(preparedCalls.push({preparation,isSequential,dependencies}),isSequential?(lastSequentialCall=void 0,currentParallelWave=[]):currentParallelWave.push(Promise.resolve(void 0)),signal?.aborted)break}let previousSequential,previousWave=[];for(let{preparation,isSequential}of preparedCalls){let dependencies=isSequential?[...previousSequential?[previousSequential]:[],...previousWave]:previousSequential?[previousSequential]:[],finalizedCall=(async()=>{await Promise.all(dependencies);let finalized=signal?.aborted?{toolCall:preparation.toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:await runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit);return await emitToolExecutionEnd(finalized,emit),finalized})();finalizedCalls.push(finalizedCall),isSequential?(previousSequential=finalizedCall,previousWave=[]):previousWave.push(finalizedCall)}let orderedFinalizedCalls=await Promise.all(finalizedCalls),messages=[];for(let finalized of orderedFinalizedCalls){let toolResultMessage=createToolResultMessage(finalized);await emitToolResultMessage(toolResultMessage,emit),messages.push(toolResultMessage)}return{messages,terminate:shouldTerminateToolBatch(orderedFinalizedCalls)}}async function runPreparedToolCall(currentContext,assistantMessage,preparation,config,signal,emit){if(preparation.kind==="immediate")return{toolCall:preparation.toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,emitToolExecutionUpdate(preparation.toolCall,emit));return finalizeExecutedToolCall(currentContext,assistantMessage,preparation,executed,config,signal)}function isSequentialToolCall(currentContext,toolCall){return currentContext.tools?.find(tool=>tool.name===toolCall.name)?.executionMode==="sequential"}function shouldTerminateToolBatch(finalizedCalls){return finalizedCalls.length>0&&finalizedCalls.every(finalized=>finalized.result.terminate===!0)}function prepareAgentToolCall(tool,toolCall){let preparedToolCall=prepareAgentToolCallArguments(tool,toolCall);return{toolCall:preparedToolCall,tool,args:validateToolArguments(tool,preparedToolCall)}}async function prepareToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){if(toolCall.incomplete===!0)return{kind:"immediate",toolCall,result:createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name,toolCall.errorMessage)),isError:!0};if(!tool){let hint=config.removedToolHints?.[toolCall.name];return{kind:"immediate",toolCall,result:createErrorToolResult(hint===void 0?`Tool ${toolCall.name} not found`:`Tool ${toolCall.name} not found. ${hint}`),isError:!0}}if(tool.name!==toolCall.name){let requestedName=toolCall.name,outcome=await prepareResolvedToolCall(currentContext,assistantMessage,{...toolCall,name:tool.name},tool,config,signal);return outcome.kind==="prepared"?{...outcome,requestedName}:{...outcome,result:withToolNameCorrection(outcome.result,requestedName,tool.name)}}return prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal)}async function prepareResolvedToolCall(currentContext,assistantMessage,toolCall,tool,config,signal){try{let preparedToolCall=prepareAgentToolCall(tool,toolCall),validatedArgs=preparedToolCall.args;if(config.beforeToolCall){let beforeResult=await config.beforeToolCall({assistantMessage,toolCall:preparedToolCall.toolCall,args:validatedArgs,context:currentContext},signal);if(signal?.aborted)return{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0};if(beforeResult?.block){let result3=createErrorToolResult(beforeResult.reason||"Tool execution was blocked");return beforeResult.terminate===!0&&(result3.terminate=!0),{kind:"immediate",toolCall,result:result3,isError:!0}}}return signal?.aborted?{kind:"immediate",toolCall,result:createErrorToolResult("Operation aborted"),isError:!0}:{kind:"prepared",toolCall:preparedToolCall.toolCall,tool,args:validatedArgs}}catch(error2){return{kind:"immediate",toolCall,result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}}function abortReleasePromise(signal){if(signal!==void 0)return signal.aborted?Promise.resolve(ABORTED):new Promise(resolve46=>{signal.addEventListener("abort",()=>resolve46(ABORTED),{once:!0})})}function emitToolExecutionUpdate(toolCall,emit){return partialResult=>emit({type:"tool_execution_update",toolCallId:toolCall.id,toolName:toolCall.name,args:toolCall.arguments,partialResult})}async function runToolCall(toolCall,options){let{assistantMessage,context,signal}=options,tool=options.tools.find(candidate=>candidate.name===toolCall.name),preparation=await prepareToolCall(context,assistantMessage,toolCall,tool,options,signal);if(preparation.kind==="immediate")return{toolCall,result:preparation.result,isError:preparation.isError};let executed=await executePreparedToolCall(preparation,signal,options.onUpdate??(()=>{}));return finalizeExecutedToolCall(context,assistantMessage,preparation,executed,options,signal)}async function executePreparedToolCall(prepared,signal,onUpdate){let updateEvents=[],acceptingUpdates=!0;try{let execution=prepared.tool.execute(prepared.toolCall.id,prepared.args,signal,partialResult=>{acceptingUpdates&&updateEvents.push(Promise.resolve(onUpdate(partialResult)))}),abortRelease=abortReleasePromise(signal),settled=abortRelease?await Promise.race([execution,abortRelease]):await execution;return settled===ABORTED?(Promise.resolve(execution).catch(()=>{}),acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult("Tool execution aborted"),isError:!0}):(acceptingUpdates=!1,await Promise.all(updateEvents),{result:settled,isError:settled.isError===!0})}catch(error2){return acceptingUpdates=!1,await Promise.all(updateEvents),{result:createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError:!0}}finally{acceptingUpdates=!1}}async function finalizeExecutedToolCall(currentContext,assistantMessage,prepared,executed,config,signal){let result3=executed.result,isError=executed.isError;if(config.afterToolCall)try{let afterResult=await config.afterToolCall({assistantMessage,toolCall:prepared.toolCall,args:prepared.args,result:result3,isError,context:currentContext},signal);if(afterResult){let structuredContent=afterResult.structuredContent??(afterResult.content?void 0:result3.structuredContent);result3={...result3,content:afterResult.content??result3.content,details:afterResult.details??result3.details,usage:afterResult.usage??result3.usage,terminate:afterResult.terminate??result3.terminate},structuredContent===void 0?delete result3.structuredContent:result3.structuredContent=structuredContent,isError=afterResult.isError??isError}}catch(error2){result3=createErrorToolResult(error2 instanceof Error?error2.message:String(error2)),isError=!0}return prepared.requestedName!==void 0&&(result3=withToolNameCorrection(result3,prepared.requestedName,prepared.toolCall.name)),{toolCall:prepared.toolCall,result:result3,isError}}function createErrorToolResult(message){return{content:[{type:"text",text:message}],details:{}}}async function emitToolExecutionEnd(finalized,emit){await emit({type:"tool_execution_end",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,result:finalized.result,isError:finalized.isError})}function createToolResultMessage(finalized){return{role:"toolResult",toolCallId:finalized.toolCall.id,toolName:finalized.toolCall.name,content:finalized.result.content??[],details:finalized.result.details,usage:finalized.result.usage,...finalized.result.addedToolNames?.length?{addedToolNames:finalized.result.addedToolNames}:{},isError:finalized.isError,timestamp:Date.now()}}async function emitToolResultMessage(toolResultMessage,emit){await emit({type:"message_start",message:toolResultMessage}),await emit({type:"message_end",message:toolResultMessage})}function defaultConvertToLlm(messages){return messages.filter(message=>message.role==="system"||message.role==="user"||message.role==="assistant"||message.role==="toolResult")}var EMPTY_USAGE2={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},DEFAULT_MODEL={id:"unknown",name:"unknown",api:"unknown",provider:"unknown",baseUrl:"",reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function createMutableAgentState(initialState){let tools=initialState?.tools?.slice()??[],messages=initialState?.messages?.slice()??[];return{systemPrompt:initialState?.systemPrompt??"",model:initialState?.model??DEFAULT_MODEL,thinkingLevel:initialState?.thinkingLevel??"off",reasoningBaseline:initialState?.reasoningBaseline,get tools(){return tools},set tools(nextTools){tools=nextTools.slice()},get messages(){return messages},set messages(nextMessages){messages=nextMessages.slice()},declaredTools:initialState?.declaredTools?.slice(),isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0,providerDiagnostic:void 0}}var LLM_ROLES=new Set(["user","assistant","toolResult","system"]);function isBackgroundNotice(message){return!LLM_ROLES.has(message.role)}var PendingMessageQueue=class{constructor(mode){this.messages=[],this.clearGeneration=0,this.mode=mode}enqueue(message){this.messages.push(message)}hasItems(){return this.messages.length>0}getClearGeneration(){return this.clearGeneration}peek(){if(this.mode==="all")return this.messages.slice();let first=this.messages[0];if(!first)return[];if(!isBackgroundNotice(first))return[first];let end=1;for(;end<this.messages.length&&isBackgroundNotice(this.messages[end]);)end++;return this.messages.slice(0,end)}drain(){let drained=this.peek();return this.messages=this.messages.slice(drained.length),drained}prepend(messages){this.messages=[...messages,...this.messages]}clear(){this.messages=[],this.clearGeneration++}},Agent=class{async buildProviderContext(context,signal){return buildProviderContext(context,{convertToLlm:this.convertToLlm,transformContext:this.transformContext,model:this._state.model},signal)}constructor(options){this.listeners=new Set;let runtimeOptions=options??{};this._state=createMutableAgentState(runtimeOptions.initialState),this.convertToLlm=runtimeOptions.convertToLlm??defaultConvertToLlm,this.transformContext=runtimeOptions.transformContext,this.streamFunction=runtimeOptions.streamFn??getDefaultStreamFn(),this.getApiKey=runtimeOptions.getApiKey,this.onPayload=runtimeOptions.onPayload,this.onResponse=runtimeOptions.onResponse,this.onProviderStreamEvent=runtimeOptions.onProviderStreamEvent,this.beforeToolCall=runtimeOptions.beforeToolCall,this.afterToolCall=runtimeOptions.afterToolCall,this.finishTurn=runtimeOptions.finishTurn,this.prepareRequest=runtimeOptions.prepareRequest,this.prepareNextTurn=runtimeOptions.prepareNextTurn,this.prepareNextTurnWithContext=runtimeOptions.prepareNextTurnWithContext,this.steeringQueue=new PendingMessageQueue(runtimeOptions.steeringMode??"one-at-a-time"),this.followUpQueue=new PendingMessageQueue(runtimeOptions.followUpMode??"one-at-a-time"),this.sessionId=runtimeOptions.sessionId,this.thinkingBudgets=runtimeOptions.thinkingBudgets,this.transport=runtimeOptions.transport??"auto",this.timeoutMs=runtimeOptions.timeoutMs,this.streamStartTimeoutMs=runtimeOptions.streamStartTimeoutMs,this.maxRetryDelayMs=runtimeOptions.maxRetryDelayMs,this.toolExecution=runtimeOptions.toolExecution??"parallel",this.removedToolHints=runtimeOptions.removedToolHints??{},this.resolveUnknownToolCall=runtimeOptions.resolveUnknownToolCall,this.abortServerSideFallback=runtimeOptions.abortServerSideFallback,this.cursorExecHandlers=runtimeOptions.cursorExecHandlers}subscribe(listener){return this.listeners.add(listener),()=>this.listeners.delete(listener)}get state(){return this._state}set steeringMode(mode){this.steeringQueue.mode=mode}get steeringMode(){return this.steeringQueue.mode}set followUpMode(mode){this.followUpQueue.mode=mode}get followUpMode(){return this.followUpQueue.mode}steer(message){this.steeringQueue.enqueue(message)}followUp(message){this.followUpQueue.enqueue(message)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}peekQueuedMessages(){let steering=this.steeringQueue.peek();return steering.length>0?steering:this.followUpQueue.peek()}get signal(){return this.activeRun?.abortController.signal}abort(reason){this.activeRun?.abortController.abort(reason)}suppressQueuedMessageDrain(){this.activeRun&&(this.activeRun.suppressQueuedMessageDrain=!0)}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before resetting.");this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(input,images){if(this.activeRun)throw new Error("Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.");let messages=this.normalizePromptInput(input,images);await this.runPromptMessages(messages)}async continueWithQueuedMessages(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");if(this._state.messages[this._state.messages.length-1]?.role==="assistant"){await this.continue(options);return}let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}await this.continue(options)}async continue(options={}){if(this.activeRun)throw new Error("Agent is already processing. Wait for completion before continuing.");let lastMessage=this._state.messages[this._state.messages.length-1];if(!lastMessage||this._state.messages.every(message=>message.role==="system"))throw new Error("No messages to continue from");if(lastMessage.role==="assistant"){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await this.runPromptMessages(queuedSteering,{skipInitialSteeringPoll:!0,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}let queuedFollowUps=this.followUpQueue.drain();if(queuedFollowUps.length>0){await this.runPromptMessages(queuedFollowUps,{initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs});return}throw new Error("Cannot continue from message role: assistant")}await this.runContinuation(options)}normalizePromptInput(input,images){if(Array.isArray(input))return input;if(typeof input!="string")return[input];let content=[{type:"text",text:input}];return images&&images.length>0&&content.push(...images),[{role:"user",content,timestamp:Date.now()}]}async runPromptMessages(messages,options={}){await this.runWithLifecycle(async signal=>{await runAgentLoop(messages,this.createContextSnapshot(),this.createLoopConfig(options),event=>this.processEvents(event),signal,this.streamFunction)})}async runContinuation(options={}){await this.runWithLifecycle(async signal=>{await runAgentLoopContinue(this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:options.deferQueuedMessages,initialRequestTimeoutMs:options.timeoutMs,initialRequestStreamStartTimeoutMs:options.streamStartTimeoutMs}),event=>this.processEvents(event),signal,this.streamFunction)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice(),...this._state.declaredTools?{declaredTools:this._state.declaredTools.slice()}:{}}}createLoopConfig(options={}){let skipInitialSteeringPoll=options.skipInitialSteeringPoll===!0,steeringQueueGeneration=this.steeringQueue.getClearGeneration(),followUpQueueGeneration=this.followUpQueue.getClearGeneration(),finishTurn2=this.finishTurn,reasoning=this._state.reasoningBaseline??this._state.thinkingLevel;return{model:this._state.model,reasoning:reasoning==="off"?void 0:reasoning,thinkingSelection:this._state.thinkingSelection,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,onProviderStreamEvent:this.onProviderStreamEvent,transport:this.transport,thinkingBudgets:this.thinkingBudgets,timeoutMs:this.timeoutMs,streamStartTimeoutMs:this.streamStartTimeoutMs,initialRequestTimeoutMs:options.initialRequestTimeoutMs,initialRequestStreamStartTimeoutMs:options.initialRequestStreamStartTimeoutMs,maxRetryDelayMs:this.maxRetryDelayMs,abortServerSideFallback:this.abortServerSideFallback,cursorExecHandlers:this.cursorExecHandlers,toolExecution:this.toolExecution,removedToolHints:this.removedToolHints,resolveUnknownToolCall:this.resolveUnknownToolCall,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,finishTurn:finishTurn2?async(turn,signal)=>{let decision=await finishTurn2(turn,signal)??void 0;return decision?.action==="end"&&this.suppressQueuedMessageDrain(),decision}:void 0,prepareRequest:this.prepareRequest,prepareNextTurn:this.prepareNextTurnWithContext||this.prepareNextTurn?async context=>this.prepareNextTurnWithContext?await this.prepareNextTurnWithContext(context,this.signal):await this.prepareNextTurn?.(this.signal):void 0,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>skipInitialSteeringPoll?(skipInitialSteeringPoll=!1,[]):(steeringQueueGeneration=this.steeringQueue.getClearGeneration(),this.steeringQueue.drain()),getFollowUpMessages:async()=>(followUpQueueGeneration=this.followUpQueue.getClearGeneration(),this.followUpQueue.drain()),restorePendingMessages:(queue,messages)=>{if(queue==="steering"){if(this.steeringQueue.getClearGeneration()!==steeringQueueGeneration)return;this.steeringQueue.prepend(messages);return}this.followUpQueue.getClearGeneration()===followUpQueueGeneration&&this.followUpQueue.prepend(messages)}}}async runWithLifecycle(executor){if(this.activeRun)throw new Error("Agent is already processing.");let abortController=new AbortController,resolvePromise=()=>{},promise=new Promise(resolve46=>{resolvePromise=resolve46});this.activeRun={promise,resolve:resolvePromise,abortController,suppressQueuedMessageDrain:!1},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0,this._state.providerDiagnostic=void 0;try{for(await executor(abortController.signal);!abortController.signal.aborted&&!this.activeRun?.suppressQueuedMessageDrain&&this.canDrainQueuedMessagesAfterRun()&&this.hasQueuedMessages();)await this.runQueuedMessagesAfterAgentEnd(abortController.signal)}catch(error2){await this.handleRunFailure(error2,abortController.signal.aborted)}finally{this.finishRun()}}canDrainQueuedMessagesAfterRun(){let lastMessage=this._state.messages[this._state.messages.length-1];return lastMessage?.role!=="assistant"||lastMessage.stopReason!=="error"&&lastMessage.stopReason!=="aborted"}async runQueuedMessagesAfterAgentEnd(signal){let queuedSteering=this.steeringQueue.drain();if(queuedSteering.length>0){await runAgentLoop(queuedSteering,this.createContextSnapshot(),this.createLoopConfig({skipInitialSteeringPoll:!0}),event=>this.processEvents(event),signal,this.streamFunction);return}let queuedFollowUps=this.followUpQueue.drain();queuedFollowUps.length!==0&&await runAgentLoop(queuedFollowUps,this.createContextSnapshot(),this.createLoopConfig(),event=>this.processEvents(event),signal,this.streamFunction)}async handleRunFailure(error2,aborted){let providerDiagnostic=aborted?void 0:readProviderDiagnostic(error2),failureMessage={role:"assistant",content:[{type:"text",text:""}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:EMPTY_USAGE2,stopReason:aborted?"aborted":"error",errorMessage:error2 instanceof Error?error2.message:String(error2),...providerDiagnostic===void 0?{}:{providerDiagnostic},...error2 instanceof ProviderRetryWatchdogAbortError?{abortSource:"provider"}:{},timestamp:Date.now()};await this.processEvents({type:"message_start",message:failureMessage}),await this.processEvents({type:"message_end",message:failureMessage}),await this.processEvents({type:"turn_end",message:failureMessage,toolResults:[]}),await this.processEvents({type:"agent_end",messages:[failureMessage]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(event){switch(event.type){case"message_start":this._state.streamingMessage=event.message;break;case"message_update":this._state.streamingMessage=event.message;break;case"message_end":this._state.streamingMessage=void 0,this._state.messages.push(event.message);break;case"tool_execution_start":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.add(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"tool_execution_end":{let pendingToolCalls=new Set(this._state.pendingToolCalls);pendingToolCalls.delete(event.toolCallId),this._state.pendingToolCalls=pendingToolCalls;break}case"turn_end":event.message.role==="assistant"&&event.message.errorMessage&&(this._state.errorMessage=event.message.errorMessage,this._state.providerDiagnostic=sanitizeProviderDiagnostic(event.message.providerDiagnostic));break;case"agent_end":this._state.streamingMessage=void 0;break}let signal=this.activeRun?.abortController.signal;if(!signal)throw new Error("Agent listener invoked outside active run");for(let listener of this.listeners)await listener(event,signal)}async emitExternalEvent(event,runSignal){let activeSignal=this.activeRun?.abortController.signal;!activeSignal||runSignal&&runSignal!==activeSignal||await this.processEvents(event)}};var Result={ok(value2){return{ok:!0,value:value2}},err(error2){return{ok:!1,error:error2}},isOk(result3){return result3.ok},isErr(result3){return!result3.ok}};function TaggedError(tag){class TaggedErrorClass extends Error{constructor(props){super(props.message),this._tag=tag,this.name=tag,Object.assign(this,props)}toJSON(){let payload={};for(let key of Object.keys(this))key!=="_tag"&&(payload[key]=this[key]);return{_tag:tag,message:this.message,...payload}}static is(value2){return value2 instanceof TaggedErrorClass}}return TaggedErrorClass}var LaneBusy=class extends TaggedError("LaneBusy"){},OperationMismatch=class extends TaggedError("OperationMismatch"){},NoActiveRun=class extends TaggedError("NoActiveRun"){},NoActiveOperation=class extends TaggedError("NoActiveOperation"){},NothingToResume=class extends TaggedError("NothingToResume"){},NothingToCompact=class extends TaggedError("NothingToCompact"){},InvalidMessage=class extends TaggedError("InvalidMessage"){},InvalidNavigation=class extends TaggedError("InvalidNavigation"){},UnknownSkill=class extends TaggedError("UnknownSkill"){},UnknownTemplate=class extends TaggedError("UnknownTemplate"){},UnknownTarget=class extends TaggedError("UnknownTarget"){},InvalidLane=class extends TaggedError("InvalidLane"){},Closed=class extends TaggedError("Closed"){},HarnessFault=class extends Error{constructor(message,cause){super(message),this.name="HarnessFault",this.cause=cause}},HarnessClosed=class extends Error{constructor(){super("AgentHarness was closed while the operation was active"),this.name="HarnessClosed"}};function matchError(error2,matchers){let matcher=matchers[error2._tag];return matcher(error2)}import{awaitWithContext,BACKGROUND_CONTEXT,createContextKey,TODO_CONTEXT,withAbortSignal,withCancel,withContextValue,withoutAbortSignal}from"@earendil-works/chord/context";var TELEMETRY_CONTEXT_KEY=createContextKey("pi.telemetryContext");function getTelemetryContext(context){return context.value(TELEMETRY_CONTEXT_KEY)??NOOP_TELEMETRY_CONTEXT}function withTelemetryContext(telemetryContext,context){return withContextValue(TELEMETRY_CONTEXT_KEY,telemetryContext,context)}var AbortRequested=class extends Error{constructor(cancellation){super("Abort requested"),this.name="AbortRequested",this.cancellation=cancellation}};function createGate(){let state={status:"open"},controller=new AbortController,check=()=>{if(state.status==="aborting")throw new AbortRequested(state.cancellation);if(state.status==="closed")throw state.error};return{gate:{admit(invoke){return check(),invoke()},signal:controller.signal},control:{beginAbort(cancellation){state.status==="open"&&(state={status:"aborting",cancellation})},signalAbort(){state.status!=="aborting"||controller.signal.aborted||controller.abort(new AbortRequested(state.cancellation))},close(error2){state.status!=="closed"&&(state={status:"closed",error:error2},controller.signal.aborted||controller.abort(error2))}}}}var SliceNotImplemented=class extends Error{constructor(operation){super(`${operation} is not implemented until its later AgentHarness slice`),this.name="SliceNotImplemented"}},Drive=class{constructor(options,context){this.operationId=options.operationId,this.context=withoutAbortSignal(context),this.waitForRetry=options.waitForRetry??!1,this.deferredPermits=options.pollDeferred===!0?1:0;let resolveCompletion,rejectCompletion;this.completion=new Promise((resolve46,reject)=>{resolveCompletion=resolve46,rejectCompletion=reject}),this.resolveCompletion=resolveCompletion,this.rejectCompletion=rejectCompletion,this.completion.catch(()=>{});let{gate,control}=createGate();this.gate=gate,this.control=control,this.closeController=new AbortController,this.closeSignal=this.closeController.signal}settle(outcome){this.resolveCompletion(outcome)}fail(error2){this.rejectCompletion(error2)}beginAbort(cancellation){this.control.beginAbort(cancellation)}signalAbort(){this.control.signalAbort()}closeGate(error2){this.control.close(error2),this.closeSignal.aborted||this.closeController.abort(error2),this.rejectCompletion(error2)}};var COMPACTION_SUMMARY_PREFIX=`The conversation history before this point was compacted into the following summary:
3
3
 
4
4
  <summary>
5
5
  `,COMPACTION_SUMMARY_SUFFIX=`
@@ -1002,7 +1002,7 @@ IMPORTANT: Respond with ONLY the <summary>...</summary> block as your text outpu
1002
1002
  ${sanitizeCustomInstructions(trimmedInstructions)}
1003
1003
  </custom-instructions>`:userPrompt}function sanitizePreviousSummary(previousSummary){let trimmedSummary=previousSummary?.trim();return trimmedSummary?trimmedSummary.split("</previous-summary>").join("[/previous-summary]"):"None."}function sanitizeCustomInstructions(customInstructions){return customInstructions.split("</custom-instructions>").join("[/custom-instructions]")}function sanitizeTaskIntent(text2){return text2.split("</task-intent>").join("[/task-intent]")}function normalizeSummarizationTurnOrder(messages){let merged=[];for(let message of messages){let previous=merged[merged.length-1];if(previous?.role==="assistant"&&message.role==="assistant"){let mergedPair=mergeAssistantPair(previous,message);if(mergedPair!==void 0){merged[merged.length-1]=mergedPair;continue}}merged.push(message)}let firstUserIndex=merged.findIndex(message=>message.role==="user");return firstUserIndex===-1||firstUserIndex===merged.length-1?merged:merged.slice(firstUserIndex)}function mergeAssistantPair(first,second){if(!(first.role!=="assistant"||second.role!=="assistant")&&!(first.stopReason==="error"||first.stopReason==="aborted")&&!(second.stopReason==="error"||second.stopReason==="aborted")&&!(!Array.isArray(first.content)||!Array.isArray(second.content)))return{...first,content:[...first.content,...second.content]}}var SUMMARY_TOKEN_HEADROOM=32768,SUMMARY_CONTEXT_WINDOW_RESERVE_RATIO=.5;function summaryMaxTokens(model,contextWindow){let headroom=model.maxTokens>0?Math.min(SUMMARY_TOKEN_HEADROOM,model.maxTokens):SUMMARY_TOKEN_HEADROOM;return contextWindow>0?Math.min(headroom,Math.floor(contextWindow*SUMMARY_CONTEXT_WINDOW_RESERVE_RATIO)):headroom}function summarizationReasoningOptions(model){if(!model.reasoning)return{};if(model.api==="anthropic-messages")return{thinkingEnabled:!1};let reasoningEffort=["low","medium","high"].find(level=>model.thinkingLevelMap?.[level]!==null);if(!reasoningEffort)return{};switch(model.api){case"openai-responses":case"openai-codex-responses":case"azure-openai-responses":return{reasoningEffort,reasoningSummary:null};case"openai-completions":return{reasoningEffort};default:return{}}}function hasSummarizationReasoningOverride(model){return Object.keys(summarizationReasoningOptions(model)).length>0}function getSummaryText(message){return(Array.isArray(message.content)?message.content:[{type:"text",text:message.content}]).filter(content2=>content2.type==="text").map(content2=>content2.text).join(`
1004
1004
  `).trim()}function isAssistantMessage2(message){return message.role==="assistant"&&"stopReason"in message}function summarizationStream(context,model,requestContext,options){let runtime=context.modelRegistry?.modelRuntime;return runtime?runtime.stream(model,requestContext,options):stream(model,requestContext,options)}async function generateSummaryMessage(options){let requestController=new AbortController,onCallerAbort=()=>requestController.abort(options.signal?.reason);options.signal&&(options.signal.aborted?onCallerAbort():options.signal.addEventListener("abort",onCallerAbort,{once:!0}));try{let requestMessages=[...options.messages,{role:"user",content:[{type:"text",text:options.prompt.user}],timestamp:Date.now()}],maxDurationMs=options.maxDurationMs??summarizationMaxDurationMs(requestMessages.reduce((total,message)=>total+estimateTokens2(message),0)),providerRequest=await options.context.prepareProviderRequest?.(requestMessages),requestContext={systemPrompt:options.snapshot.systemPrompt??options.prompt.system,messages:repairOrphanedToolResults(normalizeSummarizationTurnOrder(convertToLlm(providerRequest?.messages??requestMessages))),...options.snapshot.tools&&options.snapshot.tools.length>0?{tools:options.snapshot.tools}:{}},headers=providerRequest?await providerRequest.transformHeaders(options.auth.headers??{}):options.auth.headers,responseStream=summarizationStream(options.context,options.snapshot.model,requestContext,{apiKey:options.auth.apiKey,headers,extraBody:options.auth.extraBody,onPayload:async(payload,model)=>{let sanitized=model.api==="anthropic-messages"?sanitizeAnthropicToolPairs(payload):payload;return providerRequest?await providerRequest.transformPayload(sanitized):sanitized},maxTokens:summaryMaxTokens(options.snapshot.model,options.snapshot.contextWindow),signal:requestController.signal,...options.omitReasoningOptions?{}:summarizationReasoningOptions(options.snapshot.model),...options.forbidToolCalls?{toolChoice:"none"}:{}});return await consumeStreamWithIdleTimeout(responseStream,{idleTimeoutMs:DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,maxDurationMs,abort:()=>requestController.abort(),signal:options.signal,onEvent:event=>{event.type==="text_delta"&&event.delta&&options.onProgress?.(event.delta)},settle:async()=>await responseStream.result()})}finally{options.signal&&options.signal.removeEventListener("abort",onCallerAbort)}}var MAX_SUMMARIZATION_ATTEMPT_RETRIES=3;function summarizationRetryTotalBudgetMs(attemptBudgetMs){return attemptBudgetMs/2}var DEFAULT_SUMMARIZATION_RETRY_POLICY={enabled:!0,maxRetries:MAX_SUMMARIZATION_ATTEMPT_RETRIES,baseDelayMs:1e3};function allowSummarizationRetry(elapsedMs,attemptBudgetMs=DEFAULT_SUMMARIZATION_MAX_DURATION_MS){return elapsedMs<summarizationRetryTotalBudgetMs(attemptBudgetMs)}var TASK_INTENT_OPEN="<task-intent>",TASK_INTENT_CLOSE="</task-intent>",SUMMARY_OPEN="<summary>",SUMMARY_CLOSE="</summary>";var REMOTE_SCHEMA="senpi.compaction.openai-remote.v1",SUMMARY_SCHEMA="senpi.compaction.summary.v1";function extractTaskIntent(responseText2){let taskIntent,remaining=responseText2;for(;;){let block=findWellFormedBlock(remaining,TASK_INTENT_OPEN,TASK_INTENT_CLOSE);if(!block)break;taskIntent===void 0&&(taskIntent=capUtf8Bytes(block.inner.trim(),4096)),remaining=`${remaining.slice(0,block.start)}${remaining.slice(block.end)}`}let summaryBlocks=collectWellFormedBlocks(remaining,SUMMARY_OPEN,SUMMARY_CLOSE),summaryText=summaryBlocks.length>0?summaryBlocks.map(block=>block.inner.trim()).join(`
1005
- `).trim():remaining.trim();return summaryText?{...taskIntent===void 0?{}:{taskIntent},summaryText}:{...taskIntent===void 0?{}:{taskIntent},summaryText:""}}function resolveInheritedTaskIntent(branchEntries){for(let index=branchEntries.length-1;index>=0;index-=1){let rawEntry=branchEntries[index];if(!rawEntry||typeof rawEntry!="object"||Array.isArray(rawEntry))continue;let entry=rawEntry,details=entry.details;if(!details||typeof details!="object"||Array.isArray(details))continue;let typedDetails=details,schema=typeof typedDetails.schema=="string"?typedDetails.schema:entry.schema;if(schema===REMOTE_SCHEMA||schema!==SUMMARY_SCHEMA)continue;let taskIntent=typedDetails.taskIntent;if(typeof taskIntent!="string")continue;let trimmed=taskIntent.trim();if(trimmed)return capUtf8Bytes(trimmed,4096)}}function findWellFormedBlock(text2,openTag,closeTag){let start=text2.indexOf(openTag);if(start<0)return;let end=text2.indexOf(closeTag,start+openTag.length);if(!(end<0))return{start,end:end+closeTag.length,inner:text2.slice(start+openTag.length,end)}}function collectWellFormedBlocks(text2,openTag,closeTag){let blocks=[],searchFrom=0;for(;searchFrom<text2.length;){let start=text2.indexOf(openTag,searchFrom);if(start<0)break;let end=text2.indexOf(closeTag,start+openTag.length);if(end<0)break;blocks.push({start,end:end+closeTag.length,inner:text2.slice(start+openTag.length,end)}),searchFrom=end+closeTag.length}return blocks}function capUtf8Bytes(text2,maxBytes){let bytes=0,end=0;for(let char of text2){let size=Buffer.byteLength(char,"utf8");if(bytes+size>maxBytes)break;bytes+=size,end+=char.length}return text2.slice(0,end).trim()}function estimateMessageTokens(message){return estimateTokens2(message)}function approxTokens3(text2){return Math.max(0,estimateMessageTokens({role:"assistant",content:[{type:"text",text:text2}],api:"openai",provider:"openai",model:"",usage:{input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:0}))}function sumEstimateTokens(messages){return messages.reduce((total,message)=>total+estimateMessageTokens(message),0)}function computeStructuralYield({previousSummary,messagesToSummarize,turnPrefixMessages,summary,tokensBefore}){let replacedTokens=approxTokens3(previousSummary??"")+sumEstimateTokens(messagesToSummarize)+sumEstimateTokens(turnPrefixMessages),savedTokens=Math.max(0,replacedTokens-approxTokens3(summary));return{savedTokens,savingsRatio:tokensBefore>0?savedTokens/tokensBefore:0,tokensBefore}}function isIneffectiveCompaction({tokensBefore,savedTokens,savingsRatio}){return tokensBefore<=0||savedTokens<1024||savingsRatio<.1}var DEFAULT_CONTEXT_WINDOW=2e5,SUMMARY_SCHEMA2="senpi.compaction.summary.v1";function approxTokens4(text2){return Math.ceil(text2.length/4)}var SummaryRequestError=class extends Error{constructor(message,transient,failureKind,refused=!1){super(message),this.name="SummaryRequestError",this.transient=transient,this.failureKind=failureKind,this.refused=refused}},UPSTREAM_STREAM_TRUNCATED_PATTERN=/(?:^|[^A-Za-z0-9_])upstream_stream_truncated(?:[^A-Za-z0-9_]|$)/;function isRetryableSummaryAttempt(error2){return error2 instanceof StreamDurationBudgetError||error2 instanceof StreamIdleTimeoutError2||error2 instanceof SummarizationTotalBudgetError||error2 instanceof SummarizationOverflowExhaustedError||error2 instanceof SummaryGenerationError||error2 instanceof CredentialFailoverError||error2 instanceof Error&&error2.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)?!1:error2 instanceof SummaryRequestError?error2.failureKind===void 0&&error2.transient:error2 instanceof Error?isRetryableErrorMessage(error2.message):!1}function isRefusalStop(response){return response.stopDetails?.type==="refusal"||response.stopDetails?.type==="sensitive"}function summaryRequestFailureKind(response){if(!isRefusalStop(response))return UPSTREAM_STREAM_TRUNCATED_PATTERN.test(response.errorMessage??"")?"upstream-stream-truncated":void 0}var SummaryGenerationError=class extends Error{constructor(kind,message){super(message),this.name="SummaryGenerationError",this.kind=kind}};function getPromptVariant(options){return options.reason==="branch"?"branch":options.preparation.previousSummary?"update":options.preparation.isSplitTurn?"turn_prefix":"default"}function createSpeculativeCompactionSnapshot(context,options){let model=context.model;if(!model)return;let expectedRevision=context.getMessageRevision(),branchEntries=context.sessionManager.getBranch(),contextWindow=context.getContextUsage()?.contextWindow??model.contextWindow??DEFAULT_CONTEXT_WINDOW,settings=context.getCompactionSettings?.()??DEFAULT_COMPACTION_SETTINGS2,thresholdRatio=computeEffectiveThreshold(contextWindow),preparation=prepareCompaction2(branchEntries,{...settings,keepRecentTokens:computeEffectiveKeepRecentTokens(settings.keepRecentTokens,contextWindow,thresholdRatio)});if(preparation)return{...options,expectedRevision,model,contextWindow,preparation,branchEntries,promptVariant:getPromptVariant({reason:"extension",preparation}),systemPrompt:context.getSystemPrompt?.()}}async function runExtensionCompaction(context,snapshot,signal,onProgress){if(signal?.aborted)return;let auth=await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);if(signal?.aborted)return;if(!auth?.ok||!(auth.apiKey||hasCredentialHeaders(auth.headers)||auth.ambient)){let detail=auth&&!auth.ok?auth.error:`no credentials resolved for provider "${snapshot.model.provider}"`;throw new SummaryGenerationError("auth",`summarization credentials unavailable: ${detail}`)}let requestSnapshot=auth.baseUrl?{...snapshot,model:{...snapshot.model,baseUrl:auth.baseUrl}}:snapshot,prompt=buildPrompt({variant:requestSnapshot.promptVariant,previousSummary:requestSnapshot.preparation.previousSummary,taskIntent:resolveInheritedTaskIntent(requestSnapshot.branchEntries??[]),customInstructions:requestSnapshot.customInstructions}),promptTokens=approxTokens4(prompt.user),messages=boundSummarizationInput(pruneToolResults([...requestSnapshot.preparation.messagesToSummarize,...requestSnapshot.preparation.turnPrefixMessages],requestSnapshot.contextWindow,SUMMARIZATION_INPUT_BUDGET_RATIO),requestSnapshot.contextWindow,promptTokens),deadline=createSummarizationDeadline(summarizationTotalBudgetMs(requestSnapshot.preparation.settings.summarizationMaxDurationMs)),overflowRetryStartMs=Date.now(),overflowAttempts=0,summarizationToolsOffered=(requestSnapshot.tools?.length??0)>0,reasoningOverrideOffered=hasSummarizationReasoningOverride(requestSnapshot.model),toolUseRetrySpent=!1,reasoningOverrideRetrySpent=!1;for(;;){if(signal?.aborted)return;let response,currentMessages=messages,retryStartedMs=Date.now(),retryEligible=snapshot.origin==="core-route"||snapshot.origin==="blocking",attemptBudgetMs=summarizationMaxDurationMs(messages.reduce((total,message)=>total+estimateTokens2(message),0),snapshot.preparation.settings.summarizationMaxDurationMs);try{response=await retryTransientCall(async()=>{let attempt2=await generateSummaryMessage({context,forbidToolCalls:toolUseRetrySpent,maxDurationMs:deadline.attemptBudgetMs(attemptBudgetMs),messages:currentMessages,onProgress,prompt,signal,snapshot:requestSnapshot,auth:{apiKey:auth.apiKey,headers:auth.headers,extraBody:auth.extraBody},...reasoningOverrideRetrySpent?{omitReasoningOptions:!0}:{}});if(attempt2&&isAssistantMessage2(attempt2)&&attempt2.stopReason==="error"&&!isContextOverflow(attempt2,snapshot.contextWindow)){let failureKind=summaryRequestFailureKind(attempt2);throw new SummaryRequestError(attempt2.errorMessage||"Compaction summary request failed",failureKind!==void 0||isRetryableAssistantError(attempt2),failureKind,isRefusalStop(attempt2))}return attempt2},error2=>retryEligible&&deadline.remainingMs()>0&&allowSummarizationRetry(Date.now()-retryStartedMs,attemptBudgetMs)&&isRetryableSummaryAttempt(error2),DEFAULT_SUMMARIZATION_RETRY_POLICY,signal)}catch(error2){if(signal?.aborted)return;throw error2}if(!response)return;if(isAssistantMessage2(response)&&isContextOverflow(response,snapshot.contextWindow)){overflowAttempts++;let elapsedMs=Date.now()-overflowRetryStartMs,retryMessages=allowOverflowRetry(overflowAttempts,elapsedMs)?shrinkSummarizationInputForOverflowRetry(messages,snapshot.contextWindow,promptTokens):void 0;if(!retryMessages)throw new SummarizationOverflowExhaustedError(overflowAttempts,elapsedMs);messages=retryMessages;continue}if(isAssistantMessage2(response)&&response.stopReason==="aborted")return;if(isAssistantMessage2(response)&&response.stopReason==="error"){let failureKind=summaryRequestFailureKind(response);throw new SummaryRequestError(response.errorMessage||"Compaction summary request failed",failureKind!==void 0||isRetryableAssistantError(response),failureKind,isRefusalStop(response))}let summary=getSummaryText(response);if(!summary){let stopReason=isAssistantMessage2(response)?response.stopReason:"unknown";if(stopReason==="toolUse"&&summarizationToolsOffered&&!toolUseRetrySpent){toolUseRetrySpent=!0;continue}if(stopReason==="stop"&&reasoningOverrideOffered&&!reasoningOverrideRetrySpent){reasoningOverrideRetrySpent=!0;continue}throw new SummaryGenerationError("empty-summary",`summarization response contained no text (stopReason: ${stopReason})`)}let tokenEstimate=estimateContextTokens3(convertToLlm(messages)).tokens+approxTokens4(summary),parsedSummary=extractTaskIntent(summary),taskIntent=parsedSummary.taskIntent??resolveInheritedTaskIntent(snapshot.branchEntries??[]);return{summary:parsedSummary.summaryText,firstKeptEntryId:snapshot.preparation.firstKeptEntryId,tokensBefore:snapshot.preparation.tokensBefore,details:{schema:SUMMARY_SCHEMA2,promptVariant:snapshot.promptVariant,tokenEstimate,structuralYield:computeStructuralYield({previousSummary:snapshot.preparation.previousSummary??"",messagesToSummarize:snapshot.preparation.messagesToSummarize,turnPrefixMessages:snapshot.preparation.turnPrefixMessages,summary:parsedSummary.summaryText,tokensBefore:snapshot.preparation.tokensBefore}),...snapshot.origin?{origin:snapshot.origin}:{},...taskIntent?{taskIntent}:{}}}}}async function applyGeneratedCompaction(context,snapshot,getCurrentGeneration,compaction,signal){let provider=context.model?.provider;if((provider==="cursor"||provider==="cursor-cli-oauth")&&context.isIdle&&!context.isIdle())return{applied:!1,reason:"rejected"};if(!snapshot||!compaction)return{applied:!1,reason:"unavailable"};if(snapshot.generation!==getCurrentGeneration())return{applied:!1,reason:"stale"};let revisionUnchanged=snapshot.expectedRevision===context.getMessageRevision(),warmAnchor=createWarmAnchorSnapshot(snapshot.preparation.firstKeptEntryId,snapshot.branchEntries??[]);return!revisionUnchanged&&(!warmAnchor||!isWarmSummaryAnchorValid(warmAnchor,context.sessionManager.getBranch()))?{applied:!1,reason:"stale"}:await context.applyCompaction(compaction,{reason:"extension",...revisionUnchanged||!warmAnchor?{expectedRevision:snapshot.expectedRevision}:{expectedWarmAnchor:warmAnchor},signal})}function buildCompactionContext(input){if(input.laneOwnsCompaction)return repairOrphanedToolResults(convertToLlm(input.event.messages));let admittedMessages=admitContextToolResults(input.event.messages,input.contextWindow,input.toolAdmissionEnabled),sourceMessages=!input.laneOwnsCompaction&&(input.breakerFallback||shouldApplyContextReduction({usageTokens:input.ctx.getContextUsage()?.tokens??null,contextWindow:input.contextWindow,isProviderNativeCompactionPath:isOpenAiRemoteCompactionModel(input.ctx.model)||input.laneOwnsCompaction}))?reduceContextMessages(admittedMessages,BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages:admittedMessages,emergency=input.laneOwnsCompaction?{messages:sourceMessages,needsAggressiveCompaction:!1}:hardLimitEmergencyPrune(sourceMessages,input.promptContextWindow,input.emergencyPruneLatch);!input.laneOwnsCompaction&&(emergency.needsAggressiveCompaction||emergency.messages!==sourceMessages)&&input.logEmergencyPrune?.({route:"context-event",tokensBefore:estimateTotalTokens(sourceMessages),tokens:estimateTotalTokens(emergency.messages)});let marked=markOpenAiRemoteReplayBoundary(emergency.messages,{model:input.ctx.model,branchEntries:input.ctx.sessionManager.getBranch()}),reminded=injectTokenBudgetReminder(marked,input.reminder);return repairOrphanedToolResults(convertToLlm(reminded))}var RECOVERY_INSTRUCTIONS="RECOVERY: prior compaction caused degraded responses; rebuild context",RECOVERY_NOTIFICATION="Detected repeated no-text assistant responses; retried compaction recovery.";function createDegradationMonitorState(){return{postCompactionTurnsRemaining:0,noTextCounter:0,recoveryTriggeredThisCycle:!1,recoveryAttempts:0}}function resetOnSessionCompact(state){state.postCompactionTurnsRemaining=5,state.noTextCounter=0,state.recoveryTriggeredThisCycle=!1}function assistantMessageHasText(event){if(event.message.role!=="assistant")return!0;for(let part of event.message.content)if(part.type==="text"&&typeof part.text=="string"&&part.text.length>0)return!0;return!1}async function handleMessageEnd(state,event,context){if(state.postCompactionTurnsRemaining<=0)return;if(assistantMessageHasText(event)){state.noTextCounter=0;return}if(state.noTextCounter+=1,state.noTextCounter<3||state.recoveryTriggeredThisCycle||state.recoveryAttempts>=3)return;state.recoveryTriggeredThisCycle=!0,state.recoveryAttempts+=1,state.noTextCounter=0;let result3=await context.applyCompaction({customInstructions:RECOVERY_INSTRUCTIONS});(result3.applied||result3.reason!=="failed")&&context.notify(RECOVERY_NOTIFICATION)}function handleTurnEnd(state){state.postCompactionTurnsRemaining>0&&(state.postCompactionTurnsRemaining-=1)}function markFailedTurnFragments(messages){let retained=new Set(dropFailedAssistantTurns(messages));return messages.map(message=>!retained.has(message))}function isRecord15(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isFiniteNumber3(value2){return typeof value2=="number"&&Number.isFinite(value2)}function hasTextOnlyContent(content,allowString){return typeof content=="string"?allowString:Array.isArray(content)?content.every(block=>isRecord15(block)&&block.type==="text"&&typeof block.text=="string"):!1}function isWellFormedImageBlock(block){return block.type==="image"&&typeof block.mimeType=="string"&&block.mimeType.startsWith("image/")&&typeof block.data=="string"&&block.data.length>0}function hasSafeToolResultContent(content){return Array.isArray(content)?content.every(block=>isRecord15(block)&&(block.type==="text"&&typeof block.text=="string"||isWellFormedImageBlock(block))):!1}function isUsage2(value2){if(!isRecord15(value2)||!isRecord15(value2.cost))return!1;for(let field2 of["input","output","cacheRead","cacheWrite","totalTokens"])if(!isFiniteNumber3(value2[field2]))return!1;for(let field2 of["input","output","cacheRead","cacheWrite","total"])if(!isFiniteNumber3(value2.cost[field2]))return!1;return(value2.cacheWrite1h===void 0||isFiniteNumber3(value2.cacheWrite1h))&&(value2.reasoning===void 0||isFiniteNumber3(value2.reasoning))}var base64SignaturePattern=/^[A-Za-z0-9+/]+={0,2}$/;function isValidOpaqueSignature(sig){return typeof sig=="string"&&sig.length>0&&sig.length<=65536}function isValidProviderSignature(sig,providerIsGoogle){return isValidOpaqueSignature(sig)?!providerIsGoogle||sig.length%4===0&&base64SignaturePattern.test(sig):!1}function hasSafeAssistantContent(content,providerIsGoogle){if(!Array.isArray(content))return!1;for(let block of content){if(!isRecord15(block)||typeof block.type!="string")return!1;switch(block.type){case"text":if(typeof block.text!="string"||block.textSignature!==void 0&&!isValidProviderSignature(block.textSignature,providerIsGoogle))return!1;break;case"thinking":if(typeof block.thinking!="string"||block.startedAt!==void 0&&!isFiniteNumber3(block.startedAt)||block.endedAt!==void 0&&!isFiniteNumber3(block.endedAt)||block.redacted!==void 0&&typeof block.redacted!="boolean"||block.thinkingSignature!==void 0&&!isValidProviderSignature(block.thinkingSignature,providerIsGoogle)||block.redacted===!0&&!isValidOpaqueSignature(block.thinkingSignature))return!1;break;case"toolCall":if(typeof block.id!="string"||typeof block.name!="string"||!isRecord15(block.arguments)||block.incomplete!==void 0&&block.incomplete!==!0||block.errorMessage!==void 0&&typeof block.errorMessage!="string"||block.thoughtSignature!==void 0&&!isValidProviderSignature(block.thoughtSignature,providerIsGoogle))return!1;break;default:return!1}}return!0}function hasSafeAssistantEnvelope(message){let provider=typeof message.provider=="string"?message.provider:"",providerIsGoogle=provider==="google"||provider==="google-vertex",stopReason=message.stopReason,stopDetails=message.stopDetails,safeStopDetails=stopDetails===void 0||isRecord15(stopDetails)&&(stopDetails.type==="sensitive"||stopDetails.type==="refusal"&&(stopDetails.explanation===void 0||typeof stopDetails.explanation=="string"));return typeof message.api=="string"&&typeof message.provider=="string"&&typeof message.model=="string"&&isUsage2(message.usage)&&(stopReason==="pending"||stopReason==="stop"||stopReason==="length"||stopReason==="toolUse"||stopReason==="error"||stopReason==="aborted")&&safeStopDetails&&isFiniteNumber3(message.timestamp)&&(message.responseModel===void 0||typeof message.responseModel=="string")&&(message.responseId===void 0||typeof message.responseId=="string")&&(message.diagnostics===void 0||Array.isArray(message.diagnostics))&&(message.errorMessage===void 0||typeof message.errorMessage=="string")&&(message.rawStopReason===void 0||typeof message.rawStopReason=="string")&&hasSafeAssistantContent(message.content,providerIsGoogle)}function hasSafeToolResultEnvelope(message){return typeof message.toolCallId=="string"&&message.toolCallId.length>0&&typeof message.toolName=="string"&&message.toolName.length>0&&hasSafeToolResultContent(message.content)&&typeof message.isError=="boolean"&&isFiniteNumber3(message.timestamp)&&(message.usage===void 0||isUsage2(message.usage))&&(message.addedToolNames===void 0||Array.isArray(message.addedToolNames)&&message.addedToolNames.every(name=>typeof name=="string"))}function hasUnsafeRetainedContent(messages){for(let value2 of messages){if(!isRecord15(value2)||typeof value2.role!="string")return!0;switch(value2.role){case"user":if(!isFiniteNumber3(value2.timestamp)||!hasTextOnlyContent(value2.content,!0))return!0;break;case"assistant":if(!hasSafeAssistantEnvelope(value2))return!0;break;case"toolResult":if(!hasSafeToolResultEnvelope(value2))return!0;break;case"custom":if(typeof value2.customType!="string"||typeof value2.display!="boolean"||!isFiniteNumber3(value2.timestamp)||!hasTextOnlyContent(value2.content,!0))return!0;break;case"bashExecution":if(typeof value2.command!="string"||typeof value2.output!="string"||value2.exitCode!==void 0&&!isFiniteNumber3(value2.exitCode)||typeof value2.cancelled!="boolean"||typeof value2.truncated!="boolean"||value2.fullOutputPath!==void 0&&typeof value2.fullOutputPath!="string"||value2.excludeFromContext!==void 0&&typeof value2.excludeFromContext!="boolean"||!isFiniteNumber3(value2.timestamp))return!0;break;case"compactionSummary":if(typeof value2.summary!="string"||!isFiniteNumber3(value2.tokensBefore)||!isFiniteNumber3(value2.timestamp))return!0;break;default:return!0}}return!1}function formatRequiredCompactionFallbackRejection(diagnostics){let candidate=diagnostics.candidateRejections?.at(-1),reason=diagnostics.rejectionReason??"context-reconstruction-failed",recovery={"retained-token-budget-exceeded":"The retained turn exceeds the usable context. Select a model with a larger context and run /compact, or start a new session with an explicit checkpoint.","atomic-tool-chain-cut":"The retained tool calls and results do not form complete pairs. Finish the pending tool operation before /compact; if the transcript is damaged, start a new session with an explicit checkpoint.","unsafe-retained-content":"The retained message cannot be replayed safely. Inspect the identified entry; start a new session with an explicit checkpoint if it cannot be repaired.","missing-preparation-boundary":"The prepared boundary is absent from the branch. Reload the session and run /compact.","context-reconstruction-failed":"The retained context could not be reconstructed. Reload the session and run /compact."},diagnostic2={rejectionReason:reason,contextWindow:diagnostics.contextWindow,reserveTokens:diagnostics.reserveTokens,budgetTokens:diagnostics.budgetTokens,budgetExceeded:diagnostics.budgetExceeded??!1,candidatesChecked:diagnostics.candidatesChecked??0,...candidate?{candidate:{...candidate,firstKeptEntryId:capUtf8Bytes(candidate.firstKeptEntryId,128),...candidate.unsafeEntryId?{unsafeEntryId:capUtf8Bytes(candidate.unsafeEntryId,128)}:{},...candidate.unsafeMessageRole?{unsafeMessageRole:capUtf8Bytes(candidate.unsafeMessageRole,32)}:{}}}:{}};return`deterministic compaction fallback could not retain a safe suffix
1005
+ `).trim():remaining.trim();return summaryText?{...taskIntent===void 0?{}:{taskIntent},summaryText}:{...taskIntent===void 0?{}:{taskIntent},summaryText:""}}function resolveInheritedTaskIntent(branchEntries){for(let index=branchEntries.length-1;index>=0;index-=1){let rawEntry=branchEntries[index];if(!rawEntry||typeof rawEntry!="object"||Array.isArray(rawEntry))continue;let entry=rawEntry,details=entry.details;if(!details||typeof details!="object"||Array.isArray(details))continue;let typedDetails=details,schema=typeof typedDetails.schema=="string"?typedDetails.schema:entry.schema;if(schema===REMOTE_SCHEMA||schema!==SUMMARY_SCHEMA)continue;let taskIntent=typedDetails.taskIntent;if(typeof taskIntent!="string")continue;let trimmed=taskIntent.trim();if(trimmed)return capUtf8Bytes(trimmed,4096)}}function findWellFormedBlock(text2,openTag,closeTag){let start=text2.indexOf(openTag);if(start<0)return;let end=text2.indexOf(closeTag,start+openTag.length);if(!(end<0))return{start,end:end+closeTag.length,inner:text2.slice(start+openTag.length,end)}}function collectWellFormedBlocks(text2,openTag,closeTag){let blocks=[],searchFrom=0;for(;searchFrom<text2.length;){let start=text2.indexOf(openTag,searchFrom);if(start<0)break;let end=text2.indexOf(closeTag,start+openTag.length);if(end<0)break;blocks.push({start,end:end+closeTag.length,inner:text2.slice(start+openTag.length,end)}),searchFrom=end+closeTag.length}return blocks}function capUtf8Bytes(text2,maxBytes){let bytes=0,end=0;for(let char of text2){let size=Buffer.byteLength(char,"utf8");if(bytes+size>maxBytes)break;bytes+=size,end+=char.length}return text2.slice(0,end).trim()}function estimateMessageTokens(message){return estimateTokens2(message)}function approxTokens3(text2){return Math.max(0,estimateMessageTokens({role:"assistant",content:[{type:"text",text:text2}],api:"openai",provider:"openai",model:"",usage:{input:0,output:0,cacheRead:0,cacheWrite:0,reasoning:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:0}))}function sumEstimateTokens(messages){return messages.reduce((total,message)=>total+estimateMessageTokens(message),0)}function computeStructuralYield({previousSummary,messagesToSummarize,turnPrefixMessages,summary,tokensBefore}){let replacedTokens=approxTokens3(previousSummary??"")+sumEstimateTokens(messagesToSummarize)+sumEstimateTokens(turnPrefixMessages),savedTokens=Math.max(0,replacedTokens-approxTokens3(summary));return{savedTokens,savingsRatio:tokensBefore>0?savedTokens/tokensBefore:0,tokensBefore}}function isIneffectiveCompaction({tokensBefore,savedTokens,savingsRatio}){return tokensBefore<=0||savedTokens<1024||savingsRatio<.1}var DEFAULT_CONTEXT_WINDOW=2e5,SUMMARY_SCHEMA2="senpi.compaction.summary.v1";function approxTokens4(text2){return Math.ceil(text2.length/4)}var SummaryRequestError=class extends Error{constructor(message,transient,failureKind,refused=!1){super(message),this.name="SummaryRequestError",this.transient=transient,this.failureKind=failureKind,this.refused=refused}},UPSTREAM_STREAM_TRUNCATED_PATTERN=/(?:^|[^A-Za-z0-9_])upstream_stream_truncated(?:[^A-Za-z0-9_]|$)/;function isRetryableSummaryAttempt(error2){return error2 instanceof StreamDurationBudgetError||error2 instanceof StreamIdleTimeoutError2||error2 instanceof SummarizationTotalBudgetError||error2 instanceof SummarizationOverflowExhaustedError||error2 instanceof SummaryGenerationError||error2 instanceof CredentialFailoverError||error2 instanceof Error&&error2.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)?!1:error2 instanceof SummaryRequestError?error2.failureKind===void 0&&error2.transient:error2 instanceof Error?isRetryableErrorMessage(error2.message):!1}function isRefusalStop(response){return response.stopDetails?.type==="refusal"||response.stopDetails?.type==="sensitive"}function summaryRequestFailureKind(response){if(!isRefusalStop(response))return UPSTREAM_STREAM_TRUNCATED_PATTERN.test(response.errorMessage??"")?"upstream-stream-truncated":void 0}var SummaryGenerationError=class extends Error{constructor(kind,message){super(message),this.name="SummaryGenerationError",this.kind=kind}};function getPromptVariant(options){return options.reason==="branch"?"branch":options.preparation.previousSummary?"update":options.preparation.isSplitTurn?"turn_prefix":"default"}function createSpeculativeCompactionSnapshot(context,options){let model=context.model;if(!model)return;let expectedRevision=context.getMessageRevision(),branchEntries=context.sessionManager.getBranch(),contextWindow=context.getContextUsage()?.contextWindow??model.contextWindow??DEFAULT_CONTEXT_WINDOW,settings=context.getCompactionSettings?.()??DEFAULT_COMPACTION_SETTINGS2,thresholdRatio=computeEffectiveThreshold(contextWindow),preparation=prepareCompaction2(branchEntries,{...settings,keepRecentTokens:computeEffectiveKeepRecentTokens(settings.keepRecentTokens,contextWindow,thresholdRatio)});if(preparation)return{...options,expectedRevision,model,contextWindow,preparation,branchEntries,promptVariant:getPromptVariant({reason:"extension",preparation}),systemPrompt:context.getSystemPrompt?.()}}async function runExtensionCompaction(context,snapshot,signal,onProgress){if(signal?.aborted)return;let auth=await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);if(signal?.aborted)return;if(!auth?.ok||!(auth.apiKey||hasCredentialHeaders(auth.headers)||auth.ambient)){let detail=auth&&!auth.ok?auth.error:`no credentials resolved for provider "${snapshot.model.provider}"`;throw new SummaryGenerationError("auth",`summarization credentials unavailable: ${detail}`)}let requestSnapshot=auth.baseUrl?{...snapshot,model:{...snapshot.model,baseUrl:auth.baseUrl}}:snapshot,prompt=buildPrompt({variant:requestSnapshot.promptVariant,previousSummary:requestSnapshot.preparation.previousSummary,taskIntent:resolveInheritedTaskIntent(requestSnapshot.branchEntries??[]),customInstructions:requestSnapshot.customInstructions}),promptTokens=approxTokens4(prompt.user),messages=boundSummarizationInput(pruneToolResults([...requestSnapshot.preparation.messagesToSummarize,...requestSnapshot.preparation.turnPrefixMessages],requestSnapshot.contextWindow,SUMMARIZATION_INPUT_BUDGET_RATIO),requestSnapshot.contextWindow,promptTokens),deadline=createSummarizationDeadline(summarizationTotalBudgetMs(requestSnapshot.preparation.settings.summarizationMaxDurationMs)),overflowRetryStartMs=Date.now(),overflowAttempts=0,summarizationToolsOffered=(requestSnapshot.tools?.length??0)>0,reasoningOverrideOffered=hasSummarizationReasoningOverride(requestSnapshot.model),toolUseRetrySpent=!1,reasoningOverrideRetrySpent=!1;for(;;){if(signal?.aborted)return;let response,currentMessages=messages,retryStartedMs=Date.now(),retryEligible=snapshot.origin==="core-route"||snapshot.origin==="blocking",attemptBudgetMs=summarizationMaxDurationMs(messages.reduce((total,message)=>total+estimateTokens2(message),0),snapshot.preparation.settings.summarizationMaxDurationMs);try{response=await retryTransientCall(async()=>{let attempt2=await generateSummaryMessage({context,forbidToolCalls:toolUseRetrySpent,maxDurationMs:deadline.attemptBudgetMs(attemptBudgetMs),messages:currentMessages,onProgress,prompt,signal,snapshot:requestSnapshot,auth:{apiKey:auth.apiKey,headers:auth.headers,extraBody:auth.extraBody},...reasoningOverrideRetrySpent?{omitReasoningOptions:!0}:{}});if(attempt2&&isAssistantMessage2(attempt2)&&attempt2.stopReason==="error"&&!isContextOverflow(attempt2,snapshot.contextWindow)){let failureKind=summaryRequestFailureKind(attempt2);throw new SummaryRequestError(attempt2.errorMessage||"Compaction summary request failed",failureKind!==void 0||isRetryableAssistantError(attempt2),failureKind,isRefusalStop(attempt2))}return attempt2},error2=>retryEligible&&deadline.remainingMs()>0&&allowSummarizationRetry(Date.now()-retryStartedMs,attemptBudgetMs)&&isRetryableSummaryAttempt(error2),DEFAULT_SUMMARIZATION_RETRY_POLICY,signal)}catch(error2){if(signal?.aborted)return;throw error2}if(!response)return;if(isAssistantMessage2(response)&&isContextOverflow(response,snapshot.contextWindow)){overflowAttempts++;let elapsedMs=Date.now()-overflowRetryStartMs,retryMessages=allowOverflowRetry(overflowAttempts,elapsedMs)?shrinkSummarizationInputForOverflowRetry(messages,snapshot.contextWindow,promptTokens):void 0;if(!retryMessages)throw new SummarizationOverflowExhaustedError(overflowAttempts,elapsedMs);messages=retryMessages;continue}if(isAssistantMessage2(response)&&response.stopReason==="aborted")return;if(isAssistantMessage2(response)&&response.stopReason==="error"){let failureKind=summaryRequestFailureKind(response);throw new SummaryRequestError(response.errorMessage||"Compaction summary request failed",failureKind!==void 0||isRetryableAssistantError(response),failureKind,isRefusalStop(response))}let summary=getSummaryText(response);if(!summary){let stopReason=isAssistantMessage2(response)?response.stopReason:"unknown";if(stopReason==="toolUse"&&summarizationToolsOffered&&!toolUseRetrySpent){toolUseRetrySpent=!0;continue}if(stopReason==="stop"&&reasoningOverrideOffered&&!reasoningOverrideRetrySpent){reasoningOverrideRetrySpent=!0;continue}throw new SummaryGenerationError("empty-summary",`summarization response contained no text (stopReason: ${stopReason})`)}let tokenEstimate=estimateContextTokens3(convertToLlm(messages)).tokens+approxTokens4(summary),parsedSummary=extractTaskIntent(summary),taskIntent=parsedSummary.taskIntent??resolveInheritedTaskIntent(snapshot.branchEntries??[]);return{summary:parsedSummary.summaryText,firstKeptEntryId:snapshot.preparation.firstKeptEntryId,tokensBefore:snapshot.preparation.tokensBefore,details:{schema:SUMMARY_SCHEMA2,promptVariant:snapshot.promptVariant,tokenEstimate,structuralYield:computeStructuralYield({previousSummary:snapshot.preparation.previousSummary??"",messagesToSummarize:snapshot.preparation.messagesToSummarize,turnPrefixMessages:snapshot.preparation.turnPrefixMessages,summary:parsedSummary.summaryText,tokensBefore:snapshot.preparation.tokensBefore}),...snapshot.origin?{origin:snapshot.origin}:{},...taskIntent?{taskIntent}:{}}}}}async function applyGeneratedCompaction(context,snapshot,getCurrentGeneration,compaction,signal){let provider=context.model?.provider;if((provider==="cursor"||provider==="cursor-cli-oauth")&&context.isIdle&&!context.isIdle())return{applied:!1,reason:"rejected"};if(!snapshot||!compaction)return{applied:!1,reason:"unavailable"};if(snapshot.generation!==getCurrentGeneration())return{applied:!1,reason:"stale"};let revisionUnchanged=snapshot.expectedRevision===context.getMessageRevision(),warmAnchor=createWarmAnchorSnapshot(snapshot.preparation.firstKeptEntryId,snapshot.branchEntries??[]);return!revisionUnchanged&&(!warmAnchor||!isWarmSummaryAnchorValid(warmAnchor,context.sessionManager.getBranch()))?{applied:!1,reason:"stale"}:await context.applyCompaction(compaction,{reason:"extension",...revisionUnchanged||!warmAnchor?{expectedRevision:snapshot.expectedRevision}:{expectedWarmAnchor:warmAnchor},signal})}function buildCompactionContext(input){if(input.laneOwnsCompaction)return repairOrphanedToolResults(convertToLlm(input.event.messages));let admittedMessages=admitContextToolResults(input.event.messages,input.contextWindow,input.toolAdmissionEnabled),sourceMessages=!input.laneOwnsCompaction&&input.appendOnlyTranscript!==!0&&(input.breakerFallback||shouldApplyContextReduction({usageTokens:input.ctx.getContextUsage()?.tokens??null,contextWindow:input.contextWindow,isProviderNativeCompactionPath:isOpenAiRemoteCompactionModel(input.ctx.model)||input.laneOwnsCompaction}))?reduceContextMessages(admittedMessages,BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages:admittedMessages,emergency=input.laneOwnsCompaction?{messages:sourceMessages,needsAggressiveCompaction:!1}:hardLimitEmergencyPrune(sourceMessages,input.promptContextWindow,input.emergencyPruneLatch);!input.laneOwnsCompaction&&(emergency.needsAggressiveCompaction||emergency.messages!==sourceMessages)&&input.logEmergencyPrune?.({route:"context-event",tokensBefore:estimateTotalTokens(sourceMessages),tokens:estimateTotalTokens(emergency.messages)});let marked=markOpenAiRemoteReplayBoundary(emergency.messages,{model:input.ctx.model,branchEntries:input.ctx.sessionManager.getBranch()}),reminded=injectTokenBudgetReminder(marked,input.reminder);return repairOrphanedToolResults(convertToLlm(reminded))}var RECOVERY_INSTRUCTIONS="RECOVERY: prior compaction caused degraded responses; rebuild context",RECOVERY_NOTIFICATION="Detected repeated no-text assistant responses; retried compaction recovery.";function createDegradationMonitorState(){return{postCompactionTurnsRemaining:0,noTextCounter:0,recoveryTriggeredThisCycle:!1,recoveryAttempts:0}}function resetOnSessionCompact(state){state.postCompactionTurnsRemaining=5,state.noTextCounter=0,state.recoveryTriggeredThisCycle=!1}function assistantMessageHasText(event){if(event.message.role!=="assistant")return!0;for(let part of event.message.content)if(part.type==="text"&&typeof part.text=="string"&&part.text.length>0)return!0;return!1}async function handleMessageEnd(state,event,context){if(state.postCompactionTurnsRemaining<=0)return;if(assistantMessageHasText(event)){state.noTextCounter=0;return}if(state.noTextCounter+=1,state.noTextCounter<3||state.recoveryTriggeredThisCycle||state.recoveryAttempts>=3)return;state.recoveryTriggeredThisCycle=!0,state.recoveryAttempts+=1,state.noTextCounter=0;let result3=await context.applyCompaction({customInstructions:RECOVERY_INSTRUCTIONS});(result3.applied||result3.reason!=="failed")&&context.notify(RECOVERY_NOTIFICATION)}function handleTurnEnd(state){state.postCompactionTurnsRemaining>0&&(state.postCompactionTurnsRemaining-=1)}function markFailedTurnFragments(messages){let retained=new Set(dropFailedAssistantTurns(messages));return messages.map(message=>!retained.has(message))}function isRecord15(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isFiniteNumber3(value2){return typeof value2=="number"&&Number.isFinite(value2)}function hasTextOnlyContent(content,allowString){return typeof content=="string"?allowString:Array.isArray(content)?content.every(block=>isRecord15(block)&&block.type==="text"&&typeof block.text=="string"):!1}function isWellFormedImageBlock(block){return block.type==="image"&&typeof block.mimeType=="string"&&block.mimeType.startsWith("image/")&&typeof block.data=="string"&&block.data.length>0}function hasSafeToolResultContent(content){return Array.isArray(content)?content.every(block=>isRecord15(block)&&(block.type==="text"&&typeof block.text=="string"||isWellFormedImageBlock(block))):!1}function isUsage2(value2){if(!isRecord15(value2)||!isRecord15(value2.cost))return!1;for(let field2 of["input","output","cacheRead","cacheWrite","totalTokens"])if(!isFiniteNumber3(value2[field2]))return!1;for(let field2 of["input","output","cacheRead","cacheWrite","total"])if(!isFiniteNumber3(value2.cost[field2]))return!1;return(value2.cacheWrite1h===void 0||isFiniteNumber3(value2.cacheWrite1h))&&(value2.reasoning===void 0||isFiniteNumber3(value2.reasoning))}var base64SignaturePattern=/^[A-Za-z0-9+/]+={0,2}$/;function isValidOpaqueSignature(sig){return typeof sig=="string"&&sig.length>0&&sig.length<=65536}function isValidProviderSignature(sig,providerIsGoogle){return isValidOpaqueSignature(sig)?!providerIsGoogle||sig.length%4===0&&base64SignaturePattern.test(sig):!1}function hasSafeAssistantContent(content,providerIsGoogle){if(!Array.isArray(content))return!1;for(let block of content){if(!isRecord15(block)||typeof block.type!="string")return!1;switch(block.type){case"text":if(typeof block.text!="string"||block.textSignature!==void 0&&!isValidProviderSignature(block.textSignature,providerIsGoogle))return!1;break;case"thinking":if(typeof block.thinking!="string"||block.startedAt!==void 0&&!isFiniteNumber3(block.startedAt)||block.endedAt!==void 0&&!isFiniteNumber3(block.endedAt)||block.redacted!==void 0&&typeof block.redacted!="boolean"||block.thinkingSignature!==void 0&&!isValidProviderSignature(block.thinkingSignature,providerIsGoogle)||block.redacted===!0&&!isValidOpaqueSignature(block.thinkingSignature))return!1;break;case"toolCall":if(typeof block.id!="string"||typeof block.name!="string"||!isRecord15(block.arguments)||block.incomplete!==void 0&&block.incomplete!==!0||block.errorMessage!==void 0&&typeof block.errorMessage!="string"||block.thoughtSignature!==void 0&&!isValidProviderSignature(block.thoughtSignature,providerIsGoogle))return!1;break;default:return!1}}return!0}function hasSafeAssistantEnvelope(message){let provider=typeof message.provider=="string"?message.provider:"",providerIsGoogle=provider==="google"||provider==="google-vertex",stopReason=message.stopReason,stopDetails=message.stopDetails,safeStopDetails=stopDetails===void 0||isRecord15(stopDetails)&&(stopDetails.type==="sensitive"||stopDetails.type==="refusal"&&(stopDetails.explanation===void 0||typeof stopDetails.explanation=="string"));return typeof message.api=="string"&&typeof message.provider=="string"&&typeof message.model=="string"&&isUsage2(message.usage)&&(stopReason==="pending"||stopReason==="stop"||stopReason==="length"||stopReason==="toolUse"||stopReason==="error"||stopReason==="aborted")&&safeStopDetails&&isFiniteNumber3(message.timestamp)&&(message.responseModel===void 0||typeof message.responseModel=="string")&&(message.responseId===void 0||typeof message.responseId=="string")&&(message.diagnostics===void 0||Array.isArray(message.diagnostics))&&(message.errorMessage===void 0||typeof message.errorMessage=="string")&&(message.rawStopReason===void 0||typeof message.rawStopReason=="string")&&hasSafeAssistantContent(message.content,providerIsGoogle)}function hasSafeToolResultEnvelope(message){return typeof message.toolCallId=="string"&&message.toolCallId.length>0&&typeof message.toolName=="string"&&message.toolName.length>0&&hasSafeToolResultContent(message.content)&&typeof message.isError=="boolean"&&isFiniteNumber3(message.timestamp)&&(message.usage===void 0||isUsage2(message.usage))&&(message.addedToolNames===void 0||Array.isArray(message.addedToolNames)&&message.addedToolNames.every(name=>typeof name=="string"))}function hasUnsafeRetainedContent(messages){for(let value2 of messages){if(!isRecord15(value2)||typeof value2.role!="string")return!0;switch(value2.role){case"user":if(!isFiniteNumber3(value2.timestamp)||!hasTextOnlyContent(value2.content,!0))return!0;break;case"assistant":if(!hasSafeAssistantEnvelope(value2))return!0;break;case"toolResult":if(!hasSafeToolResultEnvelope(value2))return!0;break;case"custom":if(typeof value2.customType!="string"||typeof value2.display!="boolean"||!isFiniteNumber3(value2.timestamp)||!hasTextOnlyContent(value2.content,!0))return!0;break;case"bashExecution":if(typeof value2.command!="string"||typeof value2.output!="string"||value2.exitCode!==void 0&&!isFiniteNumber3(value2.exitCode)||typeof value2.cancelled!="boolean"||typeof value2.truncated!="boolean"||value2.fullOutputPath!==void 0&&typeof value2.fullOutputPath!="string"||value2.excludeFromContext!==void 0&&typeof value2.excludeFromContext!="boolean"||!isFiniteNumber3(value2.timestamp))return!0;break;case"compactionSummary":if(typeof value2.summary!="string"||!isFiniteNumber3(value2.tokensBefore)||!isFiniteNumber3(value2.timestamp))return!0;break;default:return!0}}return!1}function formatRequiredCompactionFallbackRejection(diagnostics){let candidate=diagnostics.candidateRejections?.at(-1),reason=diagnostics.rejectionReason??"context-reconstruction-failed",recovery={"retained-token-budget-exceeded":"The retained turn exceeds the usable context. Select a model with a larger context and run /compact, or start a new session with an explicit checkpoint.","atomic-tool-chain-cut":"The retained tool calls and results do not form complete pairs. Finish the pending tool operation before /compact; if the transcript is damaged, start a new session with an explicit checkpoint.","unsafe-retained-content":"The retained message cannot be replayed safely. Inspect the identified entry; start a new session with an explicit checkpoint if it cannot be repaired.","missing-preparation-boundary":"The prepared boundary is absent from the branch. Reload the session and run /compact.","context-reconstruction-failed":"The retained context could not be reconstructed. Reload the session and run /compact."},diagnostic2={rejectionReason:reason,contextWindow:diagnostics.contextWindow,reserveTokens:diagnostics.reserveTokens,budgetTokens:diagnostics.budgetTokens,budgetExceeded:diagnostics.budgetExceeded??!1,candidatesChecked:diagnostics.candidatesChecked??0,...candidate?{candidate:{...candidate,firstKeptEntryId:capUtf8Bytes(candidate.firstKeptEntryId,128),...candidate.unsafeEntryId?{unsafeEntryId:capUtf8Bytes(candidate.unsafeEntryId,128)}:{},...candidate.unsafeMessageRole?{unsafeMessageRole:capUtf8Bytes(candidate.unsafeMessageRole,32)}:{}}}:{}};return`deterministic compaction fallback could not retain a safe suffix
1006
1006
  ${JSON.stringify(diagnostic2)}
1007
1007
  ${recovery[reason]} The original transcript has not been changed.`}var NON_VISIBLE_USER_TEXT=/[\p{White_Space}\p{Default_Ignorable_Code_Point}]/gu;function isRecord16(value2){return typeof value2=="object"&&value2!==null}function hasMeaningfulUserText(entry){if(entry.type!=="message"||typeof entry.message!="object"||entry.message===null||entry.message.role!=="user")return!1;let content=entry.message.content,hasVisibleText2=text2=>typeof text2=="string"&&text2.normalize("NFKC").replace(NON_VISIBLE_USER_TEXT,"").length>0;return typeof content=="string"?hasVisibleText2(content):Array.isArray(content)?content.some(block=>isRecord16(block)&&block.type==="text"&&hasVisibleText2(block.text)):!1}function isSafeBoundedValue(value2,seen=new Set,depth=0){if(depth>32)return!1;if(value2==null)return!0;let kind=typeof value2;if(kind==="string"||kind==="number"||kind==="boolean")return!0;if(kind!=="object"||seen.has(value2))return!1;if(seen.add(value2),Array.isArray(value2)){for(let item of value2)if(!isSafeBoundedValue(item,seen,depth+1))return!1;return!0}let proto=Object.getPrototypeOf(value2);if(proto!==Object.prototype&&proto!==null)return!1;for(let descriptor of Object.values(Object.getOwnPropertyDescriptors(value2)))if(descriptor.get!==void 0||descriptor.set!==void 0||typeof descriptor.value=="function"||typeof descriptor.value=="symbol"||!isSafeBoundedValue(descriptor.value,seen,depth+1))return!1;return!0}function isTerminalSummarizationProviderFailure(error2){return error2 instanceof CredentialFailoverError||error2 instanceof Error&&error2.message.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)?!0:error2 instanceof SummaryRequestError&&!error2.transient&&!error2.refused&&error2.failureKind===void 0}function classifyRequiredCompactionFallbackFailure(error2){if(error2 instanceof StreamDurationBudgetError||error2 instanceof StreamIdleTimeoutError2||error2 instanceof SummarizationTotalBudgetError)return"summarization-timeout";if(error2 instanceof SummaryRequestError&&error2.transient&&error2.failureKind==="upstream-stream-truncated")return"upstream-stream-truncated";if(error2 instanceof SummarizationOverflowExhaustedError)return"summarization-overflow-exhausted";if(error2 instanceof SummaryGenerationError&&error2.kind==="empty-summary")return"summarization-empty-summary";if(isTerminalSummarizationProviderFailure(error2))return"summarization-provider-failure"}var FALLBACK_FAILURE_CAUSE={"summarization-timeout":"the summary stream ran out of its time budget","summarization-provider-failure":"the provider ended the summary stream with an error","upstream-stream-truncated":"the provider truncated the summary stream","summarization-overflow-exhausted":"the summary input stayed over the provider's context limit","summarization-empty-summary":"the provider returned no summary text"};function formatRequiredCompactionFallbackNotice(failureKind,cause){let detail=cause instanceof Error?stripTurnRetrySuppressionPrefix(cause.message).trim():"";return[`Compaction could not complete a provider summary: ${FALLBACK_FAILURE_CAUSE[failureKind]}.`,"A deterministic checkpoint was applied and older transcript detail was dropped, so it is safe to continue.",detail?`Provider reported: ${capUtf8Bytes(detail,512)}.`:"","Run /compact on a different model for a richer summary."].filter(part=>part.length>0).join(" ")}function createRequiredCompactionFallback(preparation,contextWindow,failureKind,metadata,branchEntries=[],diagnostics){let reserveTokens=resolveEffectiveReserveTokens(contextWindow,preparation.settings),budget=contextWindow-reserveTokens,preparedBoundaryIndex=branchEntries.findIndex(entry=>entry.id===preparation.firstKeptEntryId);if(!preparation.firstKeptEntryId||preparedBoundaryIndex===-1){diagnostics&&Object.assign(diagnostics,{rejectionReason:"missing-preparation-boundary",contextWindow,reserveTokens,budgetTokens:budget});return}let marker=["[Deterministic compaction recovery checkpoint]","Generated summarization did not complete, so older context was reduced without another provider request.","Continue from the retained messages after this checkpoint. Treat omitted transcript details as unknown."].join(`
1008
1008
  `),taskIntent=metadata.taskIntent?.trim(),fixedText=taskIntent?`${marker}
@@ -1015,7 +1015,7 @@ Previous checkpoint:
1015
1015
  [Older checkpoint truncated]`,boundedPrevious=Buffer.byteLength(previousSummary)<=availableBytes?previousSummary:`${capUtf8Bytes(previousSummary,Math.max(0,availableBytes-Buffer.byteLength(truncationMarker2)))}${truncationMarker2}`;summary=`${fixedText}
1016
1016
 
1017
1017
  Previous checkpoint:
1018
- ${boundedPrevious}`}let baseDetails={schema:"senpi.compaction.deterministic-fallback.v1",origin:"required-compaction-recovery",failureKind,...taskIntent?{taskIntent}:{}},candidateCount=0,sawUnsafeRetainedContent=!1,syntheticCompaction={type:"compaction",id:"__senpi_deterministic_fallback_preview__",parentId:branchEntries.at(-1)?.id??null,timestamp:new Date(0).toISOString(),summary,firstKeptEntryId:branchEntries[0]?.id??preparation.firstKeptEntryId,tokensBefore:preparation.tokensBefore,details:{...baseDetails,retainedSuffix:"prepared"},fromHook:!0},projectedMessages;try{projectedMessages=buildSessionContext([...branchEntries,syntheticCompaction]).messages}catch{diagnostics&&Object.assign(diagnostics,{rejectionReason:"context-reconstruction-failed",contextWindow,reserveTokens,budgetTokens:budget});return}let droppedByFailedTurnNormalization=markFailedTurnFragments(projectedMessages),messageIndexesByEntryId=new Map;for(let[index,message]of projectedMessages.entries()){let entryId=getSessionContextEntryId(message);entryId!==void 0&&messageIndexesByEntryId.set(entryId,index)}let summaryIndex=messageIndexesByEntryId.get(syntheticCompaction.id),unsafeSuffix=new Array(projectedMessages.length+1).fill(!1),unsafeIndexSuffix=new Int32Array(projectedMessages.length+1).fill(-1),tokenSuffix=new Array(projectedMessages.length+1).fill(0),toolCalls=new Map,toolResults=new Map;for(let index=projectedMessages.length-1;index>=0;index--){let message=projectedMessages[index];if(tokenSuffix[index]=tokenSuffix[index+1],unsafeIndexSuffix[index]=unsafeIndexSuffix[index+1],droppedByFailedTurnNormalization[index]){unsafeSuffix[index]=unsafeSuffix[index+1];continue}let messageUnsafe=!1,serialized;try{messageUnsafe=hasUnsafeRetainedContent([message]);let bounded=isSafeBoundedValue(message);messageUnsafe||=!bounded;let imageTokens=0;if(!messageUnsafe&&message.role==="toolResult"){let content=message.content.map(block=>block.type!=="image"?block:(imageTokens+=estimateTokens2({...message,content:[block]}),{...block,data:""}));serialized=JSON.stringify({...message,content})}else serialized=bounded?JSON.stringify(message):void 0;tokenSuffix[index]+=serialized===void 0?Number.POSITIVE_INFINITY:Math.max(estimateTokens2(message),estimateTokens2({role:"user",content:serialized,timestamp:0})+imageTokens)}catch{messageUnsafe=!0,tokenSuffix[index]=Number.POSITIVE_INFINITY}if(unsafeSuffix[index]=unsafeSuffix[index+1]||messageUnsafe,messageUnsafe&&(unsafeIndexSuffix[index]=index),!(typeof message!="object"||message===null)){if(message.role==="toolResult"&&typeof message.toolCallId=="string"){let indexes=toolResults.get(message.toolCallId)??[];indexes.push(index),toolResults.set(message.toolCallId,indexes)}else if(message.role==="assistant"&&Array.isArray(message.content))for(let block of message.content){if(!isRecord16(block)||block.type!=="toolCall"||typeof block.id!="string")continue;let call=toolCalls.get(block.id)??{indexes:[],newestIncomplete:block.incomplete===!0};call.indexes.push(index),toolCalls.set(block.id,call)}}}let invalidToolChainDiff=new Int32Array(projectedMessages.length+2),markInvalidRange=(start,endExclusive)=>{let boundedStart=Math.max(0,start),boundedEnd=Math.min(projectedMessages.length+1,endExclusive);boundedStart>=boundedEnd||(invalidToolChainDiff[boundedStart]++,invalidToolChainDiff[boundedEnd]--)};for(let[id,call]of toolCalls){let results=toolResults.get(id)??[];if(results.length===0){markInvalidRange(0,Math.max(call.indexes[0]??-1,results[0]??-1)+1);continue}let callIndex=call.indexes[0],resultIndex=results[0];markInvalidRange(0,Math.max(call.indexes[1]??-1,results[1]??-1)+1),call.newestIncomplete||callIndex>=resultIndex?markInvalidRange(0,Math.max(callIndex,resultIndex)+1):markInvalidRange(callIndex+1,resultIndex+1)}for(let[id,results]of toolResults)toolCalls.has(id)||markInvalidRange(0,results[0]+1);let toolChainValidAt=new Array(projectedMessages.length+1).fill(!0),invalidToolChainCount=0;for(let index=0;index<toolChainValidAt.length;index++)invalidToolChainCount+=invalidToolChainDiff[index],toolChainValidAt[index]=invalidToolChainCount===0;let projectCandidate=(firstKeptEntryId,retainedSuffix)=>{candidateCount++;let details={...baseDetails,retainedSuffix},reject=(rejectionReason,detail={})=>{diagnostics&&(diagnostics.rejectionReason=rejectionReason,diagnostics.contextWindow=contextWindow,diagnostics.reserveTokens=reserveTokens,diagnostics.budgetTokens=budget,diagnostics.candidateRejections??=[],diagnostics.candidateRejections.push({firstKeptEntryId,rejectionReason,...detail}))},result3={summary,firstKeptEntryId,tokensBefore:preparation.tokensBefore,details},startIndex=messageIndexesByEntryId.get(firstKeptEntryId);if(startIndex===void 0)return reject("context-reconstruction-failed");let retainedStart=Math.min(startIndex,projectedMessages.length);if(unsafeSuffix[retainedStart]){sawUnsafeRetainedContent=!0;let unsafeMessageIndex=unsafeIndexSuffix[retainedStart],unsafeMessage=projectedMessages[unsafeMessageIndex];return reject("unsafe-retained-content",{unsafeMessageIndex,unsafeEntryId:getSessionContextEntryId(unsafeMessage),unsafeMessageRole:unsafeMessage.role})}if(!toolChainValidAt[retainedStart])return reject("atomic-tool-chain-cut");let summaryTokens=summaryIndex===void 0?Number.POSITIVE_INFINITY:Math.max(estimateTokens2(projectedMessages[summaryIndex]),estimateTokens2({role:"user",content:JSON.stringify(projectedMessages[summaryIndex]),timestamp:0})),retainedTokens=(tokenSuffix[retainedStart]??Number.POSITIVE_INFINITY)+summaryTokens;return retainedTokens>budget?(diagnostics&&(diagnostics.budgetExceeded=!0),reject("retained-token-budget-exceeded",{estimatedTokens:retainedTokens})):{...result3,estimatedTokensAfter:retainedTokens}},prepared=projectCandidate(preparation.firstKeptEntryId,"prepared");if(prepared)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),prepared;for(let index=preparedBoundaryIndex-1;index>=0;index--){let entry=branchEntries[index];if(entry.type==="compaction")break;let earlier=projectCandidate(entry.id,"earlier-safe-boundary");if(earlier)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),earlier}for(let index=branchEntries.length-1;index>preparedBoundaryIndex;index--){let entry=branchEntries[index];if(!hasMeaningfulUserText(entry))continue;let latestUser=projectCandidate(entry.id,"latest-user-turn");if(latestUser)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),latestUser;for(let earlierIndex=index-1;earlierIndex>preparedBoundaryIndex;earlierIndex--){let earlierEntry=branchEntries[earlierIndex];if(earlierEntry.type==="compaction")break;let earlier=projectCandidate(earlierEntry.id,"earlier-safe-boundary");if(earlier)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),earlier}break}if(sawUnsafeRetainedContent)for(let index=preparedBoundaryIndex+1;index<branchEntries.length;index++){let entry=branchEntries[index];if(entry.type==="compaction")continue;let laterSafe=projectCandidate(entry.id,"later-safe-boundary");if(laterSafe)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),laterSafe}diagnostics&&(diagnostics.candidatesChecked=candidateCount)}function shouldRetryIdleWarmup(decision){return!decision.transient||!decision.isIdle||decision.breakerTripped||!decision.stillWarmEligible?!1:decision.attempt<2}var ANTHROPIC_SUBSCRIPTION_COMPACT_ENTRY_TYPE="claude-sdk-oauth-compact",ANTHROPIC_SUBSCRIPTION_COMPACT_BOUNDARY_DIAGNOSTIC="claude_sdk_oauth_compact_boundary",SDK_NATIVE_LANE_REJECTION_REASON="the Claude Agent SDK owns compaction for this session",COMPACT_BOUNDARY_SCHEMA="senpi.claude-sdk-oauth.compact-boundary.v1";function lastTurnIsColdSeedOverflow(context){let branch=context.sessionManager?.getBranch()??[];for(let index=branch.length-1;index>=0;index-=1){let entry=branch[index];if(entry?.type==="compaction")return!1;if(entry?.type==="message"&&entry.message.role==="assistant")return isColdSeedOverflowMessage(entry.message)}return!1}function isRecord17(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isSdkNativeCompactionLane(input){return input.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:input.resumeMode!=="off"}function createCompactionLanePolicy(options={}){let load=options.loadProviderSettings??loadAnthropicSubscriptionProviderSettingsFromDisk,cachedCwd,cachedResumeMode,disablesSenpiCompaction=context=>{if(context.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID||context.getCompactionSettings?.().model)return!1;if(cachedCwd!==context.cwd){try{cachedResumeMode=load(context.cwd).resumeMode}catch{return cachedCwd=void 0,!1}cachedCwd=context.cwd}return isSdkNativeCompactionLane({model:context.model,resumeMode:cachedResumeMode})};return{disablesSenpiCompaction,ownsCompaction(context,reason){return reason==="manual"||!disablesSenpiCompaction(context)?!0:reason==="overflow"&&lastTurnIsColdSeedOverflow(context)}}}function parseCompactBoundaryMessage(value2){if(isRecord17(value2)&&!(value2.type!=="system"||value2.subtype!=="compact_boundary")&&!(typeof value2.session_id!="string"||typeof value2.uuid!="string")&&isRecord17(value2.compact_metadata))return{schema:COMPACT_BOUNDARY_SCHEMA,sdkSessionId:value2.session_id,uuid:value2.uuid,compactMetadata:{...value2.compact_metadata}}}function messageDiagnostics(message){if(message.role!=="assistant")return[];let diagnostics=message.diagnostics;return Array.isArray(diagnostics)?diagnostics:[]}function collectCompactBoundaryEntries(message){let entries=[];for(let diagnostic2 of messageDiagnostics(message)){if(diagnostic2.type!==ANTHROPIC_SUBSCRIPTION_COMPACT_BOUNDARY_DIAGNOSTIC)continue;let entry=parseCompactBoundaryMessage(diagnostic2.details);entry&&entries.push(entry)}return entries}import{appendFileSync}from"node:fs";import{appendFile,mkdir as mkdir2,rename as rename3,stat as stat2}from"node:fs/promises";import{dirname as dirname14,join as join19}from"node:path";var DEFAULT_MAX_BYTES5=5*1024*1024,ALLOWED_KEYS=new Set(["origin","reason","route","variant","generation","requestId","tokens","tokensBefore","savedTokens","savingsRatio","contextWindow","threshold","remainingSec","count","durationMs"]),DEBUG_PREFIX2="[senpi-compaction]",EVENTS=new Set(["speculative_started","speculative_applied","speculative_stale","speculative_invalidated","idle_trigger","idle_applied","blocking_started","warm_consumed","core_route_generated","skip_cap","skip_breaker","skip_cursor_mid_turn","threshold_trigger","hard_limit_trigger","grace_deferred","breaker_deterministic_fallback","emergency_prune","ineffective_counted","summary_failed","remote_aborted","blocking_aborted"]);function createCompactionLogger(agentDir,options={}){if(typeof agentDir!="string"||agentDir.length===0)return{debug:()=>{},info:()=>{}};let filePath=join19(agentDir,"logs","compaction.log"),maxBytes=validMaxBytes2(options.maxBytes),reportedFailure=!1;function log(level,event,data){try{if(!EVENTS.has(event))return;let line=formatLine2(level,event,data);writeLine2(filePath,line,maxBytes,options.sink),(options.mirrorToStderr??envValue("COMPACTION_DEBUG")==="1")&&console.error(DEBUG_PREFIX2,line)}catch(error2){reportedFailure||(reportedFailure=!0,console.error("Unable to write compaction log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data)}}function validMaxBytes2(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES5}function formatLine2(level,event,data){let entry={ts:new Date().toISOString(),level,event};if(data)for(let[key,value2]of Object.entries(data)){if(!ALLOWED_KEYS.has(key))continue;let safeValue=safeValueOf(value2,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}return JSON.stringify(entry)}var pendingLines=new Map;function writeLine2(filePath,line,maxBytes,sink){let text2=`${line}
1018
+ ${boundedPrevious}`}let baseDetails={schema:"senpi.compaction.deterministic-fallback.v1",origin:"required-compaction-recovery",failureKind,...taskIntent?{taskIntent}:{}},candidateCount=0,sawUnsafeRetainedContent=!1,syntheticCompaction={type:"compaction",id:"__senpi_deterministic_fallback_preview__",parentId:branchEntries.at(-1)?.id??null,timestamp:new Date(0).toISOString(),summary,firstKeptEntryId:branchEntries[0]?.id??preparation.firstKeptEntryId,tokensBefore:preparation.tokensBefore,details:{...baseDetails,retainedSuffix:"prepared"},fromHook:!0},projectedMessages;try{projectedMessages=buildSessionContext([...branchEntries,syntheticCompaction]).messages}catch{diagnostics&&Object.assign(diagnostics,{rejectionReason:"context-reconstruction-failed",contextWindow,reserveTokens,budgetTokens:budget});return}let droppedByFailedTurnNormalization=markFailedTurnFragments(projectedMessages),messageIndexesByEntryId=new Map;for(let[index,message]of projectedMessages.entries()){let entryId=getSessionContextEntryId(message);entryId!==void 0&&messageIndexesByEntryId.set(entryId,index)}let summaryIndex=messageIndexesByEntryId.get(syntheticCompaction.id),unsafeSuffix=new Array(projectedMessages.length+1).fill(!1),unsafeIndexSuffix=new Int32Array(projectedMessages.length+1).fill(-1),tokenSuffix=new Array(projectedMessages.length+1).fill(0),toolCalls=new Map,toolResults=new Map;for(let index=projectedMessages.length-1;index>=0;index--){let message=projectedMessages[index];if(tokenSuffix[index]=tokenSuffix[index+1],unsafeIndexSuffix[index]=unsafeIndexSuffix[index+1],droppedByFailedTurnNormalization[index]){unsafeSuffix[index]=unsafeSuffix[index+1];continue}let messageUnsafe=!1,serialized;try{messageUnsafe=hasUnsafeRetainedContent([message]);let bounded=isSafeBoundedValue(message);messageUnsafe||=!bounded;let imageTokens=0;if(!messageUnsafe&&message.role==="toolResult"){let content=message.content.map(block=>block.type!=="image"?block:(imageTokens+=estimateTokens2({...message,content:[block]}),{...block,data:""}));serialized=JSON.stringify({...message,content})}else serialized=bounded?JSON.stringify(message):void 0;tokenSuffix[index]+=serialized===void 0?Number.POSITIVE_INFINITY:Math.max(estimateTokens2(message),estimateTokens2({role:"user",content:serialized,timestamp:0})+imageTokens)}catch{messageUnsafe=!0,tokenSuffix[index]=Number.POSITIVE_INFINITY}if(unsafeSuffix[index]=unsafeSuffix[index+1]||messageUnsafe,messageUnsafe&&(unsafeIndexSuffix[index]=index),!(typeof message!="object"||message===null)){if(message.role==="toolResult"&&typeof message.toolCallId=="string"){let indexes=toolResults.get(message.toolCallId)??[];indexes.push(index),toolResults.set(message.toolCallId,indexes)}else if(message.role==="assistant"&&Array.isArray(message.content))for(let block of message.content){if(!isRecord16(block)||block.type!=="toolCall"||typeof block.id!="string")continue;let call=toolCalls.get(block.id)??{indexes:[],newestIncomplete:block.incomplete===!0};call.indexes.push(index),toolCalls.set(block.id,call)}}}let invalidToolChainDiff=new Int32Array(projectedMessages.length+2),markInvalidRange=(start,endExclusive)=>{let boundedStart=Math.max(0,start),boundedEnd=Math.min(projectedMessages.length+1,endExclusive);boundedStart>=boundedEnd||(invalidToolChainDiff[boundedStart]++,invalidToolChainDiff[boundedEnd]--)};for(let[id,call]of toolCalls){let results=toolResults.get(id)??[];if(results.length===0){markInvalidRange(0,Math.max(call.indexes[0]??-1,results[0]??-1)+1);continue}let callIndex=call.indexes[0],resultIndex=results[0];markInvalidRange(0,Math.max(call.indexes[1]??-1,results[1]??-1)+1),call.newestIncomplete||callIndex>=resultIndex?markInvalidRange(0,Math.max(callIndex,resultIndex)+1):markInvalidRange(callIndex+1,resultIndex+1)}for(let[id,results]of toolResults)toolCalls.has(id)||markInvalidRange(0,results[0]+1);let toolChainValidAt=new Array(projectedMessages.length+1).fill(!0),invalidToolChainCount=0;for(let index=0;index<toolChainValidAt.length;index++)invalidToolChainCount+=invalidToolChainDiff[index],toolChainValidAt[index]=invalidToolChainCount===0;let projectCandidate=(firstKeptEntryId,retainedSuffix)=>{candidateCount++;let details={...baseDetails,retainedSuffix},reject=(rejectionReason,detail={})=>{diagnostics&&(diagnostics.rejectionReason=rejectionReason,diagnostics.contextWindow=contextWindow,diagnostics.reserveTokens=reserveTokens,diagnostics.budgetTokens=budget,diagnostics.candidateRejections??=[],diagnostics.candidateRejections.push({firstKeptEntryId,rejectionReason,...detail}))},result3={summary,firstKeptEntryId,tokensBefore:preparation.tokensBefore,details},startIndex=messageIndexesByEntryId.get(firstKeptEntryId);if(startIndex===void 0)return reject("context-reconstruction-failed");let retainedStart=Math.min(startIndex,projectedMessages.length);if(unsafeSuffix[retainedStart]){sawUnsafeRetainedContent=!0;let unsafeMessageIndex=unsafeIndexSuffix[retainedStart],unsafeMessage=projectedMessages[unsafeMessageIndex];return reject("unsafe-retained-content",{unsafeMessageIndex,unsafeEntryId:getSessionContextEntryId(unsafeMessage),unsafeMessageRole:unsafeMessage.role})}if(!toolChainValidAt[retainedStart])return reject("atomic-tool-chain-cut");let summaryTokens=summaryIndex===void 0?Number.POSITIVE_INFINITY:Math.max(estimateTokens2(projectedMessages[summaryIndex]),estimateTokens2({role:"user",content:JSON.stringify(projectedMessages[summaryIndex]),timestamp:0})),retainedTokens=(tokenSuffix[retainedStart]??Number.POSITIVE_INFINITY)+summaryTokens;return retainedTokens>budget?(diagnostics&&(diagnostics.budgetExceeded=!0),reject("retained-token-budget-exceeded",{estimatedTokens:retainedTokens})):{...result3,estimatedTokensAfter:retainedTokens}},prepared=projectCandidate(preparation.firstKeptEntryId,"prepared");if(prepared)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),prepared;for(let index=preparedBoundaryIndex-1;index>=0;index--){let entry=branchEntries[index];if(entry.type==="compaction")break;let earlier=projectCandidate(entry.id,"earlier-safe-boundary");if(earlier)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),earlier}for(let index=branchEntries.length-1;index>preparedBoundaryIndex;index--){let entry=branchEntries[index];if(!hasMeaningfulUserText(entry))continue;let latestUser=projectCandidate(entry.id,"latest-user-turn");if(latestUser)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),latestUser;for(let earlierIndex=index-1;earlierIndex>preparedBoundaryIndex;earlierIndex--){let earlierEntry=branchEntries[earlierIndex];if(earlierEntry.type==="compaction")break;let earlier=projectCandidate(earlierEntry.id,"earlier-safe-boundary");if(earlier)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),earlier}break}if(sawUnsafeRetainedContent)for(let index=preparedBoundaryIndex+1;index<branchEntries.length;index++){let entry=branchEntries[index];if(entry.type==="compaction")continue;let laterSafe=projectCandidate(entry.id,"later-safe-boundary");if(laterSafe)return diagnostics&&(diagnostics.candidatesChecked=candidateCount),laterSafe}diagnostics&&(diagnostics.candidatesChecked=candidateCount)}function shouldRetryIdleWarmup(decision){return!decision.transient||!decision.isIdle||decision.breakerTripped||!decision.stillWarmEligible?!1:decision.attempt<2}var ANTHROPIC_SUBSCRIPTION_COMPACT_ENTRY_TYPE="claude-sdk-oauth-compact",ANTHROPIC_SUBSCRIPTION_COMPACT_BOUNDARY_DIAGNOSTIC="claude_sdk_oauth_compact_boundary",SDK_NATIVE_LANE_REJECTION_REASON="the Claude Agent SDK owns compaction for this session",COMPACT_BOUNDARY_SCHEMA="senpi.claude-sdk-oauth.compact-boundary.v1";function lastTurnIsColdSeedOverflow(context){let branch=context.sessionManager?.getBranch()??[];for(let index=branch.length-1;index>=0;index-=1){let entry=branch[index];if(entry?.type==="compaction")return!1;if(entry?.type==="message"&&entry.message.role==="assistant")return isColdSeedOverflowMessage(entry.message)}return!1}function isRecord17(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isSdkNativeCompactionLane(input){return input.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:input.resumeMode!=="off"}function createCompactionLanePolicy(options={}){let load=options.loadProviderSettings??loadAnthropicSubscriptionProviderSettingsFromDisk,cachedCwd,cachedResumeMode,resolveResumeMode=cwd=>{if(cachedCwd===cwd)return!0;try{cachedResumeMode=load(cwd).resumeMode}catch{return cachedCwd=void 0,!1}return cachedCwd=cwd,!0},disablesSenpiCompaction=context=>context.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID||context.getCompactionSettings?.().model||!resolveResumeMode(context.cwd)?!1:isSdkNativeCompactionLane({model:context.model,resumeMode:cachedResumeMode});return{disablesSenpiCompaction,hasAppendOnlyTranscript(context){return context.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID||!resolveResumeMode(context.cwd)?!1:cachedResumeMode!=="off"},ownsCompaction(context,reason){return reason==="manual"||!disablesSenpiCompaction(context)?!0:reason==="overflow"&&lastTurnIsColdSeedOverflow(context)}}}function parseCompactBoundaryMessage(value2){if(isRecord17(value2)&&!(value2.type!=="system"||value2.subtype!=="compact_boundary")&&!(typeof value2.session_id!="string"||typeof value2.uuid!="string")&&isRecord17(value2.compact_metadata))return{schema:COMPACT_BOUNDARY_SCHEMA,sdkSessionId:value2.session_id,uuid:value2.uuid,compactMetadata:{...value2.compact_metadata}}}function messageDiagnostics(message){if(message.role!=="assistant")return[];let diagnostics=message.diagnostics;return Array.isArray(diagnostics)?diagnostics:[]}function collectCompactBoundaryEntries(message){let entries=[];for(let diagnostic2 of messageDiagnostics(message)){if(diagnostic2.type!==ANTHROPIC_SUBSCRIPTION_COMPACT_BOUNDARY_DIAGNOSTIC)continue;let entry=parseCompactBoundaryMessage(diagnostic2.details);entry&&entries.push(entry)}return entries}import{appendFileSync}from"node:fs";import{appendFile,mkdir as mkdir2,rename as rename3,stat as stat2}from"node:fs/promises";import{dirname as dirname14,join as join19}from"node:path";var DEFAULT_MAX_BYTES5=5*1024*1024,ALLOWED_KEYS=new Set(["origin","reason","route","variant","generation","requestId","tokens","tokensBefore","savedTokens","savingsRatio","contextWindow","threshold","remainingSec","count","durationMs"]),DEBUG_PREFIX2="[senpi-compaction]",EVENTS=new Set(["speculative_started","speculative_applied","speculative_stale","speculative_invalidated","idle_trigger","idle_applied","blocking_started","warm_consumed","core_route_generated","skip_cap","skip_breaker","skip_cursor_mid_turn","threshold_trigger","hard_limit_trigger","grace_deferred","breaker_deterministic_fallback","emergency_prune","ineffective_counted","summary_failed","remote_aborted","blocking_aborted"]);function createCompactionLogger(agentDir,options={}){if(typeof agentDir!="string"||agentDir.length===0)return{debug:()=>{},info:()=>{}};let filePath=join19(agentDir,"logs","compaction.log"),maxBytes=validMaxBytes2(options.maxBytes),reportedFailure=!1;function log(level,event,data){try{if(!EVENTS.has(event))return;let line=formatLine2(level,event,data);writeLine2(filePath,line,maxBytes,options.sink),(options.mirrorToStderr??envValue("COMPACTION_DEBUG")==="1")&&console.error(DEBUG_PREFIX2,line)}catch(error2){reportedFailure||(reportedFailure=!0,console.error("Unable to write compaction log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data)}}function validMaxBytes2(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.floor(value2):DEFAULT_MAX_BYTES5}function formatLine2(level,event,data){let entry={ts:new Date().toISOString(),level,event};if(data)for(let[key,value2]of Object.entries(data)){if(!ALLOWED_KEYS.has(key))continue;let safeValue=safeValueOf(value2,new WeakSet);safeValue!==void 0&&(entry[key]=safeValue)}return JSON.stringify(entry)}var pendingLines=new Map;function writeLine2(filePath,line,maxBytes,sink){let text2=`${line}
1019
1019
  `;sink&&sink(line);let pending=pendingLines.get(filePath);if(pending){pending.text+=text2;return}pendingLines.set(filePath,{text:text2,unconfirmed:"",maxBytes}),exitFlushRegistered||(exitFlushRegistered=!0,process.once("exit",flushPendingLinesSync));let drain=drainLines(filePath);activeDrains.add(drain),drain.finally(()=>activeDrains.delete(drain))}var activeDrains=new Set;var exitFlushRegistered=!1,reportedWriteFailure=!1;async function drainLines(filePath){let pending=pendingLines.get(filePath);try{if(!pending)return;await mkdir2(dirname14(filePath),{recursive:!0,mode:448});let size=await fileSize(filePath);for(;pending.text.length>0;){pending.unconfirmed=pending.text,pending.text="";let chunk="",chunkBytes=0;for(let line of pending.unconfirmed.split(/(?<=\n)/)){let lineBytes=Buffer.byteLength(line);size+chunkBytes+lineBytes>pending.maxBytes&&size+chunkBytes>0&&(chunk&&await appendFile(filePath,chunk,{mode:384}),pending.unconfirmed=pending.unconfirmed.slice(chunk.length),await rename3(filePath,`${filePath}.1`).catch(()=>{}),size=0,chunk="",chunkBytes=0),chunk+=line,chunkBytes+=lineBytes}chunk&&await appendFile(filePath,chunk,{mode:384}),size+=chunkBytes,pending.unconfirmed=""}}catch(error2){reportedWriteFailure||(reportedWriteFailure=!0,console.error("Unable to write compaction log",error2))}finally{pendingLines.delete(filePath)}}function flushPendingLinesSync(){for(let[filePath,pending]of pendingLines){let text2=pending.unconfirmed+pending.text;if(text2.length!==0)try{appendFileSync(filePath,text2,{mode:384})}catch{}}pendingLines.clear()}async function fileSize(filePath){try{return(await stat2(filePath)).size}catch{return 0}}function safeValueOf(value2,seen){if(value2===void 0)return;if(typeof value2=="string"||typeof value2=="number"||typeof value2=="boolean"||value2===null)return value2;if(typeof value2=="bigint")return value2.toString();if(typeof value2=="symbol"||typeof value2=="function"||typeof value2!="object")return String(value2);if(seen.has(value2))return"[Circular]";if(seen.add(value2),Array.isArray(value2))return value2.map(item=>safeValueOf(item,seen));let out={};for(let[key,item]of Object.entries(value2))if(ALLOWED_KEYS.has(key)){let safe=safeValueOf(item,seen);safe!==void 0&&(out[key]=safe)}return out}function matchesSelectedModel(snapshot,ctx){let jobModel=snapshot?.model,selectedModel=ctx.model;return jobModel!==void 0&&selectedModel!==void 0&&jobModel.api===selectedModel.api&&jobModel.provider===selectedModel.provider&&jobModel.id===selectedModel.id&&jobModel.baseUrl===selectedModel.baseUrl&&jobModel.contextWindow===selectedModel.contextWindow}function handleCompactionModelSelect(input){if(input.laneOwnsCompaction){input.invalidate();return}matchesSelectedModel(input.speculativeSnapshot,input.ctx)||input.invalidate();let previousWindow=input.event.previousModel?.contextWindow??0,contextWindow=input.ctx.model?.contextWindow??0;if(previousWindow<=contextWindow||input.breakerTripped)return;let usage3=input.ctx.getContextUsage();if(!usage3)return;let settings=input.ctx.getCompactionSettings(),{leadTokens}=resolveCompactionGeometry({contextWindow,settings,lastYield:input.state.lastYield??void 0});shouldStartSpeculativeCompaction(usage3,contextWindow,settings,input.state.lastYield??void 0,leadTokens)&&input.start()}function incrementAccepted(state){return{...state,acceptedThisTurn:state.acceptedThisTurn+1,acceptedAbsolute:state.acceptedAbsolute+1}}function incrementIneffective(state){return{...state,ineffectiveAttemptsThisTurn:state.ineffectiveAttemptsThisTurn+1}}function shouldRejectByCap(_state){return{cancel:!1}}function trackSpeculativeJob(input){let job={generation:input.generation,snapshot:input.snapshot,controller:input.controller,promise:input.settled.then(({result:result3})=>result3),failure:input.settled.then(({error:error2})=>error2),armedAtTokens:input.armedAtTokens,completed:!1};return input.settled.then(()=>{job.completed=!0}),job}function createInitialState(){return{consecutiveFailures:0,trippedAt:null,acceptedThisTurn:0,ineffectiveAttemptsThisTurn:0,acceptedAbsolute:0,lastYield:null,turnId:null,restoration:null}}function resetTurnCounter(state,turnId){return{...state,acceptedThisTurn:0,ineffectiveAttemptsThisTurn:0,turnId}}function findTaskByContent(phases,content){for(let phase of phases){let task=phase.tasks.find(candidate=>candidate.content===content);if(task)return{task,phase}}}function findPhaseByName(phases,name){return phases.find(phase=>phase.name===name)}function normalizeInProgressTask(phases){let orderedTasks=phases.flatMap(phase=>phase.tasks);if(orderedTasks.length===0)return;let inProgressTasks=orderedTasks.filter(task=>task.status==="in_progress");if(inProgressTasks.length>1)for(let task of inProgressTasks.slice(1))task.status="pending";if(inProgressTasks.length>0)return;let firstPendingTask=orderedTasks.find(task=>task.status==="pending");firstPendingTask&&(firstPendingTask.status="in_progress")}function nextActionableTask(phases){let firstPending;for(let phase of phases)for(let task of phase.tasks){if(task.status==="in_progress")return task;!firstPending&&task.status==="pending"&&(firstPending=task)}return firstPending}function getCompletionTransitions(previous,updated){let previousStatuses=new Map;for(let phase of previous)for(let task of phase.tasks)previousStatuses.set(`${phase.name}\0${task.content}`,task.status);let transitions=[];for(let phase of updated)for(let task of phase.tasks){if(task.status!=="completed")continue;let previousStatus=previousStatuses.get(`${phase.name}\0${task.content}`);previousStatus&&previousStatus!=="completed"&&transitions.push({phase:phase.name,content:task.content})}return transitions}function describeAskNowNext(state){let ask=state.ask?.text??"(no user request captured)",located=state.phases.flatMap(phase=>phase.tasks.map(task=>({task,phase:phase.name})));if(located.length===0)return{ask,now:"none - no todo list",next:"none"};let nowTask=nextActionableTask(state.phases),now2=located.find(hit=>hit.task===nowTask),next=located.find(hit=>hit.task.status==="pending"&&hit.task!==nowTask);return{ask,now:now2?`${now2.task.content} (${now2.phase})`:"none - all tasks closed",next:next?`${next.task.content} (${next.phase})`:"none"}}function handoffMomentOf(before,after,createsList){let hasOpen=tasks=>tasks.some(task=>!isTerminalTodoStatus(task.status)),afterTasks=after.flatMap(phase=>phase.tasks);return afterTasks.length===0?void 0:createsList?"list-created":hasOpen(afterTasks)?after.some(phase=>phase.tasks.length>0&&!hasOpen(phase.tasks)&&hasOpen(before.find(prior=>prior.name===phase.name)?.tasks??[]))?"phase-closed":void 0:hasOpen(before.flatMap(phase=>phase.tasks))?"all-closed":void 0}var HANDOFF_CUES={"list-created":"Handoff due: the plan exists. Before your next tool call, write the Ask / For you / Now / Next block.","phase-closed":"Handoff due: a phase closed. Before your next tool call, write the Ask / For you / Now / Next block.","all-closed":"Handoff due: every task is closed. Your final message is the Ask / For you / Now / Next block, with Now and Next saying no task remains; any other report an instruction asks for (a self-review, a checklist, a summary) goes inside For you."};function formatHandoffCue(moment){return moment?`
1020
1020
 
1021
1021
  ${HANDOFF_CUES[moment]}`:""}function formatAskNowNextHeader(phases,ask){let anchors=describeAskNowNext({phases,ask});return`Ask: ${anchors.ask}
@@ -1023,7 +1023,7 @@ Now: ${anchors.now}
1023
1023
  Next: ${anchors.next}
1024
1024
 
1025
1025
  `}function formatSummary(phases,errors,readOnly=!1,ask){return`${formatAskNowNextHeader(phases,ask)}${formatListSummary(phases,errors,readOnly)}`}function formatListSummary(phases,errors,readOnly){let tasks=phases.flatMap(phase=>phase.tasks);if(tasks.length===0)return errors.length>0?`Errors: ${errors.join("; ")}`:readOnly?"Todo list is empty.":"Todo list cleared.";let remainingTasks=phases.map(phase=>({name:phase.name,tasks:phase.tasks.filter(task=>task.status==="pending"||task.status==="in_progress")})).filter(phase=>phase.tasks.length>0).flatMap(phase=>phase.tasks.map(task=>({...task,phase:phase.name}))),currentIdx=phases.findIndex(phase=>phase.tasks.some(task=>task.status==="pending"||task.status==="in_progress"));currentIdx===-1&&(currentIdx=phases.length-1);let current=phases[currentIdx],done=current.tasks.filter(task=>task.status==="completed"||task.status==="abandoned").length,lines=[];if(errors.length>0&&lines.push(`Errors: ${errors.join("; ")}`),remainingTasks.length===0)lines.push("Remaining items: none.");else{lines.push(`Remaining items (${remainingTasks.length}):`);for(let task of remainingTasks)lines.push(` - ${task.content} [${task.status}] (${task.phase})`)}let closedAll=tasks.filter(task=>task.status==="completed"||task.status==="abandoned").length,workedAhead=phases.some((phase,index)=>index>currentIdx&&phase.tasks.some(task=>task.status==="completed"||task.status==="abandoned"));lines.push(`Overall: ${closedAll}/${tasks.length} done, ${remainingTasks.length} open.`),lines.push(`Active phase ${currentIdx+1}/${phases.length} "${current.name}" (${done}/${current.tasks.length})${workedAhead?" \u2014 earliest phase with open tasks; the in-progress pointer auto-advances to the earliest open task on each completion, so it can sit behind out-of-order work (nothing was un-completed).":"."}`);for(let phase of phases){lines.push(` ${phase.name}:`);for(let task of phase.tasks){let checkbox=task.status==="completed"?"[X]":"[ ]",tag=task.status==="in_progress"?" (in progress)":task.status==="abandoned"?" (dropped)":"";lines.push(` - ${checkbox} ${task.content}${tag}`)}}return lines.join(`
1026
- `)}function sanitizeTodoText(text2){return stripAnsi(text2).replace(/[\r\n]+/g," ").replace(/[\u0000-\u001F\u007F-\u009F]/g," ").replace(/\s+/g," ").trim()}function isTerminalTodoStatus(status){return status==="completed"||status==="abandoned"||status==="cancelled"}function isIncompleteTodo(todo){return!isTerminalTodoStatus(todo.status)}function getTodoMarker(status){return status==="completed"?"[\u2713]":status==="in_progress"?"[\u2022]":status==="abandoned"||status==="cancelled"?"[\xD7]":"[ ]"}var TODO_STATE_ENTRY_TYPE="senpi.todo-state",TODO_RESTORE_REQUEST_TYPE="compaction.todo-restore-request",DEFAULT_INIT_PHASE="Tasks";function isRecord18(value2){return typeof value2=="object"&&value2!==null}function isTodoStatus(value2){return value2==="pending"||value2==="in_progress"||value2==="completed"||value2==="abandoned"}function parseTodoStatus(value2){return value2==="cancelled"?"abandoned":isTodoStatus(value2)?value2:void 0}function parseTodoItem(value2,options){if(!isRecord18(value2)||typeof value2.content!="string")return;let status=parseTodoStatus(value2.status)??(options?.lenient?"pending":void 0);return status?{content:value2.content,status}:void 0}function parseTodoPhase(value2){if(!isRecord18(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks))return;let tasks=[];for(let task of value2.tasks){let parsed=parseTodoItem(task);if(!parsed)return;tasks.push(parsed)}return{name:value2.name,tasks}}function parsePhases(value2){if(!Array.isArray(value2))return;let phases=[];for(let phase of value2){let parsed=parseTodoPhase(phase);if(!parsed)return;phases.push(parsed)}return phases}function parseLegacyTodos(value2){if(!Array.isArray(value2))return;let tasks=[];for(let todo of value2){let parsed=parseTodoItem(todo,{lenient:!0});if(!parsed)return;tasks.push(parsed)}return[{name:DEFAULT_INIT_PHASE,tasks}]}function isTodoAsk(value2){return isRecord18(value2)&&typeof value2.entryId=="string"&&typeof value2.text=="string"&&typeof value2.capturedAt=="number"}function readTodoPayload(value2){if(!isRecord18(value2))return;let phases=value2.schema==="v2"||Array.isArray(value2.phases)?parsePhases(value2.phases):Array.isArray(value2.todos)?parseLegacyTodos(value2.todos):void 0;if(phases)return{phases,ask:isTodoAsk(value2.ask)?{...value2.ask}:void 0}}function cloneTask(task){return{content:task.content,status:task.status}}function clonePhases(phases){return phases.map(phase=>({name:phase.name,tasks:phase.tasks.map(cloneTask)}))}function isTodoItem(value2){return!isRecord18(value2)||typeof value2.content!="string"?!1:isTodoStatus(value2.status)}function isTodoPhase(value2){return!isRecord18(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks)?!1:value2.tasks.every(isTodoItem)}function isTodoPhaseArray(value2){return Array.isArray(value2)&&value2.every(isTodoPhase)}function getLatestTodoStateFromBranchEntries(entries){let state={phases:[],ask:void 0};for(let entry of entries){if(entry.type==="custom"&&entry.customType===TODO_STATE_ENTRY_TYPE){let parsed2=readTodoPayload(entry.data);parsed2&&(state={phases:clonePhases(parsed2.phases),ask:parsed2.ask});continue}if(entry.type!=="message"||!isRecord18(entry.message)||entry.message.role!=="toolResult"||entry.message.toolName!=="todo"&&entry.message.toolName!=="todowrite")continue;let parsed=readTodoPayload(entry.message.details);parsed&&(state={phases:clonePhases(parsed.phases),ask:parsed.ask})}return state}function getLatestPhasesFromBranchEntries(entries){return getLatestTodoStateFromBranchEntries(entries).phases}var ASK_TEXT_LIMIT=200;function firstTextBlock(content){if(typeof content=="string")return content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&block.type==="text"&&typeof block.text=="string")return block.text}}function truncateAskText(text2){let codePoints=Array.from(text2);return codePoints.length<=ASK_TEXT_LIMIT?text2:`${codePoints.slice(0,ASK_TEXT_LIMIT).join("")}\u2026 (+${codePoints.length-ASK_TEXT_LIMIT} chars)`}function captureListAsk(entries,capturedAt){let lastStateIndex=-1,restore,requests=[];entries.forEach((entry,index)=>{if(entry.type==="custom"&&entry.customType===TODO_STATE_ENTRY_TYPE){lastStateIndex=index;return}if(entry.type==="custom_message"&&entry.customType===TODO_RESTORE_REQUEST_TYPE){let ask=entry.details?.ask;isTodoAsk(ask)&&(restore={index,ask});return}if(entry.type!=="message"||entry.message.role!=="user")return;let raw=firstTextBlock(entry.message.content);if(raw===void 0||parseAskUserAnswerFrame(raw))return;let text2=sanitizeTodoText(raw);text2&&requests.push({index,entryId:entry.id,text:text2})});let latest=requests.at(-1);if(restore&&restore.index>lastStateIndex&&restore.index>(latest?.index??-1))return{...restore.ask};let chosen=lastStateIndex===-1?requests[0]:latest;return chosen?{entryId:chosen.entryId,text:truncateAskText(chosen.text),capturedAt}:void 0}function normalized(text2){return sanitizeTodoText(text2).toLowerCase()}function diceCoefficient(left,right){if(left===right)return 1;if(left.length<2||right.length<2)return 0;let pairs=new Map;for(let index=0;index<left.length-1;index+=1){let pair=left.slice(index,index+2);pairs.set(pair,(pairs.get(pair)??0)+1)}let overlap=0;for(let index=0;index<right.length-1;index+=1){let pair=right.slice(index,index+2),count=pairs.get(pair)??0;count>0&&(overlap+=1,pairs.set(pair,count-1))}return 2*overlap/(left.length+right.length-2)}function suggestionFor(candidates,query,contentOf){let normalizedQuery=normalized(query);if(!normalizedQuery)return;let suggestion,bestScore=0;for(let candidate of candidates){let content=contentOf(candidate),normalizedContent=normalized(content);if(!normalizedContent)continue;let score3=normalizedContent.includes(normalizedQuery)||normalizedQuery.includes(normalizedContent)?1:diceCoefficient(normalizedContent,normalizedQuery);score3>=.5&&score3>bestScore&&(bestScore=score3,suggestion=content)}return suggestion}function fuzzyResolveTask(phases,query){let candidates=phases.flatMap(phase=>phase.tasks.map(task=>({task,phase}))),exactMatches=candidates.filter(({task})=>task.content===query);if(exactMatches.length===1)return{hit:exactMatches[0],corrected:!1};let normalizedQuery=normalized(query),normalizedMatches=candidates.filter(({task})=>normalized(task.content)===normalizedQuery);if(normalizedMatches.length===1)return{hit:normalizedMatches[0],corrected:!0};let suggestion=suggestionFor(candidates,query,({task})=>task.content);return suggestion?{corrected:!1,suggestion}:{corrected:!1}}function fuzzyResolvePhase(phases,name){let exactMatches=phases.filter(phase=>phase.name===name);if(exactMatches.length===1)return{hit:exactMatches[0],corrected:!1};let normalizedName=normalized(name),normalizedMatches=phases.filter(phase=>normalized(phase.name)===normalizedName);if(normalizedMatches.length===1)return{hit:normalizedMatches[0],corrected:!0};let suggestion=suggestionFor(phases,name,phase=>phase.name);return suggestion?{corrected:!1,suggestion}:{corrected:!1}}function resolveTaskOrError(phases,content,errors,corrections){if(!content){errors.push("Missing task content");return}if(!corrections){let hit=findTaskByContent(phases,content);if(!hit)if(/^task-\d+$/.test(content))errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs \u2014 pass the task's full text from the previous result.`);else{let hint2=phases.reduce((sum,phase)=>sum+phase.tasks.length,0)===0?" (todo list is empty \u2014 was it replaced or not yet created?)":"";errors.push(`Task "${content}" not found${hint2}`)}return hit}let resolution=fuzzyResolveTask(phases,content);if(resolution.hit)return resolution.corrected&&corrections.push(`[auto-matched] task "${content}" -> "${resolution.hit.task.content}" \u2014 pass the exact text from the previous todo result next time`),resolution.hit;let exactMatches=phases.flatMap(phase=>phase.tasks.filter(task=>task.content===content).map(task=>({task,phase})));if(exactMatches.length>1){let phaseNames=[...new Set(exactMatches.map(match=>match.phase.name))].map(name=>`"${name}"`);errors.push(`Task "${content}" is ambiguous: duplicate task text exists in phases ${phaseNames.join(", ")}. Use /todo edit to make the task text unique.`);return}if(/^task-\d+$/.test(content)){errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs \u2014 pass the task's full text from the previous result.`);return}let hint=phases.reduce((sum,phase)=>sum+phase.tasks.length,0)===0?" (todo list is empty \u2014 was it replaced or not yet created?)":"",suggestion=resolution.suggestion?` Did you mean "${resolution.suggestion}"?`:"";errors.push(`Task "${content}" not found${hint}${suggestion}`)}function resolvePhaseOrError(phases,name,errors,corrections){if(!name){errors.push("Missing phase name");return}if(!corrections){let phase=findPhaseByName(phases,name);return phase||errors.push(`Phase "${name}" not found`),phase}let resolution=fuzzyResolvePhase(phases,name);if(resolution.hit)return resolution.corrected&&corrections.push(`[auto-matched] phase "${name}" -> "${resolution.hit.name}" \u2014 pass the exact text from the previous todo result next time`),resolution.hit;if(phases.filter(phase=>phase.name===name).length>1){errors.push(`Phase "${name}" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`);return}let suggestion=resolution.suggestion?` Did you mean "${resolution.suggestion}"?`:"";errors.push(`Phase "${name}" not found${suggestion}`)}function getTaskTargets(phases,entry,errors,corrections){if(entry.task){let hit=resolveTaskOrError(phases,entry.task,errors,corrections);return hit?[hit.task]:[]}if(entry.phase){let phase=resolvePhaseOrError(phases,entry.phase,errors,corrections);return phase?[...phase.tasks]:[]}return phases.flatMap(phase=>phase.tasks)}function initPhases(entry,errors,corrections){let list4=entry.list??(entry.items&&entry.items.length>0?[{phase:entry.phase??DEFAULT_INIT_PHASE,items:entry.items}]:void 0);if(!list4)return errors.push("Missing list for init operation"),[];let phases=[],phasesByName=new Map,seenTasks=new Set;for(let listEntry of list4){listEntry.items.length===0&&errors.push(`Phase "${listEntry.phase}" has no tasks in init list`);let phase=phasesByName.get(listEntry.phase);phase?corrections?.push(`[auto-corrected] merged duplicate phase "${listEntry.phase}" in init list`):(phase={name:listEntry.phase,tasks:[]},phasesByName.set(listEntry.phase,phase),phases.push(phase));for(let content of listEntry.items){if(seenTasks.has(content)){corrections?.push(`[auto-corrected] kept first duplicate task "${content}" in init list`);continue}seenTasks.add(content),phase.tasks.push({content,status:"pending"})}}return phases}function appendItems(phases,entry,errors,corrections){if(!entry.items||entry.items.length===0)return errors.push("Missing items for append operation"),phases;let seen=new Set,hasDuplicate=!1;for(let content of entry.items)(seen.has(content)||findTaskByContent(phases,content))&&(errors.push(`Task "${content}" already exists`),hasDuplicate=!0),seen.add(content);if(hasDuplicate)return phases;let phaseName=entry.phase;if(!phaseName){let activeTask=nextActionableTask(phases);phaseName=(activeTask?phases.find(phase2=>phase2.tasks.includes(activeTask)):void 0)?.name??phases[phases.length-1]?.name??DEFAULT_INIT_PHASE,corrections?.push(`[auto-corrected] append had no phase; used "${phaseName}"`)}let phase=findPhaseByName(phases,phaseName);phase||(phase={name:phaseName,tasks:[]},phases.push(phase));for(let content of entry.items)phase.tasks.push({content,status:"pending"});return phases}function removeTasks(phases,entry,errors,corrections){if(entry.task){let hit=resolveTaskOrError(phases,entry.task,errors,corrections);return hit&&(hit.phase.tasks=hit.phase.tasks.filter(candidate=>candidate!==hit.task)),phases}if(entry.phase){let phase=resolvePhaseOrError(phases,entry.phase,errors,corrections);return phase&&(phase.tasks=[]),phases}for(let phase of phases)phase.tasks=[];return phases}function applyEntry(phases,entry,errors,corrections){switch(entry.op){case"init":return initPhases(entry,errors,corrections);case"start":{let hit=resolveTaskOrError(phases,entry.task,errors,corrections);if(!hit)return phases;for(let phase of phases)for(let candidate of phase.tasks)candidate.status==="in_progress"&&candidate!==hit.task&&(candidate.status="pending");return hit.task.status="in_progress",phases}case"done":for(let task of getTaskTargets(phases,entry,errors,corrections))task.status="completed";return phases;case"drop":for(let task of getTaskTargets(phases,entry,errors,corrections))task.status="abandoned";return phases;case"rm":return removeTasks(phases,entry,errors,corrections);case"append":return appendItems(phases,entry,errors,corrections);case"view":return phases}}function applyParams(phases,params,corrections){if(params.op==="view")return{phases,errors:[]};let original=clonePhases(phases),errors=[],next=applyEntry(phases,params,errors,corrections);return errors.length>0?{phases:original,errors}:(normalizeInProgressTask(next),{phases:next,errors})}function applyOpsToPhases(currentPhases,ops){let errors=[],next=clonePhases(currentPhases);for(let op of ops)next=applyEntry(next,op,errors);return errors.length>0?{phases:clonePhases(currentPhases),errors}:(normalizeInProgressTask(next),{phases:next,errors})}var TODO_WIDGET_MAX_LINES=10,TODO_WIDGET_HEADER_LINES=2,TODO_WIDGET_RECENT_TASKS=2;function getActivePhase(phases){let activeTask=nextActionableTask(phases);if(activeTask)return phases.find(phase=>phase.tasks.includes(activeTask))}function formatOmittedTasks(count,direction){return`... (${count} ${direction} task${count===1?"":"s"})`}function label(text2){return{kind:"label",text:text2}}function taskRow(task){return{kind:"task",task}}function getTodoWidgetModel(phases){let activePhase=getActivePhase(phases);if(!activePhase)return;let header2=[label("Todo"),label(sanitizeTodoText(activePhase.name))],taskRows=activePhase.tasks.map(taskRow);if(header2.length+taskRows.length<=TODO_WIDGET_MAX_LINES)return{phaseName:activePhase.name,rows:[...header2,...taskRows]};let activeTask=nextActionableTask([activePhase]);if(!activeTask)return;let activeIndex=activePhase.tasks.indexOf(activeTask),firstVisibleTask=Math.max(0,activeIndex-TODO_WIDGET_RECENT_TASKS),earlierOmitted=firstVisibleTask,bodyBudget=TODO_WIDGET_MAX_LINES-TODO_WIDGET_HEADER_LINES,recentAndActive=activePhase.tasks.slice(firstVisibleTask,activeIndex+1).map(taskRow),earlierMarkerRows=earlierOmitted>0?1:0,pendingAfterActive=activePhase.tasks.slice(activeIndex+1).filter(todo=>todo.status==="pending"),upcomingBudget=bodyBudget-recentAndActive.length-earlierMarkerRows,visibleUpcomingCount=pendingAfterActive.length>upcomingBudget?Math.max(0,upcomingBudget-1):pendingAfterActive.length,laterOmitted=pendingAfterActive.length-visibleUpcomingCount;return{phaseName:activePhase.name,rows:[...header2,...earlierOmitted>0?[label(formatOmittedTasks(earlierOmitted,"earlier"))]:[],...recentAndActive,...pendingAfterActive.slice(0,visibleUpcomingCount).map(taskRow),...laterOmitted>0?[label(formatOmittedTasks(laterOmitted,"later"))]:[]]}}var TODO_SNAPSHOT_CUSTOM_TYPE="compaction.todo-snapshot",TODO_SNAPSHOT_SCHEMA="senpi.compaction.todo-snapshot.v1",TODO_STATE_ENTRY_TYPE2="senpi.todo-state";function isRecord19(value2){return typeof value2=="object"&&value2!==null}function isTodoStatus2(value2){return value2===void 0||typeof value2=="string"}function isTodoEntry(value2){if(!isRecord19(value2))return!1;let hasId=typeof value2.id=="string",hasContent=typeof value2.content=="string"||typeof value2.text=="string";return(hasId||hasContent)&&isTodoStatus2(value2.status)}function isTodoPhase2(value2){return!isRecord19(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks)?!1:value2.tasks.every(isTodoEntry)}function isCustomTodoEntry(entry){return entry.type==="custom"&&(entry.customType.startsWith("todowrite")||entry.customType===TODO_STATE_ENTRY_TYPE2)}function isLegacyTodoListEntry(entry){return entry.type==="custom"&&entry.customType==="todo-list"}function readTodosFromEntry(entry){let data=entry.data;return isRecord19(data)?Array.isArray(data.todos)?data.todos.filter(isTodoEntry):Array.isArray(data.phases)?data.phases.filter(isTodoPhase2).flatMap(phase=>phase.tasks):[]:[]}function isCustomEntryEnvelope(value2){return isRecord19(value2)&&value2.type==="custom"&&typeof value2.id=="string"&&(value2.parentId===null||typeof value2.parentId=="string")&&typeof value2.timestamp=="string"&&typeof value2.customType=="string"}function normalizeLegacySnapshotEntries(entries){for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(!(!isLegacyTodoListEntry(entry)&&!isCustomTodoEntry(entry)))return entry.customType===TODO_STATE_ENTRY_TYPE2?getLatestPhasesFromBranchEntries(entries.slice(0,index+1)):readTodosFromEntry(entry)}return[]}function normalizeSnapshotItems(value2){return Array.isArray(value2)?value2.every(isTodoPhase2)?value2:value2.every(isCustomEntryEnvelope)?normalizeLegacySnapshotEntries(value2):value2.every(isTodoEntry)?value2:null:null}function getCurrentTodoPhases(ctx){return getLatestPhasesFromBranchEntries(ctx.sessionManager.getBranch())}function findLatestTodoSnapshot(ctx){let entries=ctx.sessionManager.getBranch();for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==TODO_SNAPSHOT_CUSTOM_TYPE)continue;let data=entry.data;if(!isRecord19(data)||data.schema!==TODO_SNAPSHOT_SCHEMA)continue;let todos=normalizeSnapshotItems(data.todos);if(todos)return{schema:TODO_SNAPSHOT_SCHEMA,todos,capturedAt:typeof data.capturedAt=="number"?data.capturedAt:0,...isTodoAsk(data.ask)?{ask:data.ask}:{}}}return null}function createTodoSnapshot(ctx){let{phases,ask}=getLatestTodoStateFromBranchEntries(ctx.sessionManager.getBranch());return{schema:TODO_SNAPSHOT_SCHEMA,todos:phases,capturedAt:Date.now(),...ask?{ask}:{}}}function persistTodoSnapshot(pi,snapshot){pi.appendEntry(TODO_SNAPSHOT_CUSTOM_TYPE,snapshot)}function restoreTodosIfMissing(piOrSnapshot,ctxOrCurrentTodos,_pi){if(Array.isArray(piOrSnapshot)&&Array.isArray(ctxOrCurrentTodos))return ctxOrCurrentTodos.length>0?{applied:!1,restoredTodos:ctxOrCurrentTodos}:{applied:piOrSnapshot.length>0,restoredTodos:piOrSnapshot};let pi=piOrSnapshot,ctx=ctxOrCurrentTodos;if(getCurrentTodoPhases(ctx).length>0)return;let snapshot=findLatestTodoSnapshot(ctx);!snapshot||snapshot.todos.length===0||pi.sendMessage({customType:TODO_RESTORE_REQUEST_TYPE,content:`Restore missing todo tasks from snapshot: ${JSON.stringify(snapshot.todos)}`,display:!1,details:snapshot},{triggerTurn:!0,deliverAs:"nextTurn"})}function createInitialReminderState(){return{lastFiredEpoch:null}}function formatReminderMessage(remaining){return`[context budget] Approximately ${remaining} tokens remain before automatic compaction. Wrap up verbose exploration, prefer concise summaries over full dumps, and front-load conclusions.`}function clearTokenBudgetReminderLease(state){return state.lease?{lastFiredEpoch:state.lastFiredEpoch}:state}function computeTokenBudgetReminder(input){let remaining=input.thresholdTokens-input.contextTokens;if(!(remaining>0&&remaining<=2*input.leadTokens)||input.state.lastFiredEpoch===input.compactionEpoch)return{nextState:clearTokenBudgetReminderLease(input.state)};let message=formatReminderMessage(remaining);return{message,nextState:{lastFiredEpoch:input.compactionEpoch,lease:{compactionEpoch:input.compactionEpoch,message}}}}function isTransientSummarizationFailure(error2,message){return error2 instanceof StreamDurationBudgetError||error2 instanceof StreamIdleTimeoutError2||error2 instanceof SummarizationTotalBudgetError?!0:error2 instanceof SummaryRequestError?error2.transient:error2 instanceof SummarizationOverflowExhaustedError?!0:isRetryableErrorMessage(message)}var DEFAULT_CONTEXT_WINDOW2=2e5,EMERGENCY_COMPACTION_INSTRUCTIONS="EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.",PROACTIVE_COMPACTION_INSTRUCTIONS="Proactively compact before the next agent turn.",MAX_PENDING_METADATA=8;function compactionExtension(pi,remoteCompactionDependencies={}){let state=createInitialState(),lanePolicy=createCompactionLanePolicy(),restorationDirectiveState=createRestorationDirectiveState(),emergencyPruneLatch=createEmergencyPruneLatch(),degradationState=createDegradationMonitorState(),restorationState=state.restoration??createRestorationTrackerState();state={...state,restoration:restorationState};let speculativeGeneration=0,reminderState=createInitialReminderState(),speculativeJob,pendingMetadata=new Map,logger,getLogger=ctx=>logger??=createCompactionLogger(ctx.agentDir);function getSummarizationTools(){if(typeof pi.getAllTools!="function"||typeof pi.getActiveTools!="function")return[];try{let definitionsByName=new Map(pi.getAllTools().map(tool=>[tool.name,tool]));return pi.getActiveTools().flatMap(name=>{let tool=definitionsByName.get(name);return tool?[{name:tool.name,description:tool.description,parameters:tool.parameters}]:[]})}catch{return[]}}let idleWarmupTimer,idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!1;function cancelIdleWarmupRetry(){idleWarmupTimer!==void 0&&(clearTimeout(idleWarmupTimer),idleWarmupTimer=void 0)}function isContextRetired(ctx){try{return ctx.isIdle(),!1}catch{return!0}}function armIdleWarmupRetry(ctx){let job=speculativeJob;job&&job.failure.then(failure2=>{if(failure2===void 0){idleWarmupAttempt=0;return}if(speculativeJob!==job)return;if(isContextRetired(ctx)){cancelIdleWarmupRetry();return}let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings(),breakerTripped=isTripped(state,Date.now()),retryDecision={attempt:idleWarmupAttempt,transient:isTransientSummarizationFailure(failure2,failure2.message),isIdle:ctx.isIdle(),breakerTripped,stillWarmEligible:shouldWarmAtIdle({willRetry:!1,aborted:!1,settings,usage:usage3,contextWindow,breakerTripped,lastYield:state.lastYield??void 0,mode:ctx.mode})};shouldRetryIdleWarmup(retryDecision)&&(cancelIdleWarmupRetry(),idleWarmupTimer=setTimeout(()=>{idleWarmupTimer=void 0,speculativeJob===job&&(isContextRetired(ctx)||ctx.isIdle()&&(idleWarmupAttempt+=1,getLogger(ctx).debug("idle_trigger",{contextWindow,tokens:usage3?.tokens??0,count:idleWarmupAttempt}),invalidateSpeculativeCompaction(ctx),startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx)))},15e3))})}function armIdleApply(ctx){let job=speculativeJob;job&&job.promise.then(async compaction=>{if(!compaction||speculativeJob!==job||!sessionIdleSinceAgentEnd||isContextRetired(ctx)||!ctx.isIdle()||lanePolicy.disablesSenpiCompaction(ctx)||isTripped(state,Date.now())||shouldRejectByCap(state).cancel)return;let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2;!usage3||!shouldTriggerCompaction(usage3,contextWindow,ctx.getCompactionSettings(),state.lastYield??void 0)||!(await applyGeneratedCompaction(ctx,job.snapshot,()=>speculativeGeneration,compaction)).applied||(speculativeJob===job&&(speculativeJob=void 0),cancelIdleWarmupRetry(),getLogger(ctx).debug("idle_applied",{generation:job.generation,origin:"speculative"}))}).catch(()=>{})}function isSameModelIdentity(left,right){return right!==void 0&&left.api===right.api&&left.provider===right.provider&&left.id===right.id&&left.baseUrl===right.baseUrl&&left.contextWindow===right.contextWindow}function claimWarmSummaryForCoreRoute(event,ctx){let job=speculativeJob;if(!job||event.customInstructions!==void 0||job.snapshot.origin!=="speculative"||job.snapshot.preparation.firstKeptEntryId!==event.preparation.firstKeptEntryId||!isSameModelIdentity(job.snapshot.model,ctx.model))return;let anchor=createWarmAnchorSnapshot(job.snapshot.preparation.firstKeptEntryId,job.snapshot.branchEntries??[]);if(!(!anchor||!isWarmSummaryAnchorValid(anchor,event.branchEntries??ctx.sessionManager.getBranch())))return speculativeJob=void 0,job}function invalidateSpeculativeCompaction(ctx){let previousGeneration=speculativeGeneration;speculativeGeneration++,getLogger(ctx).debug("speculative_invalidated",{generation:previousGeneration}),speculativeJob?.controller.abort(),speculativeJob=void 0}function startSpeculativeCompaction(ctx,customInstructions){if(speculativeJob)return;let generation2=++speculativeGeneration,snapshot=createSpeculativeCompactionSnapshot(ctx,{generation:generation2,customInstructions,origin:"speculative",tools:getSummarizationTools()});if(!snapshot)return;getLogger(ctx).debug("speculative_started",{generation:generation2,origin:"speculative"});let controller=new AbortController,settled=runExtensionCompaction(ctx,snapshot,controller.signal).then(result3=>({result:result3,error:void 0}),error2=>({result:void 0,error:error2 instanceof Error?error2:new Error(String(error2))}));speculativeJob=trackSpeculativeJob({generation:generation2,snapshot,controller,settled,armedAtTokens:ctx.getContextUsage()?.tokens??0}),settled.then(()=>remoteCompactionDependencies.onSpeculativeJobSettled?.())}function capturePendingMetadata(requestId,ctx){for(pendingMetadata.set(requestId,{checkpoint:captureAgentCheckpoint(pi,ctx),todoSnapshot:createTodoSnapshot(ctx)});pendingMetadata.size>MAX_PENDING_METADATA;){let oldestRequestId=pendingMetadata.keys().next().value;if(oldestRequestId===void 0)break;pendingMetadata.delete(oldestRequestId)}}function persistAcceptedMetadata(requestId){let metadata=pendingMetadata.get(requestId);metadata&&(pendingMetadata.delete(requestId),persistCheckpoint(pi,metadata.checkpoint),persistTodoSnapshot(pi,metadata.todoSnapshot))}function recoverRequiredCompaction(ctx,snapshot,failureKind,cause){let diagnostics={},compaction=createRequiredCompactionFallback(snapshot.preparation,snapshot.contextWindow,failureKind,{taskIntent:resolveInheritedTaskIntent(snapshot.branchEntries??[])},snapshot.branchEntries,diagnostics);return compaction?(ctx.ui.notify(formatRequiredCompactionFallbackNotice(failureKind,cause),"warning"),{compaction}):{rejectionReason:formatRequiredCompactionFallbackRejection(diagnostics)}}async function applyBlockingCompaction(ctx,customInstructions){let provider=ctx.model?.provider;if((provider==="cursor"||provider==="cursor-cli-oauth")&&!ctx.isIdle())return getLogger(ctx).debug("skip_cursor_mid_turn",{route:"blocking"}),{applied:!1,reason:"rejected"};if(isTripped(state,Date.now()))return getLogger(ctx).debug("skip_breaker",{route:"blocking"}),{applied:!1,reason:"rejected"};if(shouldRejectByCap(state).cancel)return getLogger(ctx).debug("skip_cap",{route:"blocking"}),{applied:!1,reason:"rejected"};let feedbackSignal=ctx.beginCompaction?.({reason:"extension"});try{let remoteFallbackReason;if(isOpenAiRemoteCompactionModel(ctx.model)){let remoteGeneration=speculativeGeneration+1,remoteSnapshot=createSpeculativeCompactionSnapshot(ctx,{generation:remoteGeneration,customInstructions,origin:"blocking"});if(getLogger(ctx).debug("blocking_started",{generation:remoteGeneration,origin:"blocking"}),remoteSnapshot){let remoteSignal=feedbackSignal??new AbortController().signal,remoteCompaction=await runOpenAiRemoteCompaction(ctx,createBlockingRemoteCompactionEvent(ctx,remoteSnapshot,customInstructions,remoteSignal),data=>{data?.action==="remote_fallback"&&typeof data.reason=="string"&&(remoteFallbackReason=data.reason),reportRemoteCompactionTimeout(ctx,"extension",feedbackSignal,data),pi.events.emit(SENPI_COMPACTION_EVENT,data)},remoteCompactionDependencies);if(remoteCompaction){if(speculativeGeneration!==remoteGeneration-1){let result5={applied:!1,reason:"stale"};return getLogger(ctx).debug("speculative_stale",{generation:remoteGeneration}),endCompactionFeedback(ctx,feedbackSignal,result5),result5}speculativeGeneration=remoteGeneration,speculativeJob?.controller.abort(),speculativeJob=void 0;let result4=await applyGeneratedCompaction(ctx,remoteSnapshot,()=>speculativeGeneration,remoteCompaction,feedbackSignal);return getLogger(ctx).debug("speculative_applied",{generation:remoteGeneration,origin:"blocking"}),endCompactionFeedback(ctx,feedbackSignal,result4),result4}}}let pendingJob=speculativeJob;if(pendingJob){let unlinkAbort=linkAbortSignal(feedbackSignal,pendingJob.controller),compaction2,inheritedFailure;try{compaction2=await pendingJob.promise,inheritedFailure=await pendingJob.failure,compaction2&&getLogger(ctx).debug("warm_consumed",{generation:pendingJob.generation,route:"speculative"})}finally{unlinkAbort()}if(inheritedFailure!==void 0){speculativeJob=void 0;let failureKind=classifyRequiredCompactionFallbackFailure(inheritedFailure);if(failureKind!==void 0&&!feedbackSignal?.aborted&&pendingJob.snapshot.generation===speculativeGeneration&&pendingJob.snapshot.expectedRevision===ctx.getMessageRevision()){let recovery=recoverRequiredCompaction(ctx,pendingJob.snapshot,failureKind,inheritedFailure);if(compaction2=recovery.compaction,!compaction2){let result5={applied:!1,reason:"failed"};return endCompactionFeedback(ctx,feedbackSignal,result5,recovery.rejectionReason),result5}}else if(failureKind===void 0&&isTransientSummarizationFailure(inheritedFailure,inheritedFailure.message))return ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:feedbackSignal?.aborted,errorMessage:`Compaction failed: ${stripTurnRetrySuppressionPrefix(inheritedFailure.message)}`}),state=recordFailure(state,Date.now(),{route:"extension"}),{applied:!1,reason:"failed"}}let result4=await applyGeneratedCompaction(ctx,pendingJob.snapshot,()=>speculativeGeneration,compaction2,feedbackSignal);if(result4.applied)return speculativeJob=void 0,getLogger(ctx).debug("speculative_applied",{generation:pendingJob.generation,origin:"speculative"}),endCompactionFeedback(ctx,feedbackSignal,result4),result4;result4.reason==="stale"?getLogger(ctx).debug("speculative_stale",{generation:pendingJob.generation}):result4.reason==="rejected"&&(feedbackSignal=ctx.beginCompaction?.({reason:"extension"})),speculativeJob=void 0}let generation2=++speculativeGeneration,snapshot=createSpeculativeCompactionSnapshot(ctx,{generation:generation2,customInstructions,origin:"core-route",tools:getSummarizationTools()});if(!snapshot){let result4={applied:!1,reason:"unavailable"};return getLogger(ctx).debug("summary_failed",{reason:"unavailable"}),endCompactionFeedback(ctx,feedbackSignal,result4,remoteFallbackReason),result4}let compaction;try{compaction=await runExtensionCompaction(ctx,snapshot,feedbackSignal,delta=>ctx.updateCompaction?.({reason:"extension",signal:feedbackSignal,delta}))}catch(error2){let failureKind=classifyRequiredCompactionFallbackFailure(error2);if(failureKind!==void 0&&!feedbackSignal?.aborted){let recovery=recoverRequiredCompaction(ctx,snapshot,failureKind,error2);if(compaction=recovery.compaction,!compaction){let result4={applied:!1,reason:"failed"};return endCompactionFeedback(ctx,feedbackSignal,result4,recovery.rejectionReason),result4}}else{if(!(error2 instanceof SummaryGenerationError))throw error2;getLogger(ctx).debug("summary_failed",{reason:error2.kind})}}let result3=await applyGeneratedCompaction(ctx,snapshot,()=>speculativeGeneration,compaction,feedbackSignal);return endCompactionFeedback(ctx,feedbackSignal,result3,remoteFallbackReason),result3}catch(error2){if(feedbackSignal?.aborted)return getLogger(ctx).debug("blocking_aborted",{route:"blocking"}),ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:!0}),{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2);if(ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:feedbackSignal?.aborted,errorMessage:`Compaction failed: ${stripTurnRetrySuppressionPrefix(message)}`}),isTransientSummarizationFailure(error2,message))return state=recordFailure(state,Date.now(),{route:"extension"}),{applied:!1,reason:"failed"};throw error2}}pi.on("session_before_compact",async(event,ctx)=>{if(event.signal.aborted)return;let claimedWarmJob=claimWarmSummaryForCoreRoute(event,ctx),warmJobConsumed=!1;invalidateSpeculativeCompaction(ctx);let claimedGeneration=speculativeGeneration;try{if(!lanePolicy.ownsCompaction(ctx,event.reason))return{cancel:!0,rejectionCause:"external-owner",reason:SDK_NATIVE_LANE_REJECTION_REASON};if(shouldRejectByCap(state).cancel)return getLogger(ctx).debug("skip_cap",{reason:event.reason,count:state.acceptedAbsolute}),{cancel:!0,rejectionCause:"per-turn-cap",reason:"absolute compaction cap reached for this session"};let now2=Date.now();if(isTripped(state,now2)&&!shouldBypass(state,{reason:event.reason})){let remainingMs2=state.trippedAt!==null?Math.max(0,state.trippedAt+6e4-now2):0;return getLogger(ctx).debug("skip_breaker",{reason:event.reason,remainingSec:Math.ceil(remainingMs2/1e3)}),{cancel:!0,rejectionCause:"circuit-breaker",reason:`compaction circuit breaker cooling down (${Math.ceil(remainingMs2/1e3)}s left)`}}capturePendingMetadata(event.requestId,ctx);let model=ctx.model;if(!model)return;let remoteCompaction;try{remoteCompaction=await runOpenAiRemoteCompaction(ctx,event,data=>{reportRemoteCompactionTimeout(ctx,event.reason,event.signal,data),pi.events.emit(SENPI_COMPACTION_EVENT,data)},remoteCompactionDependencies)}catch(error2){if(!event.signal.aborted)throw error2;getLogger(ctx).debug("remote_aborted",{route:"core-route",requestId:event.requestId});return}if(remoteCompaction)return getLogger(ctx).debug("core_route_generated",{route:"core-route",requestId:event.requestId}),{compaction:remoteCompaction};let inheritedWarmFailure;if(claimedWarmJob){let unlinkAbort=linkAbortSignal(event.signal,claimedWarmJob.controller),warmCompaction,warmFailure;try{warmCompaction=await claimedWarmJob.promise,warmFailure=await claimedWarmJob.failure}finally{unlinkAbort()}if(warmFailure===void 0&&warmCompaction&&!event.signal.aborted)return getLogger(ctx).debug("warm_consumed",{generation:claimedWarmJob.generation,route:"core-route"}),warmJobConsumed=!0,{compaction:warmCompaction};warmFailure!==void 0&&requiresDeterministicCompactionFallback(event,ctx.getContextUsage())&&classifyRequiredCompactionFallbackFailure(warmFailure)!==void 0&&!event.signal.aborted&&speculativeGeneration===claimedGeneration&&claimedWarmJob.snapshot.expectedRevision===ctx.getMessageRevision()&&(inheritedWarmFailure=warmFailure)}let snapshot={generation:++speculativeGeneration,expectedRevision:ctx.getMessageRevision(),model,contextWindow:ctx.getContextUsage()?.contextWindow??model.contextWindow??DEFAULT_CONTEXT_WINDOW2,preparation:event.preparation,branchEntries:event.branchEntries,promptVariant:getPromptVariant(event),origin:"core-route",customInstructions:event.customInstructions,systemPrompt:ctx.getSystemPrompt(),tools:getSummarizationTools()},compaction;try{if(inheritedWarmFailure)throw inheritedWarmFailure;compaction=await runExtensionCompaction(ctx,snapshot,event.signal,delta=>ctx.updateCompaction?.({reason:event.reason,signal:event.signal,delta}))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2),failureKind=classifyRequiredCompactionFallbackFailure(error2);if(requiresDeterministicCompactionFallback(event,ctx.getContextUsage())&&failureKind!==void 0&&!event.signal.aborted){let recovery=recoverRequiredCompaction(ctx,snapshot,failureKind,error2);return recovery.compaction?{compaction:recovery.compaction}:(pendingMetadata.delete(event.requestId),{cancel:!0,reason:recovery.rejectionReason})}return pendingMetadata.delete(event.requestId),error2 instanceof SummaryGenerationError?{cancel:!0,reason:stripTurnRetrySuppressionPrefix(error2.message)}:{cancel:!0,reason:`compaction generator failed: ${stripTurnRetrySuppressionPrefix(message)}`}}return compaction?{compaction}:(pendingMetadata.delete(event.requestId),event.signal.aborted?{cancel:!0}:{cancel:!0,reason:"compaction generator returned no summary"})}finally{warmJobConsumed||claimedWarmJob?.controller.abort()}}),pi.on("model_select",(event,ctx)=>handleCompactionModelSelect({event,ctx,state,speculativeSnapshot:speculativeJob?.snapshot,laneOwnsCompaction:lanePolicy.disablesSenpiCompaction(ctx),breakerTripped:isTripped(state,Date.now()),invalidate:()=>invalidateSpeculativeCompaction(ctx),start:()=>startSpeculativeCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS)})),pi.on("session_compact",async(event,ctx)=>{let compactEvent=event;if(invalidateSpeculativeCompaction(ctx),compactEvent.accepted){persistAcceptedMetadata(compactEvent.requestId);let branchEntries=ctx.sessionManager.getBranch(),firstKeptIndex=branchEntries.findIndex(entry=>entry.id===compactEvent.compactionEntry.firstKeptEntryId),keptEntries=firstKeptIndex===-1?[]:branchEntries.slice(firstKeptIndex);state=incrementAccepted(state),state=recordSuccess(state),reminderState=createInitialReminderState();let sy=compactEvent.compactionEntry.details?.structuralYield;sy&&typeof sy.savedTokens=="number"&&typeof sy.savingsRatio=="number"&&(state={...state,lastYield:{savedTokens:sy.savedTokens,tokensBefore:compactEvent.compactionEntry.tokensBefore}},isIneffectiveCompaction({tokensBefore:compactEvent.compactionEntry.tokensBefore,savedTokens:sy.savedTokens,savingsRatio:sy.savingsRatio})&&(state=incrementIneffective(state),getLogger(ctx).debug("ineffective_counted",{tokensBefore:compactEvent.compactionEntry.tokensBefore,savedTokens:sy.savedTokens,savingsRatio:sy.savingsRatio}))),resetOnSessionCompact(degradationState),restoreTodosIfMissing(pi,ctx);let usage3=ctx.getContextUsage(),settings=ctx.getCompactionSettings();(settings.restorationEnabled??!0)&&preparePendingPayload(restorationState,{accepted:!0,reason:compactEvent.reason,compactionEntryId:compactEvent.compactionEntry.id,contextWindow:usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,usageTokens:usage3?.tokens??null,reserveTokens:resolveEffectiveReserveTokens(usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings),settings,keptMessages:keptEntries.flatMap(entry=>entry.type!=="message"?[]:[entry.message])});return}compactEvent.rejectionCause!=="external-owner"&&lanePolicy.ownsCompaction(ctx,compactEvent.reason)&&(state=recordFailure(state,Date.now(),{route:compactEvent.reason}))});let onBeforeAgentStart=async(event,ctx)=>{if(event.preview===!0)return;sessionIdleSinceAgentEnd=!1,cancelIdleWarmupRetry();let message=attachRestorationDirective(restorationDirectiveState,recentCheckpoint(ctx),consumePendingPayload(restorationState)),usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings(),pendingPromptTokens=estimatePendingPromptTokens(event),usageWithPendingPrompt=usage3?withAdditionalTokens(usage3,pendingPromptTokens):void 0,laneOwnsCompaction=lanePolicy.disablesSenpiCompaction(ctx),breakerCoolingDown=isTripped(state,Date.now())||laneOwnsCompaction,{reserveTokens,thresholdTokens,leadTokens}=resolveCompactionGeometry({contextWindow,settings,lastYield:state.lastYield??void 0});!laneOwnsCompaction&&usage3&&isAtHardLimit(usage3,contextWindow,reserveTokens,pendingPromptTokens)?(getLogger(ctx).debug("hard_limit_trigger",{contextWindow,tokens:usage3.tokens??0,threshold:settings.reserveTokens}),await applyBlockingCompaction(ctx,EMERGENCY_COMPACTION_INSTRUCTIONS)):!breakerCoolingDown&&usageWithPendingPrompt&&shouldTriggerCompaction(usageWithPendingPrompt,contextWindow,settings,state.lastYield??void 0)?(getLogger(ctx).debug("threshold_trigger",{contextWindow,tokens:usageWithPendingPrompt.tokens??0,threshold:settings.reserveTokens}),shouldDeferGraceBand({tokens:usageWithPendingPrompt.tokens??0,thresholdTokens,leadTokens,contextWindow,reserveTokens,compactionInFlight:speculativeJob!==void 0&&!speculativeJob.completed,graceBandEnabled:settings.graceBandEnabled})?getLogger(ctx).debug("grace_deferred",{tokens:usageWithPendingPrompt.tokens??0,threshold:thresholdTokens}):await applyBlockingCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS)):!breakerCoolingDown&&!isOpenAiRemoteCompactionModel(ctx.model)&&usageWithPendingPrompt&&shouldStartSpeculativeCompaction(usageWithPendingPrompt,contextWindow,settings,state.lastYield??void 0,leadTokens)&&startSpeculativeCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS);let reminder=computeTokenBudgetReminder({contextTokens:usageWithPendingPrompt?.tokens??0,contextWindow,thresholdTokens,leadTokens,compactionEpoch:speculativeGeneration,state:reminderState});reminderState=reminder.nextState;let deliveredMessage=resolveBeforeAgentStartMessage({message,reminder:reminder.message,reminderEnabled:settings.reminderEnabled}),reminderSystemPrompt=resolveReminderSystemPrompt({systemPrompt:event.systemPrompt,reminder:message?void 0:reminder.message,reminderEnabled:settings.reminderEnabled});if(!(!deliveredMessage&&!reminderSystemPrompt))return{...deliveredMessage?{message:deliveredMessage}:{},...reminderSystemPrompt?{systemPrompt:reminderSystemPrompt}:{}}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("context",(event,ctx)=>{let usage3=ctx.getContextUsage(),settings=ctx.getCompactionSettings(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,laneOwnsCompaction=lanePolicy.disablesSenpiCompaction(ctx),breakerFallback=!laneOwnsCompaction&&isTripped(state,Date.now())&&usage3?.tokens!==null&&usage3!==void 0&&usage3.tokens>=contextWindow*computeEffectiveThreshold(contextWindow,state.lastYield??void 0);return breakerFallback&&getLogger(ctx).debug("breaker_deterministic_fallback",{route:"context-event",tokens:usage3.tokens??0}),{messages:buildCompactionContext({event,ctx,contextWindow,promptContextWindow:getPromptContextWindow(contextWindow,ctx.model?.maxTokens),toolAdmissionEnabled:settings.toolAdmissionEnabled!==!1,breakerFallback,laneOwnsCompaction,emergencyPruneLatch,logEmergencyPrune:fields=>getLogger(ctx).debug("emergency_prune",fields)})}}),pi.on("before_provider_request",async(event,ctx)=>{let model=event.model??ctx.model;if(!isOpenAiRemoteCompactionModel(model))return;let auth=await ctx.modelRegistry.getApiKeyAndHeaders(model);if(!auth.ok)return;let effectiveModel=auth.upstreamModelId||auth.baseUrl?{...model,...auth.upstreamModelId?{id:auth.upstreamModelId}:{},...auth.baseUrl?{baseUrl:auth.baseUrl}:{}}:model,headers=createOpenAiRemoteCompactionHeaders(effectiveModel,{...auth,headers:event.headers??auth.headers},ctx.sessionManager.getSessionId());if(!headers)return;let origin=openAiRemoteCompactionOrigin(effectiveModel,headers);return rewriteOpenAiPayloadWithRemoteCompaction(event.payload,{model:effectiveModel,branchEntries:ctx.sessionManager.getBranch(),origin},data=>pi.events.emit(SENPI_COMPACTION_EVENT,data))}),pi.on("turn_end",async(_event,ctx)=>{try{if(lanePolicy.disablesSenpiCompaction(ctx)||(handleTurnEnd(degradationState),degradationState.recoveryTriggeredThisCycle))return;state.lastYield&&state.lastYield.savedTokens<=0&&applyBlockingCompaction(ctx,RECOVERY_INSTRUCTIONS).catch(()=>{})}finally{state=resetTurnCounter(state,"")}}),pi.on("agent_end",async(event,ctx)=>{if(state=resetTurnCounter(state,""),lanePolicy.disablesSenpiCompaction(ctx))return;let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings();if(shouldRunIdleCompaction({willRetry:event.willRetry??!1,aborted:event.aborted===!0,settings,usage:usage3,contextWindow,breakerTripped:isTripped(state,Date.now()),lastYield:state.lastYield??void 0,mode:ctx.mode}))getLogger(ctx).debug("idle_trigger",{contextWindow,tokens:usage3?.tokens??0}),idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!0,startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx);else{if(isOpenAiRemoteCompactionModel(ctx.model))return;let warmAction=resolveIdleWarmAction({willRetry:event.willRetry??!1,aborted:event.aborted===!0,settings,usage:usage3,contextWindow,breakerTripped:isTripped(state,Date.now()),lastYield:state.lastYield??void 0,mode:ctx.mode},speculativeJob);warmAction==="replace"&&invalidateSpeculativeCompaction(ctx),warmAction!=="none"&&(idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!0,startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx))}}),pi.on("message_end",async(event,ctx)=>{for(let entry of collectCompactBoundaryEntries(event.message))pi.appendEntry(ANTHROPIC_SUBSCRIPTION_COMPACT_ENTRY_TYPE,entry);isAbortedAssistantMessage(event)&&invalidateSpeculativeCompaction(ctx),isMonitorableMessageEvent(event)&&!lanePolicy.disablesSenpiCompaction(ctx)&&await handleMessageEnd(degradationState,event,{applyCompaction:async options=>await applyBlockingCompaction(ctx,options.customInstructions),notify:message=>ctx.ui.notify(message,"warning")})}),pi.on("tool_call",event=>{trackToolCall(restorationState,event)}),pi.on("session_shutdown",()=>{sessionIdleSinceAgentEnd=!1,cancelIdleWarmupRetry(),idleWarmupAttempt=0,speculativeJob?.controller.abort(),speculativeJob=void 0})}var SIDE_QUERY_INSTRUCTION=["The user is asking a side question about the conversation so far, outside the main task.","Answer it directly and concisely from the context above.","Do not continue any task, do not modify anything, and do not treat this as new work."].join(" "),DEFAULT_ESTABLISHMENT_TIMEOUT_MS=3e4;function estimateMessagesTokens(messages){return messages.reduce((total,message)=>total+estimateTokens2(message),0)}function estimateSystemPromptTokens(systemPrompt){return estimateTokens2({role:"user",content:systemPrompt,timestamp:0})}function boundSideQueryMessages(messages,systemPrompt,promptContextWindow){if(typeof promptContextWindow!="number"||!Number.isFinite(promptContextWindow)||promptContextWindow<=0)return messages;let messageBudget=promptContextWindow-estimateSystemPromptTokens(systemPrompt),question=messages.at(-1);if(question===void 0||messageBudget<estimateMessagesTokens([question]))throw new Error("/btw question does not fit this model's context window; shorten it or run /compact first.");if(estimateMessagesTokens(messages)<=messageBudget)return messages;let reduced=convertToLlm(reduceContextMessages(messages,BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages),repaired=repairOrphanedToolResults(reduced),pruned=convertToLlm(pruneOldMessagesToBudget(repaired,messageBudget)),bounded=repairOrphanedToolResults(pruned);if(estimateMessagesTokens(bounded)>messageBudget)throw new Error("/btw context is too large for this model; run /compact first.");return bounded}function getSideQueryPromptContextWindow(model){return getPromptContextWindow(model.contextWindow,model.maxTokens)}function buildSideQueryContext(input){let systemPrompt=`${input.systemPrompt}
1026
+ `)}function sanitizeTodoText(text2){return stripAnsi(text2).replace(/[\r\n]+/g," ").replace(/[\u0000-\u001F\u007F-\u009F]/g," ").replace(/\s+/g," ").trim()}function isTerminalTodoStatus(status){return status==="completed"||status==="abandoned"||status==="cancelled"}function isIncompleteTodo(todo){return!isTerminalTodoStatus(todo.status)}function getTodoMarker(status){return status==="completed"?"[\u2713]":status==="in_progress"?"[\u2022]":status==="abandoned"||status==="cancelled"?"[\xD7]":"[ ]"}var TODO_STATE_ENTRY_TYPE="senpi.todo-state",TODO_RESTORE_REQUEST_TYPE="compaction.todo-restore-request",DEFAULT_INIT_PHASE="Tasks";function isRecord18(value2){return typeof value2=="object"&&value2!==null}function isTodoStatus(value2){return value2==="pending"||value2==="in_progress"||value2==="completed"||value2==="abandoned"}function parseTodoStatus(value2){return value2==="cancelled"?"abandoned":isTodoStatus(value2)?value2:void 0}function parseTodoItem(value2,options){if(!isRecord18(value2)||typeof value2.content!="string")return;let status=parseTodoStatus(value2.status)??(options?.lenient?"pending":void 0);return status?{content:value2.content,status}:void 0}function parseTodoPhase(value2){if(!isRecord18(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks))return;let tasks=[];for(let task of value2.tasks){let parsed=parseTodoItem(task);if(!parsed)return;tasks.push(parsed)}return{name:value2.name,tasks}}function parsePhases(value2){if(!Array.isArray(value2))return;let phases=[];for(let phase of value2){let parsed=parseTodoPhase(phase);if(!parsed)return;phases.push(parsed)}return phases}function parseLegacyTodos(value2){if(!Array.isArray(value2))return;let tasks=[];for(let todo of value2){let parsed=parseTodoItem(todo,{lenient:!0});if(!parsed)return;tasks.push(parsed)}return[{name:DEFAULT_INIT_PHASE,tasks}]}function isTodoAsk(value2){return isRecord18(value2)&&typeof value2.entryId=="string"&&typeof value2.text=="string"&&typeof value2.capturedAt=="number"}function readTodoPayload(value2){if(!isRecord18(value2))return;let phases=value2.schema==="v2"||Array.isArray(value2.phases)?parsePhases(value2.phases):Array.isArray(value2.todos)?parseLegacyTodos(value2.todos):void 0;if(phases)return{phases,ask:isTodoAsk(value2.ask)?{...value2.ask}:void 0}}function cloneTask(task){return{content:task.content,status:task.status}}function clonePhases(phases){return phases.map(phase=>({name:phase.name,tasks:phase.tasks.map(cloneTask)}))}function isTodoItem(value2){return!isRecord18(value2)||typeof value2.content!="string"?!1:isTodoStatus(value2.status)}function isTodoPhase(value2){return!isRecord18(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks)?!1:value2.tasks.every(isTodoItem)}function isTodoPhaseArray(value2){return Array.isArray(value2)&&value2.every(isTodoPhase)}function getLatestTodoStateFromBranchEntries(entries){let state={phases:[],ask:void 0};for(let entry of entries){if(entry.type==="custom"&&entry.customType===TODO_STATE_ENTRY_TYPE){let parsed2=readTodoPayload(entry.data);parsed2&&(state={phases:clonePhases(parsed2.phases),ask:parsed2.ask});continue}if(entry.type!=="message"||!isRecord18(entry.message)||entry.message.role!=="toolResult"||entry.message.toolName!=="todo"&&entry.message.toolName!=="todowrite")continue;let parsed=readTodoPayload(entry.message.details);parsed&&(state={phases:clonePhases(parsed.phases),ask:parsed.ask})}return state}function getLatestPhasesFromBranchEntries(entries){return getLatestTodoStateFromBranchEntries(entries).phases}var ASK_TEXT_LIMIT=200;function firstTextBlock(content){if(typeof content=="string")return content;if(Array.isArray(content)){for(let block of content)if(typeof block=="object"&&block!==null&&block.type==="text"&&typeof block.text=="string")return block.text}}function truncateAskText(text2){let codePoints=Array.from(text2);return codePoints.length<=ASK_TEXT_LIMIT?text2:`${codePoints.slice(0,ASK_TEXT_LIMIT).join("")}\u2026 (+${codePoints.length-ASK_TEXT_LIMIT} chars)`}function captureListAsk(entries,capturedAt){let lastStateIndex=-1,restore,requests=[];entries.forEach((entry,index)=>{if(entry.type==="custom"&&entry.customType===TODO_STATE_ENTRY_TYPE){lastStateIndex=index;return}if(entry.type==="custom_message"&&entry.customType===TODO_RESTORE_REQUEST_TYPE){let ask=entry.details?.ask;isTodoAsk(ask)&&(restore={index,ask});return}if(entry.type!=="message"||entry.message.role!=="user")return;let raw=firstTextBlock(entry.message.content);if(raw===void 0||parseAskUserAnswerFrame(raw))return;let text2=sanitizeTodoText(raw);text2&&requests.push({index,entryId:entry.id,text:text2})});let latest=requests.at(-1);if(restore&&restore.index>lastStateIndex&&restore.index>(latest?.index??-1))return{...restore.ask};let chosen=lastStateIndex===-1?requests[0]:latest;return chosen?{entryId:chosen.entryId,text:truncateAskText(chosen.text),capturedAt}:void 0}function normalized(text2){return sanitizeTodoText(text2).toLowerCase()}function diceCoefficient(left,right){if(left===right)return 1;if(left.length<2||right.length<2)return 0;let pairs=new Map;for(let index=0;index<left.length-1;index+=1){let pair=left.slice(index,index+2);pairs.set(pair,(pairs.get(pair)??0)+1)}let overlap=0;for(let index=0;index<right.length-1;index+=1){let pair=right.slice(index,index+2),count=pairs.get(pair)??0;count>0&&(overlap+=1,pairs.set(pair,count-1))}return 2*overlap/(left.length+right.length-2)}function suggestionFor(candidates,query,contentOf){let normalizedQuery=normalized(query);if(!normalizedQuery)return;let suggestion,bestScore=0;for(let candidate of candidates){let content=contentOf(candidate),normalizedContent=normalized(content);if(!normalizedContent)continue;let score3=normalizedContent.includes(normalizedQuery)||normalizedQuery.includes(normalizedContent)?1:diceCoefficient(normalizedContent,normalizedQuery);score3>=.5&&score3>bestScore&&(bestScore=score3,suggestion=content)}return suggestion}function fuzzyResolveTask(phases,query){let candidates=phases.flatMap(phase=>phase.tasks.map(task=>({task,phase}))),exactMatches=candidates.filter(({task})=>task.content===query);if(exactMatches.length===1)return{hit:exactMatches[0],corrected:!1};let normalizedQuery=normalized(query),normalizedMatches=candidates.filter(({task})=>normalized(task.content)===normalizedQuery);if(normalizedMatches.length===1)return{hit:normalizedMatches[0],corrected:!0};let suggestion=suggestionFor(candidates,query,({task})=>task.content);return suggestion?{corrected:!1,suggestion}:{corrected:!1}}function fuzzyResolvePhase(phases,name){let exactMatches=phases.filter(phase=>phase.name===name);if(exactMatches.length===1)return{hit:exactMatches[0],corrected:!1};let normalizedName=normalized(name),normalizedMatches=phases.filter(phase=>normalized(phase.name)===normalizedName);if(normalizedMatches.length===1)return{hit:normalizedMatches[0],corrected:!0};let suggestion=suggestionFor(phases,name,phase=>phase.name);return suggestion?{corrected:!1,suggestion}:{corrected:!1}}function resolveTaskOrError(phases,content,errors,corrections){if(!content){errors.push("Missing task content");return}if(!corrections){let hit=findTaskByContent(phases,content);if(!hit)if(/^task-\d+$/.test(content))errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs \u2014 pass the task's full text from the previous result.`);else{let hint2=phases.reduce((sum,phase)=>sum+phase.tasks.length,0)===0?" (todo list is empty \u2014 was it replaced or not yet created?)":"";errors.push(`Task "${content}" not found${hint2}`)}return hit}let resolution=fuzzyResolveTask(phases,content);if(resolution.hit)return resolution.corrected&&corrections.push(`[auto-matched] task "${content}" -> "${resolution.hit.task.content}" \u2014 pass the exact text from the previous todo result next time`),resolution.hit;let exactMatches=phases.flatMap(phase=>phase.tasks.filter(task=>task.content===content).map(task=>({task,phase})));if(exactMatches.length>1){let phaseNames=[...new Set(exactMatches.map(match=>match.phase.name))].map(name=>`"${name}"`);errors.push(`Task "${content}" is ambiguous: duplicate task text exists in phases ${phaseNames.join(", ")}. Use /todo edit to make the task text unique.`);return}if(/^task-\d+$/.test(content)){errors.push(`Task "${content}" not found. Tasks are referenced by content, not by IDs \u2014 pass the task's full text from the previous result.`);return}let hint=phases.reduce((sum,phase)=>sum+phase.tasks.length,0)===0?" (todo list is empty \u2014 was it replaced or not yet created?)":"",suggestion=resolution.suggestion?` Did you mean "${resolution.suggestion}"?`:"";errors.push(`Task "${content}" not found${hint}${suggestion}`)}function resolvePhaseOrError(phases,name,errors,corrections){if(!name){errors.push("Missing phase name");return}if(!corrections){let phase=findPhaseByName(phases,name);return phase||errors.push(`Phase "${name}" not found`),phase}let resolution=fuzzyResolvePhase(phases,name);if(resolution.hit)return resolution.corrected&&corrections.push(`[auto-matched] phase "${name}" -> "${resolution.hit.name}" \u2014 pass the exact text from the previous todo result next time`),resolution.hit;if(phases.filter(phase=>phase.name===name).length>1){errors.push(`Phase "${name}" is ambiguous: duplicate phase names exist. Use /todo edit to make the phase name unique.`);return}let suggestion=resolution.suggestion?` Did you mean "${resolution.suggestion}"?`:"";errors.push(`Phase "${name}" not found${suggestion}`)}function getTaskTargets(phases,entry,errors,corrections){if(entry.task){let hit=resolveTaskOrError(phases,entry.task,errors,corrections);return hit?[hit.task]:[]}if(entry.phase){let phase=resolvePhaseOrError(phases,entry.phase,errors,corrections);return phase?[...phase.tasks]:[]}return phases.flatMap(phase=>phase.tasks)}function initPhases(entry,errors,corrections){let list4=entry.list??(entry.items&&entry.items.length>0?[{phase:entry.phase??DEFAULT_INIT_PHASE,items:entry.items}]:void 0);if(!list4)return errors.push("Missing list for init operation"),[];let phases=[],phasesByName=new Map,seenTasks=new Set;for(let listEntry of list4){listEntry.items.length===0&&errors.push(`Phase "${listEntry.phase}" has no tasks in init list`);let phase=phasesByName.get(listEntry.phase);phase?corrections?.push(`[auto-corrected] merged duplicate phase "${listEntry.phase}" in init list`):(phase={name:listEntry.phase,tasks:[]},phasesByName.set(listEntry.phase,phase),phases.push(phase));for(let content of listEntry.items){if(seenTasks.has(content)){corrections?.push(`[auto-corrected] kept first duplicate task "${content}" in init list`);continue}seenTasks.add(content),phase.tasks.push({content,status:"pending"})}}return phases}function appendItems(phases,entry,errors,corrections){if(!entry.items||entry.items.length===0)return errors.push("Missing items for append operation"),phases;let seen=new Set,hasDuplicate=!1;for(let content of entry.items)(seen.has(content)||findTaskByContent(phases,content))&&(errors.push(`Task "${content}" already exists`),hasDuplicate=!0),seen.add(content);if(hasDuplicate)return phases;let phaseName=entry.phase;if(!phaseName){let activeTask=nextActionableTask(phases);phaseName=(activeTask?phases.find(phase2=>phase2.tasks.includes(activeTask)):void 0)?.name??phases[phases.length-1]?.name??DEFAULT_INIT_PHASE,corrections?.push(`[auto-corrected] append had no phase; used "${phaseName}"`)}let phase=findPhaseByName(phases,phaseName);phase||(phase={name:phaseName,tasks:[]},phases.push(phase));for(let content of entry.items)phase.tasks.push({content,status:"pending"});return phases}function removeTasks(phases,entry,errors,corrections){if(entry.task){let hit=resolveTaskOrError(phases,entry.task,errors,corrections);return hit&&(hit.phase.tasks=hit.phase.tasks.filter(candidate=>candidate!==hit.task)),phases}if(entry.phase){let phase=resolvePhaseOrError(phases,entry.phase,errors,corrections);return phase&&(phase.tasks=[]),phases}for(let phase of phases)phase.tasks=[];return phases}function applyEntry(phases,entry,errors,corrections){switch(entry.op){case"init":return initPhases(entry,errors,corrections);case"start":{let hit=resolveTaskOrError(phases,entry.task,errors,corrections);if(!hit)return phases;for(let phase of phases)for(let candidate of phase.tasks)candidate.status==="in_progress"&&candidate!==hit.task&&(candidate.status="pending");return hit.task.status="in_progress",phases}case"done":for(let task of getTaskTargets(phases,entry,errors,corrections))task.status="completed";return phases;case"drop":for(let task of getTaskTargets(phases,entry,errors,corrections))task.status="abandoned";return phases;case"rm":return removeTasks(phases,entry,errors,corrections);case"append":return appendItems(phases,entry,errors,corrections);case"view":return phases}}function applyParams(phases,params,corrections){if(params.op==="view")return{phases,errors:[]};let original=clonePhases(phases),errors=[],next=applyEntry(phases,params,errors,corrections);return errors.length>0?{phases:original,errors}:(normalizeInProgressTask(next),{phases:next,errors})}function applyOpsToPhases(currentPhases,ops){let errors=[],next=clonePhases(currentPhases);for(let op of ops)next=applyEntry(next,op,errors);return errors.length>0?{phases:clonePhases(currentPhases),errors}:(normalizeInProgressTask(next),{phases:next,errors})}var TODO_WIDGET_MAX_LINES=10,TODO_WIDGET_HEADER_LINES=2,TODO_WIDGET_RECENT_TASKS=2;function getActivePhase(phases){let activeTask=nextActionableTask(phases);if(activeTask)return phases.find(phase=>phase.tasks.includes(activeTask))}function formatOmittedTasks(count,direction){return`... (${count} ${direction} task${count===1?"":"s"})`}function label(text2){return{kind:"label",text:text2}}function taskRow(task){return{kind:"task",task}}function getTodoWidgetModel(phases){let activePhase=getActivePhase(phases);if(!activePhase)return;let header2=[label("Todo"),label(sanitizeTodoText(activePhase.name))],taskRows=activePhase.tasks.map(taskRow);if(header2.length+taskRows.length<=TODO_WIDGET_MAX_LINES)return{phaseName:activePhase.name,rows:[...header2,...taskRows]};let activeTask=nextActionableTask([activePhase]);if(!activeTask)return;let activeIndex=activePhase.tasks.indexOf(activeTask),firstVisibleTask=Math.max(0,activeIndex-TODO_WIDGET_RECENT_TASKS),earlierOmitted=firstVisibleTask,bodyBudget=TODO_WIDGET_MAX_LINES-TODO_WIDGET_HEADER_LINES,recentAndActive=activePhase.tasks.slice(firstVisibleTask,activeIndex+1).map(taskRow),earlierMarkerRows=earlierOmitted>0?1:0,pendingAfterActive=activePhase.tasks.slice(activeIndex+1).filter(todo=>todo.status==="pending"),upcomingBudget=bodyBudget-recentAndActive.length-earlierMarkerRows,visibleUpcomingCount=pendingAfterActive.length>upcomingBudget?Math.max(0,upcomingBudget-1):pendingAfterActive.length,laterOmitted=pendingAfterActive.length-visibleUpcomingCount;return{phaseName:activePhase.name,rows:[...header2,...earlierOmitted>0?[label(formatOmittedTasks(earlierOmitted,"earlier"))]:[],...recentAndActive,...pendingAfterActive.slice(0,visibleUpcomingCount).map(taskRow),...laterOmitted>0?[label(formatOmittedTasks(laterOmitted,"later"))]:[]]}}var TODO_SNAPSHOT_CUSTOM_TYPE="compaction.todo-snapshot",TODO_SNAPSHOT_SCHEMA="senpi.compaction.todo-snapshot.v1",TODO_STATE_ENTRY_TYPE2="senpi.todo-state";function isRecord19(value2){return typeof value2=="object"&&value2!==null}function isTodoStatus2(value2){return value2===void 0||typeof value2=="string"}function isTodoEntry(value2){if(!isRecord19(value2))return!1;let hasId=typeof value2.id=="string",hasContent=typeof value2.content=="string"||typeof value2.text=="string";return(hasId||hasContent)&&isTodoStatus2(value2.status)}function isTodoPhase2(value2){return!isRecord19(value2)||typeof value2.name!="string"||!Array.isArray(value2.tasks)?!1:value2.tasks.every(isTodoEntry)}function isCustomTodoEntry(entry){return entry.type==="custom"&&(entry.customType.startsWith("todowrite")||entry.customType===TODO_STATE_ENTRY_TYPE2)}function isLegacyTodoListEntry(entry){return entry.type==="custom"&&entry.customType==="todo-list"}function readTodosFromEntry(entry){let data=entry.data;return isRecord19(data)?Array.isArray(data.todos)?data.todos.filter(isTodoEntry):Array.isArray(data.phases)?data.phases.filter(isTodoPhase2).flatMap(phase=>phase.tasks):[]:[]}function isCustomEntryEnvelope(value2){return isRecord19(value2)&&value2.type==="custom"&&typeof value2.id=="string"&&(value2.parentId===null||typeof value2.parentId=="string")&&typeof value2.timestamp=="string"&&typeof value2.customType=="string"}function normalizeLegacySnapshotEntries(entries){for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(!(!isLegacyTodoListEntry(entry)&&!isCustomTodoEntry(entry)))return entry.customType===TODO_STATE_ENTRY_TYPE2?getLatestPhasesFromBranchEntries(entries.slice(0,index+1)):readTodosFromEntry(entry)}return[]}function normalizeSnapshotItems(value2){return Array.isArray(value2)?value2.every(isTodoPhase2)?value2:value2.every(isCustomEntryEnvelope)?normalizeLegacySnapshotEntries(value2):value2.every(isTodoEntry)?value2:null:null}function getCurrentTodoPhases(ctx){return getLatestPhasesFromBranchEntries(ctx.sessionManager.getBranch())}function findLatestTodoSnapshot(ctx){let entries=ctx.sessionManager.getBranch();for(let index=entries.length-1;index>=0;index-=1){let entry=entries[index];if(entry.type!=="custom"||entry.customType!==TODO_SNAPSHOT_CUSTOM_TYPE)continue;let data=entry.data;if(!isRecord19(data)||data.schema!==TODO_SNAPSHOT_SCHEMA)continue;let todos=normalizeSnapshotItems(data.todos);if(todos)return{schema:TODO_SNAPSHOT_SCHEMA,todos,capturedAt:typeof data.capturedAt=="number"?data.capturedAt:0,...isTodoAsk(data.ask)?{ask:data.ask}:{}}}return null}function createTodoSnapshot(ctx){let{phases,ask}=getLatestTodoStateFromBranchEntries(ctx.sessionManager.getBranch());return{schema:TODO_SNAPSHOT_SCHEMA,todos:phases,capturedAt:Date.now(),...ask?{ask}:{}}}function persistTodoSnapshot(pi,snapshot){pi.appendEntry(TODO_SNAPSHOT_CUSTOM_TYPE,snapshot)}function restoreTodosIfMissing(piOrSnapshot,ctxOrCurrentTodos,_pi){if(Array.isArray(piOrSnapshot)&&Array.isArray(ctxOrCurrentTodos))return ctxOrCurrentTodos.length>0?{applied:!1,restoredTodos:ctxOrCurrentTodos}:{applied:piOrSnapshot.length>0,restoredTodos:piOrSnapshot};let pi=piOrSnapshot,ctx=ctxOrCurrentTodos;if(getCurrentTodoPhases(ctx).length>0)return;let snapshot=findLatestTodoSnapshot(ctx);!snapshot||snapshot.todos.length===0||pi.sendMessage({customType:TODO_RESTORE_REQUEST_TYPE,content:`Restore missing todo tasks from snapshot: ${JSON.stringify(snapshot.todos)}`,display:!1,details:snapshot},{triggerTurn:!0,deliverAs:"nextTurn"})}function createInitialReminderState(){return{lastFiredEpoch:null}}function formatReminderMessage(remaining){return`[context budget] Approximately ${remaining} tokens remain before automatic compaction. Wrap up verbose exploration, prefer concise summaries over full dumps, and front-load conclusions.`}function clearTokenBudgetReminderLease(state){return state.lease?{lastFiredEpoch:state.lastFiredEpoch}:state}function computeTokenBudgetReminder(input){let remaining=input.thresholdTokens-input.contextTokens;if(!(remaining>0&&remaining<=2*input.leadTokens)||input.state.lastFiredEpoch===input.compactionEpoch)return{nextState:clearTokenBudgetReminderLease(input.state)};let message=formatReminderMessage(remaining);return{message,nextState:{lastFiredEpoch:input.compactionEpoch,lease:{compactionEpoch:input.compactionEpoch,message}}}}function isTransientSummarizationFailure(error2,message){return error2 instanceof StreamDurationBudgetError||error2 instanceof StreamIdleTimeoutError2||error2 instanceof SummarizationTotalBudgetError?!0:error2 instanceof SummaryRequestError?error2.transient:error2 instanceof SummarizationOverflowExhaustedError?!0:isRetryableErrorMessage(message)}var DEFAULT_CONTEXT_WINDOW2=2e5,EMERGENCY_COMPACTION_INSTRUCTIONS="EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.",PROACTIVE_COMPACTION_INSTRUCTIONS="Proactively compact before the next agent turn.",MAX_PENDING_METADATA=8;function compactionExtension(pi,remoteCompactionDependencies={}){let state=createInitialState(),lanePolicy=createCompactionLanePolicy(),restorationDirectiveState=createRestorationDirectiveState(),emergencyPruneLatch=createEmergencyPruneLatch(),degradationState=createDegradationMonitorState(),restorationState=state.restoration??createRestorationTrackerState();state={...state,restoration:restorationState};let speculativeGeneration=0,reminderState=createInitialReminderState(),speculativeJob,pendingMetadata=new Map,logger,getLogger=ctx=>logger??=createCompactionLogger(ctx.agentDir);function getSummarizationTools(){if(typeof pi.getAllTools!="function"||typeof pi.getActiveTools!="function")return[];try{let definitionsByName=new Map(pi.getAllTools().map(tool=>[tool.name,tool]));return pi.getActiveTools().flatMap(name=>{let tool=definitionsByName.get(name);return tool?[{name:tool.name,description:tool.description,parameters:tool.parameters}]:[]})}catch{return[]}}let idleWarmupTimer,idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!1;function cancelIdleWarmupRetry(){idleWarmupTimer!==void 0&&(clearTimeout(idleWarmupTimer),idleWarmupTimer=void 0)}function isContextRetired(ctx){try{return ctx.isIdle(),!1}catch{return!0}}function armIdleWarmupRetry(ctx){let job=speculativeJob;job&&job.failure.then(failure2=>{if(failure2===void 0){idleWarmupAttempt=0;return}if(speculativeJob!==job)return;if(isContextRetired(ctx)){cancelIdleWarmupRetry();return}let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings(),breakerTripped=isTripped(state,Date.now()),retryDecision={attempt:idleWarmupAttempt,transient:isTransientSummarizationFailure(failure2,failure2.message),isIdle:ctx.isIdle(),breakerTripped,stillWarmEligible:shouldWarmAtIdle({willRetry:!1,aborted:!1,settings,usage:usage3,contextWindow,breakerTripped,lastYield:state.lastYield??void 0,mode:ctx.mode})};shouldRetryIdleWarmup(retryDecision)&&(cancelIdleWarmupRetry(),idleWarmupTimer=setTimeout(()=>{idleWarmupTimer=void 0,speculativeJob===job&&(isContextRetired(ctx)||ctx.isIdle()&&(idleWarmupAttempt+=1,getLogger(ctx).debug("idle_trigger",{contextWindow,tokens:usage3?.tokens??0,count:idleWarmupAttempt}),invalidateSpeculativeCompaction(ctx),startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx)))},15e3))})}function armIdleApply(ctx){let job=speculativeJob;job&&job.promise.then(async compaction=>{if(!compaction||speculativeJob!==job||!sessionIdleSinceAgentEnd||isContextRetired(ctx)||!ctx.isIdle()||lanePolicy.disablesSenpiCompaction(ctx)||isTripped(state,Date.now())||shouldRejectByCap(state).cancel)return;let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2;!usage3||!shouldTriggerCompaction(usage3,contextWindow,ctx.getCompactionSettings(),state.lastYield??void 0)||!(await applyGeneratedCompaction(ctx,job.snapshot,()=>speculativeGeneration,compaction)).applied||(speculativeJob===job&&(speculativeJob=void 0),cancelIdleWarmupRetry(),getLogger(ctx).debug("idle_applied",{generation:job.generation,origin:"speculative"}))}).catch(()=>{})}function isSameModelIdentity(left,right){return right!==void 0&&left.api===right.api&&left.provider===right.provider&&left.id===right.id&&left.baseUrl===right.baseUrl&&left.contextWindow===right.contextWindow}function claimWarmSummaryForCoreRoute(event,ctx){let job=speculativeJob;if(!job||event.customInstructions!==void 0||job.snapshot.origin!=="speculative"||job.snapshot.preparation.firstKeptEntryId!==event.preparation.firstKeptEntryId||!isSameModelIdentity(job.snapshot.model,ctx.model))return;let anchor=createWarmAnchorSnapshot(job.snapshot.preparation.firstKeptEntryId,job.snapshot.branchEntries??[]);if(!(!anchor||!isWarmSummaryAnchorValid(anchor,event.branchEntries??ctx.sessionManager.getBranch())))return speculativeJob=void 0,job}function invalidateSpeculativeCompaction(ctx){let previousGeneration=speculativeGeneration;speculativeGeneration++,getLogger(ctx).debug("speculative_invalidated",{generation:previousGeneration}),speculativeJob?.controller.abort(),speculativeJob=void 0}function startSpeculativeCompaction(ctx,customInstructions){if(speculativeJob)return;let generation2=++speculativeGeneration,snapshot=createSpeculativeCompactionSnapshot(ctx,{generation:generation2,customInstructions,origin:"speculative",tools:getSummarizationTools()});if(!snapshot)return;getLogger(ctx).debug("speculative_started",{generation:generation2,origin:"speculative"});let controller=new AbortController,settled=runExtensionCompaction(ctx,snapshot,controller.signal).then(result3=>({result:result3,error:void 0}),error2=>({result:void 0,error:error2 instanceof Error?error2:new Error(String(error2))}));speculativeJob=trackSpeculativeJob({generation:generation2,snapshot,controller,settled,armedAtTokens:ctx.getContextUsage()?.tokens??0}),settled.then(()=>remoteCompactionDependencies.onSpeculativeJobSettled?.())}function capturePendingMetadata(requestId,ctx){for(pendingMetadata.set(requestId,{checkpoint:captureAgentCheckpoint(pi,ctx),todoSnapshot:createTodoSnapshot(ctx)});pendingMetadata.size>MAX_PENDING_METADATA;){let oldestRequestId=pendingMetadata.keys().next().value;if(oldestRequestId===void 0)break;pendingMetadata.delete(oldestRequestId)}}function persistAcceptedMetadata(requestId){let metadata=pendingMetadata.get(requestId);metadata&&(pendingMetadata.delete(requestId),persistCheckpoint(pi,metadata.checkpoint),persistTodoSnapshot(pi,metadata.todoSnapshot))}function recoverRequiredCompaction(ctx,snapshot,failureKind,cause){let diagnostics={},compaction=createRequiredCompactionFallback(snapshot.preparation,snapshot.contextWindow,failureKind,{taskIntent:resolveInheritedTaskIntent(snapshot.branchEntries??[])},snapshot.branchEntries,diagnostics);return compaction?(ctx.ui.notify(formatRequiredCompactionFallbackNotice(failureKind,cause),"warning"),{compaction}):{rejectionReason:formatRequiredCompactionFallbackRejection(diagnostics)}}async function applyBlockingCompaction(ctx,customInstructions){let provider=ctx.model?.provider;if((provider==="cursor"||provider==="cursor-cli-oauth")&&!ctx.isIdle())return getLogger(ctx).debug("skip_cursor_mid_turn",{route:"blocking"}),{applied:!1,reason:"rejected"};if(isTripped(state,Date.now()))return getLogger(ctx).debug("skip_breaker",{route:"blocking"}),{applied:!1,reason:"rejected"};if(shouldRejectByCap(state).cancel)return getLogger(ctx).debug("skip_cap",{route:"blocking"}),{applied:!1,reason:"rejected"};let feedbackSignal=ctx.beginCompaction?.({reason:"extension"});try{let remoteFallbackReason;if(isOpenAiRemoteCompactionModel(ctx.model)){let remoteGeneration=speculativeGeneration+1,remoteSnapshot=createSpeculativeCompactionSnapshot(ctx,{generation:remoteGeneration,customInstructions,origin:"blocking"});if(getLogger(ctx).debug("blocking_started",{generation:remoteGeneration,origin:"blocking"}),remoteSnapshot){let remoteSignal=feedbackSignal??new AbortController().signal,remoteCompaction=await runOpenAiRemoteCompaction(ctx,createBlockingRemoteCompactionEvent(ctx,remoteSnapshot,customInstructions,remoteSignal),data=>{data?.action==="remote_fallback"&&typeof data.reason=="string"&&(remoteFallbackReason=data.reason),reportRemoteCompactionTimeout(ctx,"extension",feedbackSignal,data),pi.events.emit(SENPI_COMPACTION_EVENT,data)},remoteCompactionDependencies);if(remoteCompaction){if(speculativeGeneration!==remoteGeneration-1){let result5={applied:!1,reason:"stale"};return getLogger(ctx).debug("speculative_stale",{generation:remoteGeneration}),endCompactionFeedback(ctx,feedbackSignal,result5),result5}speculativeGeneration=remoteGeneration,speculativeJob?.controller.abort(),speculativeJob=void 0;let result4=await applyGeneratedCompaction(ctx,remoteSnapshot,()=>speculativeGeneration,remoteCompaction,feedbackSignal);return getLogger(ctx).debug("speculative_applied",{generation:remoteGeneration,origin:"blocking"}),endCompactionFeedback(ctx,feedbackSignal,result4),result4}}}let pendingJob=speculativeJob;if(pendingJob){let unlinkAbort=linkAbortSignal(feedbackSignal,pendingJob.controller),compaction2,inheritedFailure;try{compaction2=await pendingJob.promise,inheritedFailure=await pendingJob.failure,compaction2&&getLogger(ctx).debug("warm_consumed",{generation:pendingJob.generation,route:"speculative"})}finally{unlinkAbort()}if(inheritedFailure!==void 0){speculativeJob=void 0;let failureKind=classifyRequiredCompactionFallbackFailure(inheritedFailure);if(failureKind!==void 0&&!feedbackSignal?.aborted&&pendingJob.snapshot.generation===speculativeGeneration&&pendingJob.snapshot.expectedRevision===ctx.getMessageRevision()){let recovery=recoverRequiredCompaction(ctx,pendingJob.snapshot,failureKind,inheritedFailure);if(compaction2=recovery.compaction,!compaction2){let result5={applied:!1,reason:"failed"};return endCompactionFeedback(ctx,feedbackSignal,result5,recovery.rejectionReason),result5}}else if(failureKind===void 0&&isTransientSummarizationFailure(inheritedFailure,inheritedFailure.message))return ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:feedbackSignal?.aborted,errorMessage:`Compaction failed: ${stripTurnRetrySuppressionPrefix(inheritedFailure.message)}`}),state=recordFailure(state,Date.now(),{route:"extension"}),{applied:!1,reason:"failed"}}let result4=await applyGeneratedCompaction(ctx,pendingJob.snapshot,()=>speculativeGeneration,compaction2,feedbackSignal);if(result4.applied)return speculativeJob=void 0,getLogger(ctx).debug("speculative_applied",{generation:pendingJob.generation,origin:"speculative"}),endCompactionFeedback(ctx,feedbackSignal,result4),result4;result4.reason==="stale"?getLogger(ctx).debug("speculative_stale",{generation:pendingJob.generation}):result4.reason==="rejected"&&(feedbackSignal=ctx.beginCompaction?.({reason:"extension"})),speculativeJob=void 0}let generation2=++speculativeGeneration,snapshot=createSpeculativeCompactionSnapshot(ctx,{generation:generation2,customInstructions,origin:"core-route",tools:getSummarizationTools()});if(!snapshot){let result4={applied:!1,reason:"unavailable"};return getLogger(ctx).debug("summary_failed",{reason:"unavailable"}),endCompactionFeedback(ctx,feedbackSignal,result4,remoteFallbackReason),result4}let compaction;try{compaction=await runExtensionCompaction(ctx,snapshot,feedbackSignal,delta=>ctx.updateCompaction?.({reason:"extension",signal:feedbackSignal,delta}))}catch(error2){let failureKind=classifyRequiredCompactionFallbackFailure(error2);if(failureKind!==void 0&&!feedbackSignal?.aborted){let recovery=recoverRequiredCompaction(ctx,snapshot,failureKind,error2);if(compaction=recovery.compaction,!compaction){let result4={applied:!1,reason:"failed"};return endCompactionFeedback(ctx,feedbackSignal,result4,recovery.rejectionReason),result4}}else{if(!(error2 instanceof SummaryGenerationError))throw error2;getLogger(ctx).debug("summary_failed",{reason:error2.kind})}}let result3=await applyGeneratedCompaction(ctx,snapshot,()=>speculativeGeneration,compaction,feedbackSignal);return endCompactionFeedback(ctx,feedbackSignal,result3,remoteFallbackReason),result3}catch(error2){if(feedbackSignal?.aborted)return getLogger(ctx).debug("blocking_aborted",{route:"blocking"}),ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:!0}),{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2);if(ctx.endCompaction?.({reason:"extension",signal:feedbackSignal,aborted:feedbackSignal?.aborted,errorMessage:`Compaction failed: ${stripTurnRetrySuppressionPrefix(message)}`}),isTransientSummarizationFailure(error2,message))return state=recordFailure(state,Date.now(),{route:"extension"}),{applied:!1,reason:"failed"};throw error2}}pi.on("session_before_compact",async(event,ctx)=>{if(event.signal.aborted)return;let claimedWarmJob=claimWarmSummaryForCoreRoute(event,ctx),warmJobConsumed=!1;invalidateSpeculativeCompaction(ctx);let claimedGeneration=speculativeGeneration;try{if(!lanePolicy.ownsCompaction(ctx,event.reason))return{cancel:!0,rejectionCause:"external-owner",reason:SDK_NATIVE_LANE_REJECTION_REASON};if(shouldRejectByCap(state).cancel)return getLogger(ctx).debug("skip_cap",{reason:event.reason,count:state.acceptedAbsolute}),{cancel:!0,rejectionCause:"per-turn-cap",reason:"absolute compaction cap reached for this session"};let now2=Date.now();if(isTripped(state,now2)&&!shouldBypass(state,{reason:event.reason})){let remainingMs2=state.trippedAt!==null?Math.max(0,state.trippedAt+6e4-now2):0;return getLogger(ctx).debug("skip_breaker",{reason:event.reason,remainingSec:Math.ceil(remainingMs2/1e3)}),{cancel:!0,rejectionCause:"circuit-breaker",reason:`compaction circuit breaker cooling down (${Math.ceil(remainingMs2/1e3)}s left)`}}capturePendingMetadata(event.requestId,ctx);let model=ctx.model;if(!model)return;let remoteCompaction;try{remoteCompaction=await runOpenAiRemoteCompaction(ctx,event,data=>{reportRemoteCompactionTimeout(ctx,event.reason,event.signal,data),pi.events.emit(SENPI_COMPACTION_EVENT,data)},remoteCompactionDependencies)}catch(error2){if(!event.signal.aborted)throw error2;getLogger(ctx).debug("remote_aborted",{route:"core-route",requestId:event.requestId});return}if(remoteCompaction)return getLogger(ctx).debug("core_route_generated",{route:"core-route",requestId:event.requestId}),{compaction:remoteCompaction};let inheritedWarmFailure;if(claimedWarmJob){let unlinkAbort=linkAbortSignal(event.signal,claimedWarmJob.controller),warmCompaction,warmFailure;try{warmCompaction=await claimedWarmJob.promise,warmFailure=await claimedWarmJob.failure}finally{unlinkAbort()}if(warmFailure===void 0&&warmCompaction&&!event.signal.aborted)return getLogger(ctx).debug("warm_consumed",{generation:claimedWarmJob.generation,route:"core-route"}),warmJobConsumed=!0,{compaction:warmCompaction};warmFailure!==void 0&&requiresDeterministicCompactionFallback(event,ctx.getContextUsage())&&classifyRequiredCompactionFallbackFailure(warmFailure)!==void 0&&!event.signal.aborted&&speculativeGeneration===claimedGeneration&&claimedWarmJob.snapshot.expectedRevision===ctx.getMessageRevision()&&(inheritedWarmFailure=warmFailure)}let snapshot={generation:++speculativeGeneration,expectedRevision:ctx.getMessageRevision(),model,contextWindow:ctx.getContextUsage()?.contextWindow??model.contextWindow??DEFAULT_CONTEXT_WINDOW2,preparation:event.preparation,branchEntries:event.branchEntries,promptVariant:getPromptVariant(event),origin:"core-route",customInstructions:event.customInstructions,systemPrompt:ctx.getSystemPrompt(),tools:getSummarizationTools()},compaction;try{if(inheritedWarmFailure)throw inheritedWarmFailure;compaction=await runExtensionCompaction(ctx,snapshot,event.signal,delta=>ctx.updateCompaction?.({reason:event.reason,signal:event.signal,delta}))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2),failureKind=classifyRequiredCompactionFallbackFailure(error2);if(requiresDeterministicCompactionFallback(event,ctx.getContextUsage())&&failureKind!==void 0&&!event.signal.aborted){let recovery=recoverRequiredCompaction(ctx,snapshot,failureKind,error2);return recovery.compaction?{compaction:recovery.compaction}:(pendingMetadata.delete(event.requestId),{cancel:!0,reason:recovery.rejectionReason})}return pendingMetadata.delete(event.requestId),error2 instanceof SummaryGenerationError?{cancel:!0,reason:stripTurnRetrySuppressionPrefix(error2.message)}:{cancel:!0,reason:`compaction generator failed: ${stripTurnRetrySuppressionPrefix(message)}`}}return compaction?{compaction}:(pendingMetadata.delete(event.requestId),event.signal.aborted?{cancel:!0}:{cancel:!0,reason:"compaction generator returned no summary"})}finally{warmJobConsumed||claimedWarmJob?.controller.abort()}}),pi.on("model_select",(event,ctx)=>handleCompactionModelSelect({event,ctx,state,speculativeSnapshot:speculativeJob?.snapshot,laneOwnsCompaction:lanePolicy.disablesSenpiCompaction(ctx),breakerTripped:isTripped(state,Date.now()),invalidate:()=>invalidateSpeculativeCompaction(ctx),start:()=>startSpeculativeCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS)})),pi.on("session_compact",async(event,ctx)=>{let compactEvent=event;if(invalidateSpeculativeCompaction(ctx),compactEvent.accepted){persistAcceptedMetadata(compactEvent.requestId);let branchEntries=ctx.sessionManager.getBranch(),firstKeptIndex=branchEntries.findIndex(entry=>entry.id===compactEvent.compactionEntry.firstKeptEntryId),keptEntries=firstKeptIndex===-1?[]:branchEntries.slice(firstKeptIndex);state=incrementAccepted(state),state=recordSuccess(state),reminderState=createInitialReminderState();let sy=compactEvent.compactionEntry.details?.structuralYield;sy&&typeof sy.savedTokens=="number"&&typeof sy.savingsRatio=="number"&&(state={...state,lastYield:{savedTokens:sy.savedTokens,tokensBefore:compactEvent.compactionEntry.tokensBefore}},isIneffectiveCompaction({tokensBefore:compactEvent.compactionEntry.tokensBefore,savedTokens:sy.savedTokens,savingsRatio:sy.savingsRatio})&&(state=incrementIneffective(state),getLogger(ctx).debug("ineffective_counted",{tokensBefore:compactEvent.compactionEntry.tokensBefore,savedTokens:sy.savedTokens,savingsRatio:sy.savingsRatio}))),resetOnSessionCompact(degradationState),restoreTodosIfMissing(pi,ctx);let usage3=ctx.getContextUsage(),settings=ctx.getCompactionSettings();(settings.restorationEnabled??!0)&&preparePendingPayload(restorationState,{accepted:!0,reason:compactEvent.reason,compactionEntryId:compactEvent.compactionEntry.id,contextWindow:usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,usageTokens:usage3?.tokens??null,reserveTokens:resolveEffectiveReserveTokens(usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings),settings,keptMessages:keptEntries.flatMap(entry=>entry.type!=="message"?[]:[entry.message])});return}compactEvent.rejectionCause!=="external-owner"&&lanePolicy.ownsCompaction(ctx,compactEvent.reason)&&(state=recordFailure(state,Date.now(),{route:compactEvent.reason}))});let onBeforeAgentStart=async(event,ctx)=>{if(event.preview===!0)return;sessionIdleSinceAgentEnd=!1,cancelIdleWarmupRetry();let message=attachRestorationDirective(restorationDirectiveState,recentCheckpoint(ctx),consumePendingPayload(restorationState)),usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings(),pendingPromptTokens=estimatePendingPromptTokens(event),usageWithPendingPrompt=usage3?withAdditionalTokens(usage3,pendingPromptTokens):void 0,laneOwnsCompaction=lanePolicy.disablesSenpiCompaction(ctx),breakerCoolingDown=isTripped(state,Date.now())||laneOwnsCompaction,{reserveTokens,thresholdTokens,leadTokens}=resolveCompactionGeometry({contextWindow,settings,lastYield:state.lastYield??void 0});!laneOwnsCompaction&&usage3&&isAtHardLimit(usage3,contextWindow,reserveTokens,pendingPromptTokens)?(getLogger(ctx).debug("hard_limit_trigger",{contextWindow,tokens:usage3.tokens??0,threshold:settings.reserveTokens}),await applyBlockingCompaction(ctx,EMERGENCY_COMPACTION_INSTRUCTIONS)):!breakerCoolingDown&&usageWithPendingPrompt&&shouldTriggerCompaction(usageWithPendingPrompt,contextWindow,settings,state.lastYield??void 0)?(getLogger(ctx).debug("threshold_trigger",{contextWindow,tokens:usageWithPendingPrompt.tokens??0,threshold:settings.reserveTokens}),shouldDeferGraceBand({tokens:usageWithPendingPrompt.tokens??0,thresholdTokens,leadTokens,contextWindow,reserveTokens,compactionInFlight:speculativeJob!==void 0&&!speculativeJob.completed,graceBandEnabled:settings.graceBandEnabled})?getLogger(ctx).debug("grace_deferred",{tokens:usageWithPendingPrompt.tokens??0,threshold:thresholdTokens}):await applyBlockingCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS)):!breakerCoolingDown&&!isOpenAiRemoteCompactionModel(ctx.model)&&usageWithPendingPrompt&&shouldStartSpeculativeCompaction(usageWithPendingPrompt,contextWindow,settings,state.lastYield??void 0,leadTokens)&&startSpeculativeCompaction(ctx,PROACTIVE_COMPACTION_INSTRUCTIONS);let reminder=computeTokenBudgetReminder({contextTokens:usageWithPendingPrompt?.tokens??0,contextWindow,thresholdTokens,leadTokens,compactionEpoch:speculativeGeneration,state:reminderState});reminderState=reminder.nextState;let deliveredMessage=resolveBeforeAgentStartMessage({message,reminder:reminder.message,reminderEnabled:settings.reminderEnabled}),reminderSystemPrompt=resolveReminderSystemPrompt({systemPrompt:event.systemPrompt,reminder:message?void 0:reminder.message,reminderEnabled:settings.reminderEnabled});if(!(!deliveredMessage&&!reminderSystemPrompt))return{...deliveredMessage?{message:deliveredMessage}:{},...reminderSystemPrompt?{systemPrompt:reminderSystemPrompt}:{}}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("context",(event,ctx)=>{let usage3=ctx.getContextUsage(),settings=ctx.getCompactionSettings(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,laneOwnsCompaction=lanePolicy.disablesSenpiCompaction(ctx),breakerFallback=!laneOwnsCompaction&&isTripped(state,Date.now())&&usage3?.tokens!==null&&usage3!==void 0&&usage3.tokens>=contextWindow*computeEffectiveThreshold(contextWindow,state.lastYield??void 0);return breakerFallback&&getLogger(ctx).debug("breaker_deterministic_fallback",{route:"context-event",tokens:usage3.tokens??0}),{messages:buildCompactionContext({event,ctx,contextWindow,promptContextWindow:getPromptContextWindow(contextWindow,ctx.model?.maxTokens),toolAdmissionEnabled:settings.toolAdmissionEnabled!==!1,breakerFallback,laneOwnsCompaction,appendOnlyTranscript:lanePolicy.hasAppendOnlyTranscript(ctx),emergencyPruneLatch,logEmergencyPrune:fields=>getLogger(ctx).debug("emergency_prune",fields)})}}),pi.on("before_provider_request",async(event,ctx)=>{let model=event.model??ctx.model;if(!isOpenAiRemoteCompactionModel(model))return;let auth=await ctx.modelRegistry.getApiKeyAndHeaders(model);if(!auth.ok)return;let effectiveModel=auth.upstreamModelId||auth.baseUrl?{...model,...auth.upstreamModelId?{id:auth.upstreamModelId}:{},...auth.baseUrl?{baseUrl:auth.baseUrl}:{}}:model,headers=createOpenAiRemoteCompactionHeaders(effectiveModel,{...auth,headers:event.headers??auth.headers},ctx.sessionManager.getSessionId());if(!headers)return;let origin=openAiRemoteCompactionOrigin(effectiveModel,headers);return rewriteOpenAiPayloadWithRemoteCompaction(event.payload,{model:effectiveModel,branchEntries:ctx.sessionManager.getBranch(),origin},data=>pi.events.emit(SENPI_COMPACTION_EVENT,data))}),pi.on("turn_end",async(_event,ctx)=>{try{if(lanePolicy.disablesSenpiCompaction(ctx)||(handleTurnEnd(degradationState),degradationState.recoveryTriggeredThisCycle))return;state.lastYield&&state.lastYield.savedTokens<=0&&applyBlockingCompaction(ctx,RECOVERY_INSTRUCTIONS).catch(()=>{})}finally{state=resetTurnCounter(state,"")}}),pi.on("agent_end",async(event,ctx)=>{if(state=resetTurnCounter(state,""),lanePolicy.disablesSenpiCompaction(ctx))return;let usage3=ctx.getContextUsage(),contextWindow=usage3?.contextWindow??ctx.model?.contextWindow??DEFAULT_CONTEXT_WINDOW2,settings=ctx.getCompactionSettings();if(shouldRunIdleCompaction({willRetry:event.willRetry??!1,aborted:event.aborted===!0,settings,usage:usage3,contextWindow,breakerTripped:isTripped(state,Date.now()),lastYield:state.lastYield??void 0,mode:ctx.mode}))getLogger(ctx).debug("idle_trigger",{contextWindow,tokens:usage3?.tokens??0}),idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!0,startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx);else{if(isOpenAiRemoteCompactionModel(ctx.model))return;let warmAction=resolveIdleWarmAction({willRetry:event.willRetry??!1,aborted:event.aborted===!0,settings,usage:usage3,contextWindow,breakerTripped:isTripped(state,Date.now()),lastYield:state.lastYield??void 0,mode:ctx.mode},speculativeJob);warmAction==="replace"&&invalidateSpeculativeCompaction(ctx),warmAction!=="none"&&(idleWarmupAttempt=0,sessionIdleSinceAgentEnd=!0,startSpeculativeCompaction(ctx,IDLE_COMPACTION_INSTRUCTIONS),armIdleWarmupRetry(ctx),armIdleApply(ctx))}}),pi.on("message_end",async(event,ctx)=>{for(let entry of collectCompactBoundaryEntries(event.message))pi.appendEntry(ANTHROPIC_SUBSCRIPTION_COMPACT_ENTRY_TYPE,entry);isAbortedAssistantMessage(event)&&invalidateSpeculativeCompaction(ctx),isMonitorableMessageEvent(event)&&!lanePolicy.disablesSenpiCompaction(ctx)&&await handleMessageEnd(degradationState,event,{applyCompaction:async options=>await applyBlockingCompaction(ctx,options.customInstructions),notify:message=>ctx.ui.notify(message,"warning")})}),pi.on("tool_call",event=>{trackToolCall(restorationState,event)}),pi.on("session_shutdown",()=>{sessionIdleSinceAgentEnd=!1,cancelIdleWarmupRetry(),idleWarmupAttempt=0,speculativeJob?.controller.abort(),speculativeJob=void 0})}var SIDE_QUERY_INSTRUCTION=["The user is asking a side question about the conversation so far, outside the main task.","Answer it directly and concisely from the context above.","Do not continue any task, do not modify anything, and do not treat this as new work."].join(" "),DEFAULT_ESTABLISHMENT_TIMEOUT_MS=3e4;function estimateMessagesTokens(messages){return messages.reduce((total,message)=>total+estimateTokens2(message),0)}function estimateSystemPromptTokens(systemPrompt){return estimateTokens2({role:"user",content:systemPrompt,timestamp:0})}function boundSideQueryMessages(messages,systemPrompt,promptContextWindow){if(typeof promptContextWindow!="number"||!Number.isFinite(promptContextWindow)||promptContextWindow<=0)return messages;let messageBudget=promptContextWindow-estimateSystemPromptTokens(systemPrompt),question=messages.at(-1);if(question===void 0||messageBudget<estimateMessagesTokens([question]))throw new Error("/btw question does not fit this model's context window; shorten it or run /compact first.");if(estimateMessagesTokens(messages)<=messageBudget)return messages;let reduced=convertToLlm(reduceContextMessages(messages,BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages),repaired=repairOrphanedToolResults(reduced),pruned=convertToLlm(pruneOldMessagesToBudget(repaired,messageBudget)),bounded=repairOrphanedToolResults(pruned);if(estimateMessagesTokens(bounded)>messageBudget)throw new Error("/btw context is too large for this model; run /compact first.");return bounded}function getSideQueryPromptContextWindow(model){return getPromptContextWindow(model.contextWindow,model.maxTokens)}function buildSideQueryContext(input){let systemPrompt=`${input.systemPrompt}
1027
1027
 
1028
1028
  ${SIDE_QUERY_INSTRUCTION}`,messages=boundSideQueryMessages([...input.history,{role:"user",content:input.question,timestamp:Date.now()}],systemPrompt,input.promptContextWindow);return{systemPrompt,messages,tools:[]}}async function runSideQuery(deps,context,callbacks={}){callbacks.signal?.throwIfAborted();let streamFn=deps.streamFn??streamSimple,establishment=new AbortController,signal=callbacks.signal?AbortSignal.any([callbacks.signal,establishment.signal]):establishment.signal,timeoutMs=deps.establishmentTimeoutMs??DEFAULT_ESTABLISHMENT_TIMEOUT_MS,timeoutError=new Error(`/btw provider did not produce an event within ${Math.round(timeoutMs/1e3)}s`),timer;try{let options={apiKey:deps.auth.apiKey,headers:deps.auth.headers,extraBody:deps.auth.extraBody,sessionId:`${deps.sessionId}:btw:${crypto.randomUUID()}`,reasoning:deps.thinkingLevel,signal};timer=setTimeout(()=>establishment.abort(timeoutError),timeoutMs),timer.unref?.();let stream2=await streamFn(deps.model,context,options),established=!1,replyText="";for await(let event of stream2)if(!established&&event.type!=="start"&&(established=!0,clearTimeout(timer),timer=void 0),event.type==="text_delta")replyText+=event.delta,callbacks.onTextDelta?.(event.delta);else{if(event.type==="done")break;if(event.type==="error")throw new Error(event.error.errorMessage||"Side query failed")}return signal.throwIfAborted(),{replyText}}catch(error2){throw establishment.signal.aborted&&!callbacks.signal?.aborted?timeoutError:error2}finally{timer&&clearTimeout(timer)}}var WIDGET_KEY2="btw";function btwExtension(pi){let active;function dismiss(ctx,options){let current=active;current&&(active=void 0,options.abort&&current.controller.abort(),current.unsubscribeEscape?.(),current.panel&&ctx.ui.setWidget(WIDGET_KEY2,void 0))}pi.on("session_before_switch",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("session_before_fork",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("session_shutdown",(_event,ctx)=>{dismiss(ctx,{abort:!0})}),pi.on("input",(_event,ctx)=>{active?.settled&&dismiss(ctx,{abort:!1})}),pi.registerCommand("btw",{description:"Ask a side question in parallel without touching the main session",argumentHint:"<question>",requiresArguments:!1,handler:async(args,ctx)=>{let question=args.trim();if(!question){if(active){dismiss(ctx,{abort:!0});return}ctx.ui.notify("Usage: /btw <question>","warning");return}let model=ctx.model;if(!model){ctx.ui.notify("No active model available for /btw.","error");return}let snapshot=buildSessionContext(ctx.sessionManager.getEntries(),ctx.sessionManager.getLeafId()),history=convertToLlm(snapshot.messages),systemPrompt=ctx.getSystemPrompt(),thinkingLevel=pi.getThinkingLevel(),sessionId=ctx.sessionManager.getSessionId();dismiss(ctx,{abort:!0});let controller=new AbortController,entry={controller,panel:void 0,unsubscribeEscape:void 0,settled:!1};active=entry,ctx.mode==="tui"&&ctx.hasUI&&(ctx.ui.setWidget(WIDGET_KEY2,(tui,theme2)=>{let panel=new BtwPanel(question,tui,theme2);return entry.panel=panel,panel.component}),entry.unsubscribeEscape=ctx.ui.onTerminalInput(data=>{active!==entry||isKeyRelease(data)||!matchesKey(data,"escape")||dismiss(ctx,{abort:!0})}));let auth=await ctx.modelRegistry.getApiKeyAndHeaders(model);if(!auth.ok){if(active!==entry)return;dismiss(ctx,{abort:!1}),ctx.ui.notify(`/btw: ${auth.error}`,"error");return}try{let context=buildSideQueryContext({systemPrompt,history,question,promptContextWindow:getSideQueryPromptContextWindow(model)}),{replyText}=await runSideQuery({model:auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,auth:{apiKey:auth.apiKey,headers:auth.headers,extraBody:auth.extraBody},sessionId,thinkingLevel:thinkingLevel==="off"?void 0:thinkingLevel,streamFn:(streamModel,streamContext,options)=>ctx.modelRegistry.modelRuntime.streamSimple(streamModel,streamContext,options)},context,{signal:controller.signal,onTextDelta:delta=>{active===entry&&entry.panel?.appendText(delta)}});if(active!==entry)return;entry.settled=!0,entry.panel?entry.panel.markDone():ctx.ui.notify(replyText,"info")}catch(error2){if(active!==entry)return;entry.settled=!0;let message=error2 instanceof Error?error2.message:String(error2);if(controller.signal.aborted){entry.panel?.markAborted();return}entry.panel?entry.panel.markError(message):ctx.ui.notify(`/btw failed: ${message}`,"error")}}})}var GOAL_CACHE_WARMUP_ENTRY_TYPE="goal-cache-warmup",GOAL_MONITOR_CONTINUATION_FALLBACK_DELAY_MS=24e4,GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS=27e4,GOAL_MONITOR_BEST_EFFORT_BACKSTOP_SECONDS=3570,GOAL_MONITOR_CONTINUATION_MIN_DELAY_MS=1e3,GOAL_MONITOR_CONTINUATION_HARD_CEILING_MS=36e5;function resolveGoalMonitorContinuationDelayMs(goalBackstopMaxSeconds){let configuredMs=typeof goalBackstopMaxSeconds=="number"&&Number.isFinite(goalBackstopMaxSeconds)&&goalBackstopMaxSeconds>0?goalBackstopMaxSeconds*1e3:GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS;return Math.max(GOAL_MONITOR_CONTINUATION_MIN_DELAY_MS,Math.min(configuredMs,GOAL_MONITOR_CONTINUATION_HARD_CEILING_MS))}function resolveGoalBackstopMaxSecondsForCache(goalBackstopMaxSeconds,lifetime){return lifetime?.kind!=="best-effort"?goalBackstopMaxSeconds:goalBackstopMaxSeconds===void 0||goalBackstopMaxSeconds*1e3===GOAL_MONITOR_BACKSTOP_DEFAULT_DELAY_MS?GOAL_MONITOR_BEST_EFFORT_BACKSTOP_SECONDS:goalBackstopMaxSeconds}function resolveGoalPromptCacheLifetime(model,env){return model===void 0?void 0:resolvePromptCacheLifetime(model,toProviderEnv(env))}function createGoalCacheWarmScheduleData(options){return{goalId:options.goalId,delayMs:options.delayMs,dueAtMs:options.scheduledAtMs+options.delayMs,iteration:options.iteration,activeMonitorCount:options.activeMonitorCount,wakeSources:options.wakeSources,...options.cache!==void 0?{cache:options.cache}:{}}}var TOKENS_PER_PRICE_UNIT=1e6;function estimateCacheWarmMetrics(model,env,lastTurnUsage){let cachedTokens=clampTokens(lastTurnUsage?.cacheRead)+clampTokens(lastTurnUsage?.cacheWrite),lifetime=resolveGoalPromptCacheLifetime(model,env);if(lifetime?.kind==="best-effort")return cachedTokens===0?void 0:{cachedTokens,cacheLifetime:"best-effort"};let ttlSeconds=lifetime?.kind==="ttl"?lifetime.ttlSeconds:void 0;if(ttlSeconds===void 0&&cachedTokens===0)return;let estimatedSavedUsd=model!==void 0&&cachedTokens>0?Math.max(0,model.cost.input-model.cost.cacheRead)*cachedTokens/TOKENS_PER_PRICE_UNIT:void 0;return{cachedTokens,...ttlSeconds!==void 0?{ttlSeconds}:{},...estimatedSavedUsd!==void 0?{estimatedSavedUsd}:{}}}function formatWarmTokenCount(tokens){return tokens>=1e6?`${trimTrailingZero((tokens/1e6).toFixed(1))}M`:tokens>=1e3?`${trimTrailingZero((tokens/1e3).toFixed(1))}K`:String(Math.max(0,Math.trunc(tokens)))}function formatWakeDuration(ms){let seconds=Math.round(ms/1e3);if(seconds<60)return`${seconds}s`;let minutes=Math.floor(seconds/60),restSeconds=seconds%60;if(minutes<60)return restSeconds===0?`${minutes}m`:`${minutes}m ${restSeconds}s`;let hours=Math.floor(minutes/60),restMinutes=minutes%60;return restMinutes===0?`${hours}h`:`${hours}h ${restMinutes}m`}function formatWakeTimestamp(dueAtMs){let date=new Date(dueAtMs),local=formatLocalWakeTimestamp(date);return local!==void 0?local:`${date.toISOString().slice(0,16).replace("T"," ")} UTC`}function formatLocalWakeTimestamp(date){try{let parts=new Intl.DateTimeFormat("en-CA",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hourCycle:"h23",timeZoneName:"short"}).formatToParts(date),read=type2=>parts.find(part=>part.type===type2)?.value,year=read("year"),month=read("month"),day=read("day"),hour=read("hour"),minute=read("minute");if(year===void 0||month===void 0||day===void 0||hour===void 0||minute===void 0)return;let zone=read("timeZoneName");return`${year}-${month}-${day} ${hour}:${minute}${zone===void 0?"":` ${zone}`}`}catch{return}}function formatCacheTtl(seconds){return seconds%3600===0?`${seconds/3600}h`:seconds%60===0?`${seconds/60}m`:`${seconds}s`}function formatSavedUsd(value2){return value2<5e-4?"<$0.001":value2<1?`$${value2.toFixed(3)}`:`$${value2.toFixed(2)}`}function trimTrailingZero(value2){return value2.endsWith(".0")?value2.slice(0,-2):value2}function clampTokens(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>0?Math.trunc(value2):0}function toProviderEnv(env){let resolved={};for(let[key,value2]of Object.entries(env))value2!==void 0&&(resolved[key]=value2);return resolved}var PROMPT_CACHE_PREWARM_TIMEOUT_MS=3e4;function createSessionPrewarm(pi,dependencies){let isPrewarmModel=dependencies.isPrewarmModel??isOpenAIResponsesPromptCacheModel,current;function cancel2(){current?.abort(),current=void 0}async function run2(ctx,model,controller){let{signal}=controller;try{let prefix=await ctx.getPromptCachePrefixRequest?.({signal});if(signal.aborted||prefix===void 0)return;if(prefix.status==="skipped"){append({phase:"skipped",provider:model.provider,model:model.id,reason:prefix.reason});return}let{request:request2}=prefix,result3=await dependencies.warm(request2.model,request2.context,{...request2.options,signal,timeoutMs:PROMPT_CACHE_PREWARM_TIMEOUT_MS});if(signal.aborted||!result3.supported)return;append({phase:"warmed",provider:model.provider,model:model.id,usage:toUsage(model,result3.usage)})}catch(error2){if(signal.aborted)return;let message=error2 instanceof Error?error2.message:String(error2);append({phase:"failed",provider:model.provider,model:model.id,error:message})}finally{current===controller&&(current=void 0)}}function append(data){pi.appendEntry(PROMPT_CACHE_PREWARM_ENTRY_TYPE,data)}return{start(ctx){cancel2();let model=ctx.model;if(model===void 0||model.cacheRetention==="none"||!isPrewarmModel(model))return;let controller=new AbortController;current=controller,run2(ctx,model,controller)},cancel:cancel2}}function toUsage(model,usage3){let cost=usage3.cost??{input:usage3.input*model.cost.input/1e6,output:usage3.output*model.cost.output/1e6,cacheRead:usage3.cacheRead*model.cost.cacheRead/1e6,cacheWrite:usage3.cacheWrite*model.cost.cacheWrite/1e6,total:0};return{input:usage3.input,output:usage3.output,cacheRead:usage3.cacheRead,cacheWrite:usage3.cacheWrite,totalTokens:usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost:{...cost,total:cost.input+cost.output+cost.cacheRead+cost.cacheWrite}}}var CACHE_KEEPALIVE_ENTRY_TYPE="cache-keepalive",CACHE_WARM_PING_EVENT="cache_warm_ping",renderCacheKeepAliveEntry=noticeEntryRenderer(entry=>{let data=entry.data;if(data?.phase!=="ping")return;let refreshed=data.cacheRead+data.cacheWrite;return{title:`\u26A1 Warm ping #${data.iteration} \xB7 ~${formatWarmTokenCount(refreshed)} tokens refreshed \xB7 ${formatUsd(data.estimatedCostUsd)}`,why:"Refreshed the active Anthropic prompt cache while the session was idle.",expandedLine:`cache read ${data.cacheRead} \xB7 cache write ${data.cacheWrite} \xB7 session total ${formatUsd(data.cumulativeEstimatedUsd)}`}});function createCacheKeepAliveExtension(dependencies={}){let warm=dependencies.warmPromptCache??warmPromptCache;return pi=>{let prewarm=createSessionPrewarm(pi,{warm,isPrewarmModel:dependencies.isPromptCachePrewarmModel}),ctx,timer,inFlight=!1,generation2=0,active=!1,parked=!1,attempts=0,cumulativeEstimatedUsd=0,lastCompletedAtMs,lastMessages=[],lastUsage;pi.registerEntryRenderer(CACHE_KEEPALIVE_ENTRY_TYPE,renderCacheKeepAliveEntry);function append(data){pi.appendEntry(CACHE_KEEPALIVE_ENTRY_TYPE,data)}let armOnSettle=!1;function stop(reason,forceEntry=!1){let shouldAppend=active||inFlight||timer!==void 0||forceEntry;generation2+=1,timer!==void 0&&clearTimeout(timer),timer=void 0,active=!1,shouldAppend&&append({phase:"stopped",iterations:attempts,stopReason:reason,cumulativeEstimatedUsd})}function arm(){if(parked||timer!==void 0||inFlight)return;let current=ctx,settings=current?.getPromptCacheKeepAliveSettings?.();if(!settings?.enabled||current?.model===void 0||lastCompletedAtMs===void 0||!isWarmSupportedModel(current.model))return;if(!current.isIdle()){stop("agent-busy");return}if(current.hasPendingMessages()){stop("pending-messages");return}let safeWaitSeconds=current.getPromptCacheSafeWaitSeconds?.();if(safeWaitSeconds===void 0||!Number.isFinite(safeWaitSeconds))return;if(attempts>=Math.max(0,settings.maxRequestsPerSession)){stop("max-requests",!0);return}let projectedUsd=projectedPingCost(current.model,lastUsage);if(cumulativeEstimatedUsd+projectedUsd>Math.max(0,settings.maxCostUsdPerSession)){stop("cost-cap",!0);return}active||(active=!0,append({phase:"started"}));let intervalMs=Math.max(0,safeWaitSeconds-Math.max(0,settings.marginSeconds))*1e3,delayMs=Math.max(0,lastCompletedAtMs+intervalMs-Date.now()),scheduledGeneration=generation2;timer=setTimeout(()=>{timer=void 0,ping(scheduledGeneration)},delayMs)}async function ping(scheduledGeneration){if(scheduledGeneration!==generation2)return;let current=ctx,settings=current?.getPromptCacheKeepAliveSettings?.();if(current===void 0||settings?.enabled!==!0||current.model===void 0||!isWarmSupportedModel(current.model)||!current.isIdle()||current.hasPendingMessages()||attempts>=Math.max(0,settings.maxRequestsPerSession)||cumulativeEstimatedUsd+projectedPingCost(current.model,lastUsage)>Math.max(0,settings.maxCostUsdPerSession)){arm();return}inFlight=!0,attempts+=1;let iteration=attempts,pingGeneration=generation2;try{let preparation=await current.prepareProviderRequest?.(lastMessages);if(pingGeneration!==generation2){inFlight=!1,arm();return}let preparedMessages=preparation?.messages??lastMessages,prefix=await current.getPromptCachePrefixRequest?.(),activeToolNames=new Set(pi.getActiveTools()),tools=prefix?.status==="ready"?prefix.request.context.tools??[]:pi.getAllTools().filter(tool=>activeToolNames.has(tool.name)).map(({name,description,parameters})=>({name,description,parameters})),auth=await current.modelRegistry.getApiKeyAndHeaders(current.model);if(pingGeneration!==generation2){inFlight=!1,arm();return}if(!auth.ok)throw new Error(auth.error);let authHeaders=auth.headers??{},headers=preparation?await preparation.transformHeaders(authHeaders):authHeaders,result3=await warm(current.model,{systemPrompt:current.getSystemPrompt(),messages:convertToLlm(preparedMessages),...tools.length>0?{tools}:{}},{apiKey:auth.apiKey,headers,sessionId:current.sessionManager.getSessionId(),cacheRetention:current.model.cacheRetention,onPayload:preparation?async payload=>await preparation.transformPayload(payload):void 0});if(pingGeneration!==generation2){inFlight=!1,arm();return}if(!result3.supported){inFlight=!1,stop("unsupported-model");return}let estimatedCostUsd=actualPingCost(current.model,result3.usage);cumulativeEstimatedUsd+=estimatedCostUsd,lastCompletedAtMs=Date.now();let cachedTokens=result3.usage.cacheRead+result3.usage.cacheWrite,ttlSeconds=resolvePromptCacheTtlSeconds(current.model)??0;pi.events?.emit(CACHE_WARM_PING_EVENT,{iteration,cachedTokens,ttlSeconds,estimatedCostUsd}),append({phase:"ping",iteration,cacheRead:result3.usage.cacheRead,cacheWrite:result3.usage.cacheWrite,estimatedCostUsd,cumulativeEstimatedUsd}),inFlight=!1,arm()}catch{inFlight=!1,pingGeneration===generation2?stop("provider-error"):arm()}}pi.on("session_start",(_event,nextCtx)=>{stop("session-restart"),ctx=nextCtx,attempts=0,cumulativeEstimatedUsd=0,lastMessages=nextCtx.sessionManager.buildSessionContext().messages,lastUsage=lastAssistantUsage(lastMessages),lastCompletedAtMs=lastAssistantTimestamp(lastMessages),arm(),prewarm.start(nextCtx)}),pi.on("agent_end",(event,nextCtx)=>{ctx=nextCtx;let usage3=lastAssistantUsage(event.messages);if(usage3?.stopReason==="error"){armOnSettle=!1,stop("provider-error");return}lastMessages=[...event.messages],lastUsage=usage3,lastCompletedAtMs=Date.now(),armOnSettle=!0,arm()}),pi.on("agent_settled",(_event,nextCtx)=>{ctx=nextCtx,armOnSettle&&(armOnSettle=!1,arm())}),pi.on("model_select",(_event,nextCtx)=>{ctx=nextCtx,stop("model-changed"),arm()}),pi.on("session_parked",()=>{parked=!0,stop("session-parked")}),pi.on("session_resumed",(_event,nextCtx)=>{parked=!1,ctx=nextCtx,arm()}),pi.on("agent_start",()=>stop("agent-busy")),pi.on("input",()=>stop("user-input")),pi.on("session_shutdown",()=>{stop("session-dispose"),prewarm.cancel(),ctx=void 0})}}function isWarmSupportedModel(model){return model.api==="anthropic-messages"&&isAnthropicApiBaseUrl(model.baseUrl)}function lastAssistantUsage(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message.role==="assistant")return{input:finiteTokens(message.usage.input),cacheRead:finiteTokens(message.usage.cacheRead),cacheWrite:finiteTokens(message.usage.cacheWrite),stopReason:message.stopReason}}}function lastAssistantTimestamp(messages){for(let index=messages.length-1;index>=0;index-=1){let message=messages[index];if(message.role==="assistant"&&Number.isFinite(message.timestamp))return message.timestamp}}function projectedPingCost(model,usage3){return((usage3?.input??0)+(usage3?.cacheRead??0)+(usage3?.cacheWrite??0))*Math.max(model.cost.cacheRead,model.cost.cacheWrite)/1e6}function actualPingCost(model,usage3){return(usage3.cacheRead*model.cost.cacheRead+usage3.cacheWrite*model.cost.cacheWrite+usage3.input*model.cost.input)/1e6}function finiteTokens(value2){return Number.isFinite(value2)&&value2>0?value2:0}function formatUsd(value2){return`$${value2.toFixed(3)}`}var cache_keepalive_default=createCacheKeepAliveExtension();var ADDRESS_PREFIX=/^(?:<@[^>\s]+>[:,]?|[^\n,<]{1,40}님,|@[^\s,]{1,40},)[ \t]*/u,INTENT_SENTENCE=[/^I(?:'m| am)? read(?:ing)? this as\b/i,/^I read (?:this|that|your (?:message|request)) as\b/i,/(?:요청|질문|말|바람|지시|고민|부탁|뜻|의도|얘기|이야기)(?:으)?로\s*(?:읽었|이해했|받아들였)/u,/(?:걸|것으)로\s*(?:읽었|이해했)/u,/^(?:이건|이거|이번 건|이 (?:말|요청|질문|메시지)[은는]|(?:요청|질문|메시지)[을를])\s.*(?:으)?로\s*(?:읽었|이해했)/u],STOP_SENTENCE=[/\bI'?ll stop (?:when|once|after)\b/i,/\bI will stop (?:when|once|after)\b/i,/멈출\s*조건/u,/여기서\s*(?:멈출|마칠|끝낼|멈추|마치)/u,/(?:멈출|마칠|끝낼)게(?:요)?[.!]?$/u,/(?:보내|전달하|답하)면\s*(?:끝|마무리)/u],PLAN_SENTENCE=/(?:할|줄|드릴|볼|답할|정리할|설명할|알려줄|알려드릴)게(?:요)?[.!]?$/u,HANDOFF_LABEL=/^\s*(?:>\s*)?(?:\*{1,2})?(?:Ask|wanted|For you|Now|Next|You need|최초\s*의도|원했던\s*것|궁금해할\s*정보|지금\s*집중하는\s*것|다음\s*계획)(?:\*{1,2})?\s*[::]/iu,HANDOFF_OPENING=/^\s*(?:>\s*)?(?:\*{1,2})?(?:Ask|wanted|For you|최초\s*의도|원했던\s*것|궁금해할\s*정보)(?:\*{1,2})?\s*[::]/iu,HANDOFF_SIGNATURE=[/\bAsk\s*[::].*\s-\s*wanted\s*[::]/iu,/\bFor you\s*[::].*\bNow\s*[::].*\bNext\s*[::]/iu],LEDGER_MARKER=[/^\s*(?:Overall|Remaining items|Active phase)\b.*\d/iu,/\bledger\s+\d+\s*\/\s*\d+/iu],LEDGER_ITEM=[/^\s*[-*]\s*\[[ xX]\]\s/u,/^\s*[-*]\s.*\[(?:pending|in_progress|completed|done|dropped)\]/iu,/^\s*(?:Todo|TODO|To-do|Ledger|투두|할\s*일\s*목록|렛져|레저)\s*[::]/u],matchesAny=(patterns,line)=>patterns.some(pattern=>pattern.test(line)),isIntent=sentence=>matchesAny(INTENT_SENTENCE,sentence),isStop=sentence=>matchesAny(STOP_SENTENCE,sentence);function sentencesOf(paragraph){return paragraph.split(/(?<=[.!?。])\s+/u).map(sentence=>sentence.trim()).filter(sentence=>sentence.length>0)}function leadingRoutingCount(sentences){let first=sentences[0];if(first===void 0||!(isIntent(first)||isStop(first)))return 0;let end=0;for(let index=0;index<sentences.length;index+=1){let sentence=sentences[index]??"";if(isIntent(sentence)||isStop(sentence)){end=index+1;continue}if(!(index===end&&PLAN_SENTENCE.test(sentence)&&sentences.slice(index+1).some(isStop)))break}return end}function classifyLines(lines){let kinds=lines.map(line=>matchesAny(HANDOFF_SIGNATURE,line)?"handoff":null);for(let index=0;index<lines.length;){let end=index;for(;end<lines.length&&HANDOFF_LABEL.test(lines[end]??"");)end+=1;let opens=lines.slice(index,end).some(line=>HANDOFF_OPENING.test(line));if(end-index>=2&&opens)for(let at=index;at<end;at+=1)kinds[at]="handoff";index=Math.max(end,index+1)}for(let index=0;index<lines.length;){let end=index;for(;end<lines.length&&(lines[end]??"").trim()!=="";)end+=1;let block=lines.slice(index,end);block.some((line,at)=>matchesAny(LEDGER_MARKER,line)||kinds[index+at]==="handoff")&&block.forEach((line,at)=>{kinds[index+at]===null&&(matchesAny(LEDGER_MARKER,line)||matchesAny(LEDGER_ITEM,line))&&(kinds[index+at]="ledger")}),index=end+1}return kinds}function stripAgentScaffold(input){let removed=[],normalized2=input.replace(/\r\n?/g,`
1029
1029
  `).trim(),prefix=ADDRESS_PREFIX.exec(normalized2)?.[0]??"",all2=normalized2.slice(prefix.length).split(`
@@ -2085,10 +2085,10 @@ Have an opinion: agree or disagree plainly, and say why; raise only real problem
2085
2085
  Plain, literal prose; bullets only for genuinely list-shaped content; ASCII unless the file already uses Unicode. ${context.surface==="chat"?`${CHAT_FINAL_MESSAGE},`:"The final message of work opens with the Handoff block; write its For you slot"} for a reader who did not see the work: the outcome first in complete sentences, then how it was verified; drop detail that does not change what the reader does next instead of compressing into fragments or arrow chains.`}function buildKimiK3Prompt(options){return buildDynamicSystemPrompt({...options,corePrompt:buildKimiK3Core,workstationDialect:"kimi"})}var VALID_PRESETS=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-opus-5-5","claude-opus-5","claude-sonnet-5-5","claude-opus-4-8","claude-opus-4-7","claude-opus-4-6","claude-opus-4-5","deepseek-v4-flash","deepseek-v4-flash-0731","deepseek-v4-1-flash","deepseek-v4-pro","glm-5.2","glm-5.3","grok-4.5","grok-4.6","grok-4.7","kimi-k3","kimi-k2-8","kimi-k2-7","kimi-k2-6","gpt-5","gpt-5.2","gpt-5.3-codex","gpt-5.4","gpt-5.5","gpt-5.6","gpt-6-astra"]);function parsePromptPreset(value2){if(value2&&VALID_PRESETS.has(value2))return value2}function loadPromptPresetSettings(settingsManager){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings();return{promptPreset:parsePromptPreset(projectSettings.promptPreset)??parsePromptPreset(globalSettings.promptPreset)??"auto"}}function normalizeModelId(modelId){return modelId.toLowerCase().replace(/\s+/g,"-")}function hasGpt6FamilySignal(value2){return/(?:^|[/@:._-])gpt[._-]?6(?:[._-]\d+|\d)?[._-](?:astra|sol|luna)(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isGpt6FamilyModel(model){return hasGpt6FamilySignal(model.id)||model.name!==void 0&&hasGpt6FamilySignal(model.name)}function extractGpt5Version(modelId){let normalized2=normalizeModelId(modelId);if(normalized2.includes("gpt-5.6"))return"gpt-5.6";if(normalized2.includes("gpt-5.5"))return"gpt-5.5";if(normalized2.includes("gpt-5.4"))return"gpt-5.4";if(normalized2.includes("gpt-5.3"))return"gpt-5.3-codex";if(normalized2.includes("gpt-5.2"))return"gpt-5.2"}function hasKimiK26Signal(value2){return/(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isKimiK26Model(model){return hasKimiK26Signal(model.id)||model.name!==void 0&&hasKimiK26Signal(model.name)}var KIMI_CODE_K27_MODEL_ID="kimi-for-coding-highspeed",KIMI_CODE_K28_MODEL_ID="kimi-for-coding";function hasKimiK27Signal(value2){let normalized2=normalizeModelId(value2);return normalized2===KIMI_CODE_K27_MODEL_ID||/(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalized2)}function isKimiK27Model(model){return hasKimiK27Signal(model.id)||model.name!==void 0&&hasKimiK27Signal(model.name)}function hasKimiK28Signal(value2){let normalized2=normalizeModelId(value2);return normalized2===KIMI_CODE_K28_MODEL_ID||/(?:^|[/@._-])kimi-k2(?:[._-]|p)8(?:$|[/@._:-])/.test(normalized2)}function isKimiK28Model(model){return hasKimiK28Signal(model.id)||model.name!==void 0&&hasKimiK28Signal(model.name)}function hasKimiK3Signal(value2){let normalized2=normalizeModelId(value2);return normalized2==="k3"||/(?:^|[/@._-])kimi-k3(?:$|[/@._:-])/.test(normalized2)}function isKimiK3Model(model){return hasKimiK3Signal(model.id)||model.name!==void 0&&hasKimiK3Signal(model.name)}function hasSWE2Signal(value2){return/(?:^|[/@:._-])swe-2-(?:medium|high|max)(?:$|[/@:._])/.test(normalizeModelId(value2))}function isSWE2Model(model){return hasSWE2Signal(model.id)||model.name!==void 0&&hasSWE2Signal(model.name)}function hasDeepseekV4Flash0731Signal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]flash[._-]0731(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4Flash0731Model(model){return hasDeepseekV4Flash0731Signal(model.id)||model.name!==void 0&&hasDeepseekV4Flash0731Signal(model.name)}function hasDeepseekV4FlashSignal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]flash(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4FlashModel(model){return hasDeepseekV4FlashSignal(model.id)||model.name!==void 0&&hasDeepseekV4FlashSignal(model.name)}function hasDeepseekV41FlashSignal(value2){let normalized2=normalizeModelId(value2);return/(?:^|[/@:._-])deepseek[._-]v4(?:[._-]1|p1)[._-]flash(?:$|[/@:._-])/.test(normalized2)||/(?:^|[/@:._-])deepseek[._-]flash(?:$|[/@:._-])/.test(normalized2)}var DEEPSEEK_OFFICIAL_PROVIDER="deepseek";function isRetiredOfficialDeepseekV4FlashAlias(model){return model.provider===DEEPSEEK_OFFICIAL_PROVIDER&&hasDeepseekV4FlashSignal(model.id)}function isDeepseekV41FlashModel(model){return hasDeepseekV41FlashSignal(model.id)||model.name!==void 0&&hasDeepseekV41FlashSignal(model.name)||isRetiredOfficialDeepseekV4FlashAlias(model)}function hasDeepseekV4ProSignal(value2){return/(?:^|[/@:._-])deepseek[._-]v4[._-]pro(?:$|[/@:._-])/.test(normalizeModelId(value2))}function isDeepseekV4ProModel(model){return hasDeepseekV4ProSignal(model.id)||model.name!==void 0&&hasDeepseekV4ProSignal(model.name)}function hasGlm52Signal(value2){return/(?:^|[/@._-])glm(?:[._-]|p)5(?:[._-]|p)2(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGlm52Model(model){return hasGlm52Signal(model.id)||model.name!==void 0&&hasGlm52Signal(model.name)}function hasGlm53Signal(value2){return/(?:^|[/@._-])glm(?:[._-]|p)5(?:[._-]|p)3(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGlm53Model(model){return hasGlm53Signal(model.id)||model.name!==void 0&&hasGlm53Signal(model.name)}function hasGrok45Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?5(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok45Model(model){return hasGrok45Signal(model.id)||model.name!==void 0&&hasGrok45Signal(model.name)}function hasGrok46Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?6(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok46Model(model){return hasGrok46Signal(model.id)||model.name!==void 0&&hasGrok46Signal(model.name)}function hasGrok47Signal(value2){return/(?:^|[/@:._-])grok(?:[._-]|p)?4(?:[._-]|p)?7(?:$|[/@._:-])/.test(normalizeModelId(value2))}function isGrok47Model(model){return hasGrok47Signal(model.id)||model.name!==void 0&&hasGrok47Signal(model.name)}var CLAUDE_FABLE_51_MARKERS=["fable-5-1","fable-5.1","mythos-5-1","mythos-5.1"],CLAUDE_FABLE_5_MARKERS=["fable-5","mythos-5"];function isClaudeFable51Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_FABLE_51_MARKERS.some(marker=>normalized2.includes(marker))}function isClaudeFable5Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_FABLE_5_MARKERS.some(marker=>normalized2.includes(marker))}var CLAUDE_OPUS_55_MARKERS=["opus-5-5","opus-5.5"];function isClaudeOpus55Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_OPUS_55_MARKERS.some(marker=>normalized2.includes(marker))}function isClaudeOpus5Model(modelId){return normalizeModelId(modelId).includes("opus-5")}var CLAUDE_SONNET_55_MARKERS=["sonnet-5-5","sonnet-5.5"];function isClaudeSonnet55Model(modelId){let normalized2=normalizeModelId(modelId);return CLAUDE_SONNET_55_MARKERS.some(marker=>normalized2.includes(marker))}function extractClaudeOpusVersion(modelId){let normalized2=normalizeModelId(modelId);if(normalized2.includes("opus-4-8"))return"claude-opus-4-8";if(normalized2.includes("opus-4-7"))return"claude-opus-4-7";if(normalized2.includes("opus-4-6"))return"claude-opus-4-6";if(normalized2.includes("opus-4-5")||normalized2.includes("opus-4.5"))return"claude-opus-4-5"}function resolvePresetName(model,settings){if(settings.promptPreset!=="auto")return settings.promptPreset;let modelPromptPreset=parsePromptPreset(model.promptPreset);if(modelPromptPreset&&modelPromptPreset!=="auto")return modelPromptPreset;if(isGpt6FamilyModel(model))return"gpt-6-astra";let gpt5Version=extractGpt5Version(model.id);if(gpt5Version)return gpt5Version;if(isSWE2Model(model)||isKimiK3Model(model))return"kimi-k3";if(isKimiK28Model(model))return"kimi-k2-8";if(isKimiK27Model(model))return"kimi-k2-7";if(isKimiK26Model(model))return"kimi-k2-6";if(isClaudeFable51Model(model.id))return"claude-fable-5-1";if(isClaudeFable5Model(model.id))return"claude-fable-5";if(isClaudeOpus55Model(model.id))return"claude-opus-5-5";if(isClaudeOpus5Model(model.id))return"claude-opus-5";if(isClaudeSonnet55Model(model.id))return"claude-sonnet-5-5";let claudeVersion=extractClaudeOpusVersion(model.id);if(claudeVersion)return claudeVersion;if(isGlm53Model(model))return"glm-5.3";if(isGlm52Model(model))return"glm-5.2";if(isDeepseekV4Flash0731Model(model))return"deepseek-v4-flash-0731";if(isDeepseekV41FlashModel(model))return"deepseek-v4-1-flash";if(isDeepseekV4FlashModel(model))return"deepseek-v4-flash";if(isDeepseekV4ProModel(model))return"deepseek-v4-pro";if(isGrok47Model(model))return"grok-4.7";if(isGrok46Model(model))return"grok-4.6";if(isGrok45Model(model))return"grok-4.5"}function buildPreset(name,options){switch(name){case"gpt-6-astra":return{name,prompt:buildGpt6AstraPrompt(options)};case"gpt-5.6":return{name,prompt:buildGpt56Prompt(options)};case"gpt-5.5":return{name,prompt:buildGpt55Prompt(options)};case"gpt-5.4":return{name,prompt:buildGpt54Prompt(options)};case"gpt-5.3-codex":return{name,prompt:buildGpt53CodexPrompt(options)};case"gpt-5.2":return{name,prompt:buildGpt52Prompt(options)};case"gpt-5":return{name,prompt:buildGpt5Prompt(options)};case"glm-5.3":return{name,prompt:buildGlm53Prompt(options)};case"glm-5.2":return{name,prompt:buildGlm52Prompt(options)};case"deepseek-v4-flash":return{name,prompt:buildDeepseekV4FlashPrompt(options)};case"deepseek-v4-flash-0731":return{name,prompt:buildDeepseekV4Flash0731Prompt(options)};case"deepseek-v4-1-flash":return{name,prompt:buildDeepseekV41FlashPrompt(options)};case"deepseek-v4-pro":return{name,prompt:buildDeepseekV4ProPrompt(options)};case"grok-4.7":return{name,prompt:buildGrok47Prompt(options)};case"grok-4.6":return{name,prompt:buildGrok46Prompt(options)};case"grok-4.5":return{name,prompt:buildGrok45Prompt(options)};case"kimi-k3":return{name,prompt:buildKimiK3Prompt(options)};case"kimi-k2-8":return{name,prompt:buildKimiK28Prompt(options)};case"kimi-k2-7":return{name,prompt:buildKimiK27Prompt(options)};case"kimi-k2-6":return{name,prompt:buildKimiK26Prompt(options)};case"claude-fable-5-1":return{name,prompt:buildClaudeFable51Prompt(options)};case"claude-fable-5":return{name,prompt:buildClaudeFable5Prompt(options)};case"claude-opus-5-5":return{name,prompt:buildClaudeOpus55Prompt(options)};case"claude-sonnet-5-5":return{name,prompt:buildClaudeSonnet55Prompt(options)};case"claude-opus-5":return{name,prompt:buildClaudeOpus5Prompt(options)};case"claude-opus-4-8":return{name,prompt:buildClaudeOpus48Prompt(options)};case"claude-opus-4-7":return{name,prompt:buildClaudeOpus47Prompt(options)};case"claude-opus-4-6":return{name,prompt:buildClaudeOpus46Prompt(options)};case"claude-opus-4-5":return{name,prompt:buildClaudeOpus45Prompt(options)}}}function withDefaults(options={}){return{cwd:options.cwd??"",selectedTools:options.selectedTools??[],toolSnippets:options.toolSnippets??{},promptGuidelines:options.promptGuidelines??[],contextFiles:options.contextFiles??[],skills:options.skills??[],surface:options.surface??"terminal"}}function resolvePreset(model,settings,options){let name=resolvePresetName(model,settings);if(name)return buildPreset(name,withDefaults(options))}function eventOptionsToBuilderInput(event,ctx){let options=event.systemPromptOptions??{};return{cwd:options.cwd??ctx.cwd,selectedTools:options.selectedTools,toolSnippets:options.toolSnippets,promptGuidelines:options.promptGuidelines,contextFiles:options.contextFiles,skills:options.skills,surface:options.surface}}function getSettings(ctx){return loadPromptPresetSettings(SettingsManager.create(ctx.cwd))}function getPresetName(ctx,event){let model=event?.model??ctx.model;if(model&&!hasUserSystemPrompt(ctx.getSystemPromptOptions?.()))return resolvePresetName(model,getSettings(ctx))}function hasUserSystemPrompt(options){return!!options?.customPrompt}function withUserAppends(presetPrompt,options){let append=options?.appendSystemPrompt;return append?`${presetPrompt}
2086
2086
 
2087
2087
  ${append}`:presetPrompt}function refreshHeader(ctx,event){let presetName=getPresetName(ctx,event);if(!presetName){ctx.ui.setHeader(void 0);return}ctx.ui.setHeader((_tui,theme2)=>({render:()=>[theme2.fg("accent",theme2.bold(`Optimized system prompt applied: ${presetName}`))],invalidate:()=>{}}))}function promptPresetExtension(pi){let onBeforeAgentStart=async(event,ctx)=>{let model=ctx.model;if(!model||hasUserSystemPrompt(event.systemPromptOptions))return;let preset=resolvePreset(model,getSettings(ctx),eventOptionsToBuilderInput(event,ctx));if(preset)return{systemPrompt:withUserAppends(preset.prompt,event.systemPromptOptions)}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("session_start",async(_event,ctx)=>{refreshHeader(ctx)}),pi.on("model_select",async(event,ctx)=>{if(refreshHeader(ctx,event),hasUserSystemPrompt(event.systemPromptOptions))return{systemPrompt:null};let preset=resolvePreset(event.model,getSettings(ctx),eventOptionsToBuilderInput(event,ctx));return{systemPrompt:preset?withUserAppends(preset.prompt,event.systemPromptOptions):null,systemPromptName:preset?.name}})}var PR_PROMPT_PATTERN=/^\s*You are given one or more GitHub PR URLs:\s*(\S+)/im,ISSUE_PROMPT_PATTERN=/^\s*Analyze GitHub issue\(s\):\s*(\S+)/im;function extractPromptMatch(prompt){let prMatch=prompt.match(PR_PROMPT_PATTERN);if(prMatch?.[1])return{kind:"pr",url:prMatch[1].trim()};let issueMatch=prompt.match(ISSUE_PROMPT_PATTERN);if(issueMatch?.[1])return{kind:"issue",url:issueMatch[1].trim()}}async function fetchGhMetadata(pi,kind,url){let args=kind==="pr"?["pr","view",url,"--json","title,author"]:["issue","view",url,"--json","title,author"];try{let result3=await pi.exec("gh",args);return result3.code!==0||!result3.stdout?void 0:JSON.parse(result3.stdout)}catch{return}}function formatAuthor(author){if(!author)return;let name=author.name?.trim(),login=author.login?.trim();if(name&&login)return`${name} (@${login})`;if(login)return`@${login}`;if(name)return name}function promptUrlWidgetExtension(pi){let setWidget=(ctx,match,title,authorText)=>{ctx.ui.setWidget("prompt-url",(_tui,thm)=>buildNoticeBox({title:title??match.url,tone:"accent",why:authorText??"Prompt URL detected.",extra:[{text:match.url,tone:"dim"}]},{expanded:!1},thm))},applySessionName=(_ctx,match,title)=>{let label3=match.kind==="pr"?"PR":"Issue",trimmedTitle=title?.trim(),fallbackName=`${label3}: ${match.url}`,desiredName=trimmedTitle?`${label3}: ${trimmedTitle} (${match.url})`:fallbackName,currentName=pi.getSessionName()?.trim();if(!currentName){pi.setSessionName(desiredName);return}(currentName===match.url||currentName===fallbackName)&&pi.setSessionName(desiredName)},onBeforeAgentStart=async(event,ctx)=>{if(event.preview===!0||!ctx.hasUI)return;let match=extractPromptMatch(event.prompt);match&&(setWidget(ctx,match),applySessionName(ctx,match),fetchGhMetadata(pi,match.kind,match.url).then(meta=>{let title=meta?.title?.trim(),authorText=formatAuthor(meta?.author);setWidget(ctx,match,title,authorText),applySessionName(ctx,match,title)}))};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0});let getUserText=content=>content?typeof content=="string"?content:content.filter(block=>block.type==="text").map(block=>block.text).join(`
2088
- `)??"":"",rebuildFromSession=ctx=>{if(!ctx.hasUI)return;let lastMatch=[...ctx.sessionManager.getEntries()].reverse().find(entry=>{if(entry.type!=="message"||entry.message.role!=="user")return!1;let text3=getUserText(entry.message.content);return!!extractPromptMatch(text3)}),content=lastMatch?.type==="message"&&lastMatch.message.role==="user"?lastMatch.message.content:void 0,text2=getUserText(content),match=text2?extractPromptMatch(text2):void 0;if(!match){ctx.ui.setWidget("prompt-url",void 0);return}setWidget(ctx,match),applySessionName(ctx,match),fetchGhMetadata(pi,match.kind,match.url).then(meta=>{let title=meta?.title?.trim(),authorText=formatAuthor(meta?.author);setWidget(ctx,match,title,authorText),applySessionName(ctx,match,title)})};pi.on("session_start",async(_event,ctx)=>{rebuildFromSession(ctx)})}var EFFORT_LEVELS=["minimal","low","medium","high","xhigh","max"],EFFORT_TOKENS=["off",...EFFORT_LEVELS],REASONING_ARGUMENTS=["on","off"],REASONING_USAGE="Usage: /reasoning [on|off]",EFFORTS_USAGE="Usage: /efforts [minimal|low|medium|high|xhigh|max]",DEFAULT_ON_LEVEL="medium";function modelKey(model){return`${model.provider}/${model.id}`}function noReasoningMessage(model){return`Model ${modelKey(model)} does not support reasoning.`}function onOffOnlyMessage(model){return`Reasoning effort is not configurable for ${modelKey(model)}; this model supports on/off only. Use /reasoning on or /reasoning off.`}function reasoningStatus(level){return level==="off"?"Reasoning: off.":`Reasoning: on (${level}).`}function effortsStatus(level,capability){return`Reasoning effort: ${level}. Available: ${capability.nonOffLevels.join(", ")}.`}function parseSingleArgument(args){let trimmed=args.trim();if(trimmed.length===0)return"";let tokens=trimmed.split(/\s+/);return tokens.length===1?tokens[0]??"":null}function clampToNonOff(level,capability){let supported=new Set(capability.nonOffLevels);if(supported.has(level))return level;let index=EFFORT_LEVELS.indexOf(level);if(index===-1)return capability.nonOffLevels[0];for(let i=index;i<EFFORT_LEVELS.length;i++){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}for(let i=index-1;i>=0;i--){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}return capability.nonOffLevels[0]}function resolvePreferredOnLevel(ctx,model,capability){let settingsManager=SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()}),lastOnLevel=settingsManager.getModelLastOnThinkingLevel(model.provider,model.id),remembered=settingsManager.getModelThinkingLevel(model.provider,model.id),globalDefault=settingsManager.getDefaultThinkingLevel(),preferred=lastOnLevel??nonOff(remembered)??nonOff(model.defaultThinkingLevel)??nonOff(globalDefault)??DEFAULT_ON_LEVEL;return clampToNonOff(preferred,capability)}function createSettingsManager(ctx){return SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()})}function nonOff(level){return level!==void 0&&level!=="off"?level:void 0}function toCompletions(values,prefix){let normalizedPrefix=prefix.trim(),matches=values.filter(value2=>value2.startsWith(normalizedPrefix));return matches.length>0?matches.map(value2=>({value:value2,label:value2})):null}function reasoningExtension(pi){let currentModel;pi.on("session_start",(_event,ctx)=>{currentModel=ctx.model}),pi.on("model_select",event=>{currentModel=event.model}),pi.registerCommand("reasoning",{description:"Show or toggle reasoning for the current model",argumentHint:"[on|off]",requiresArguments:!1,getArgumentCompletions:prefix=>toCompletions(REASONING_ARGUMENTS,prefix),handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!REASONING_ARGUMENTS.includes(argument)){ctx.ui.notify(REASONING_USAGE,"error");return}let capability=classifyReasoningCapability(model),currentLevel=pi.getThinkingLevel();if(argument===""){ctx.ui.notify(reasoningStatus(currentLevel),"info");return}if(argument==="off"){if(capability.kind==="none"){ctx.ui.notify(reasoningStatus("off"),"info");return}if(capability.kind==="always-on"){ctx.ui.notify(`Reasoning cannot be disabled for ${modelKey(model)}.`,"error");return}if(currentLevel!=="off"){let settingsManager2=createSettingsManager(ctx);settingsManager2.setModelLastOnThinkingLevel(model.provider,model.id,currentLevel),await settingsManager2.flush()}pi.setThinkingLevel("off"),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(currentLevel!=="off"){pi.setThinkingLevel(currentLevel),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}let target=resolvePreferredOnLevel(ctx,model,capability);if(target===void 0){ctx.ui.notify(noReasoningMessage(model),"error");return}pi.setSessionThinkingLevel(target);let settingsManager=createSettingsManager(ctx);settingsManager.setModelThinkingLevel(model.provider,model.id,target,{preserveLastOn:!0}),settingsManager.setDefaultThinkingLevel(target),await settingsManager.flush(),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info")}}),pi.registerCommand("efforts",{description:"Show or set the reasoning effort for the current model",argumentHint:"[minimal|low|medium|high|xhigh|max]",requiresArguments:!1,getArgumentCompletions:prefix=>{let capability=currentModel?classifyReasoningCapability(currentModel):void 0;return capability?.kind!=="graded"?null:toCompletions(capability.nonOffLevels,prefix)},handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!EFFORT_TOKENS.includes(argument)){ctx.ui.notify(EFFORTS_USAGE,"error");return}let capability=classifyReasoningCapability(model);if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(capability.kind==="on-off"){ctx.ui.notify(onOffOnlyMessage(model),"error");return}if(argument===""){ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info");return}let level=argument;if(!capability.nonOffLevels.includes(level)){ctx.ui.notify(`Reasoning effort "${level}" is not supported by ${modelKey(model)}. Available: ${capability.nonOffLevels.join(", ")}.`,"error");return}pi.setThinkingLevel(level),ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info")}})}var FLAG_NAME2="no-recommended-models",AUTO_SWITCH_PROVENANCE=new Set(["provider-default","first-available"]),MODEL_ID_SUFFIXES=["-ultrafast","-unlocked","-256k","-fast"],CLAUDE_PROVIDERS=["anthropic-subscription","anthropic","anthropic-api","github-copilot","opencode"],KIMI_PROVIDERS=["kimi-coding","kimi-for-coding","moonshotai","opencode-go"],GPT_PROVIDERS=["chatgpt-subscription","openai","github-copilot","opencode"],GLM_PROVIDERS=["zai-coding-plan","opencode-go"],RECOMMENDED_DEFAULT_MODELS=[["claude-opus-5-5","medium",CLAUDE_PROVIDERS],["claude-fable-5-1","xhigh",CLAUDE_PROVIDERS],["kimi-k3","max",KIMI_PROVIDERS],["gpt-6-astra","xhigh",GPT_PROVIDERS],["gpt-6.1-sol","medium",GPT_PROVIDERS],["glm-5.3","max",GLM_PROVIDERS]],DEFAULT_RECOMMENDATIONS=RECOMMENDED_DEFAULT_MODELS.map(([modelId,thinkingLevel,providers])=>({modelId,thinkingLevel,providers})),DEFAULT_RECOMMENDATIONS_BY_MODEL_ID=new Map(DEFAULT_RECOMMENDATIONS.map(recommendation=>[recommendation.modelId,recommendation]));function canonicalModelId(modelId){let canonical=modelId.toLowerCase(),strippedSuffix=!0;for(;strippedSuffix;){strippedSuffix=!1;for(let suffix of MODEL_ID_SUFFIXES)if(canonical.endsWith(suffix)){canonical=canonical.slice(0,-suffix.length),strippedSuffix=!0;break}}return canonical==="k3"?"kimi-k3":canonical}function recommendationsFor(configuredModelIds){return configuredModelIds===void 0?DEFAULT_RECOMMENDATIONS:configuredModelIds.map(canonicalModelId).filter(modelId=>modelId.length>0).map(modelId=>DEFAULT_RECOMMENDATIONS_BY_MODEL_ID.get(modelId)??{modelId,thinkingLevel:"medium",providers:[]})}function findAvailableRecommendation(recommendations,ctx){let available=ctx.modelRegistry.getAvailable().filter(model=>ctx.modelRegistry.hasConfiguredAuth(model));for(let recommendation of recommendations){let candidates=available.filter(candidate=>canonicalModelId(candidate.id)===recommendation.modelId),model=recommendation.providers.length===0?candidates[0]:recommendation.providers.map(provider=>candidates.find(candidate=>candidate.provider===provider)).find(candidate=>candidate!==void 0);if(model)return{recommendation,model}}}function isRecommended(model,recommendations){return model!==void 0&&recommendations.some(recommendation=>canonicalModelId(model.id)===recommendation.modelId)}function nonRecommendedModelWarning(model){return`Non-recommended model '${model?.id??"<none>"}': odd behavior is the default state; a working session is the anomaly.`}function recommendedModelsExtension(pi){pi.registerFlag(FLAG_NAME2,{type:"boolean",default:!1,description:"Disable recommended model selection for this run."});let initialized=!1,disabled2=!1,disarmed=!1,automaticSelection=!1,warningShown=!1,canAutoSwitch=!1,recommendations=DEFAULT_RECOMMENDATIONS,warnWhenNoRecommendationIsAvailable=ctx=>{warningShown||findAvailableRecommendation(recommendations,ctx)||(warningShown=!0,ctx.ui.notify(nonRecommendedModelWarning(ctx.model),"warning"))};pi.on("session_start",async(event,ctx)=>{if(initialized)return;initialized=!0;let settingsManager=SettingsManager.create(ctx.cwd);if(disabled2=pi.getFlag(FLAG_NAME2)===!0||settingsManager.getWarnings().offRecommendedModel===!0,recommendations=recommendationsFor(settingsManager.getRecommendedModels()),canAutoSwitch=ctx.mode!=="app-server"&&event.initialModelProvenance!==void 0&&AUTO_SWITCH_PROVENANCE.has(event.initialModelProvenance),disabled2||!canAutoSwitch||isRecommended(ctx.model,recommendations))return;let target=findAvailableRecommendation(recommendations,ctx);if(!target){warnWhenNoRecommendationIsAvailable(ctx);return}let persistAsDefault=ctx.mode==="tui";automaticSelection=!0;try{if(!(persistAsDefault?await pi.setModel(target.model):await pi.setSessionModel(target.model))){warnWhenNoRecommendationIsAvailable(ctx);return}persistAsDefault?pi.setThinkingLevel(target.recommendation.thinkingLevel):pi.setSessionThinkingLevel(target.recommendation.thinkingLevel),ctx.ui.notify(`Switched to recommended model '${target.model.id}'.`,"info")}finally{automaticSelection=!1}}),pi.on("model_select",(event,ctx)=>{if(!(!initialized||disabled2||disarmed||automaticSelection||!canAutoSwitch)){if(event.source==="set"||event.source==="cycle"){disarmed=!0;return}isRecommended(event.model,recommendations)||warnWhenNoRecommendationIsAvailable(ctx)}})}function redraws_default(pi){pi.registerCommand("tui",{description:"Show TUI stats",handler:async(_args,ctx)=>{if(!ctx.hasUI)return;let redraws=0;await ctx.ui.custom((tui,_theme,_keybindings,done)=>(redraws=tui.fullRedraws,done(void 0),new Text("",0,0))),ctx.ui.notify(`TUI full redraws: ${redraws}`,"info")}})}function createRepositoryIdentityExtension(run2){return pi=>{let generation2=0;pi.on("session_start",async(_event,ctx)=>{let current=++generation2;if(ctx.sessionManager.getSessionFile()===void 0)return;let identity=await readRepositoryIdentity(ctx.cwd,run2);current!==generation2||identity===void 0||sameRepositoryIdentity(latestRecordedIdentity(ctx.sessionManager),identity)||pi.appendEntry(REPOSITORY_IDENTITY_ENTRY_TYPE,identity)}),pi.on("session_shutdown",()=>{generation2++})}}function latestRecordedIdentity(sessionManager){let recorded;for(let entry of sessionManager.getEntries())entry.type==="custom"&&entry.customType===REPOSITORY_IDENTITY_ENTRY_TYPE&&(recorded=parseRepositoryIdentity(entry.data)??recorded);return recorded}var repository_identity_default=createRepositoryIdentityExtension();import{readFileSync as readFileSync31,realpathSync as realpathSync7}from"node:fs";import{isAbsolute as isAbsolute15,relative as relative15}from"node:path";var RULE_ACTIVATION_ENTRY_TYPE="rule-activation";function parseRuleActivationDetails(value2){if(!isObject(value2))return;switch(Reflect.get(value2,"kind")){case"project-rules":return parseProjectRulesActivation(value2);case"ttsr":return parseTtsrActivation(value2);default:return}}function parseProjectRulesActivation(value2){let targetPath=Reflect.get(value2,"targetPath"),rules=stringList(Reflect.get(value2,"rules"));if(typeof targetPath!="string"||targetPath.length===0||rules===void 0)return;let toolCallId=Reflect.get(value2,"toolCallId");return{kind:"project-rules",targetPath,rules,...typeof toolCallId=="string"&&toolCallId.length>0?{toolCallId}:{}}}function parseTtsrActivation(value2){let owner=Reflect.get(value2,"owner"),rules=stringList(Reflect.get(value2,"rules")),remediation=Reflect.get(value2,"remediation");if(!(typeof owner!="string"||owner.length===0||rules===void 0||remediation!=="nudge"&&remediation!=="provider-error"))return{kind:"ttsr",owner,rules,remediation}}function stringList(value2){if(!(!Array.isArray(value2)||value2.length===0||!value2.every(entry=>typeof entry=="string"&&entry.length>0)))return value2}function isObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}var renderRuleActivationEntry=noticeEntryRenderer(entry=>{let details=parseRuleActivationDetails(entry.data);if(details!==void 0)return{title:titleLine3(details),why:summaryLine(details),expandedLine:detailLine(details)}});function titleLine3(details){switch(details.kind){case"project-rules":return`\u25CF Project rules \xB7 ${details.targetPath}`;case"ttsr":return`\u26A0 Stream rule \xB7 ${details.owner}`}}function summaryLine(details){switch(details.kind){case"project-rules":{let noun=details.rules.length===1?"instruction":"instructions";return`${details.rules.length} ${noun} matched and injected for this tool result.`}case"ttsr":return details.remediation==="nudge"?"Output interrupted; a corrective nudge was queued.":"Corrupted generation discarded; bounded provider retry started."}}function detailLine(details){switch(details.kind){case"project-rules":return details.rules.map(rule=>`rule ${rule}`).join(`
2088
+ `)??"":"",rebuildFromSession=ctx=>{if(!ctx.hasUI)return;let lastMatch=[...ctx.sessionManager.getEntries()].reverse().find(entry=>{if(entry.type!=="message"||entry.message.role!=="user")return!1;let text3=getUserText(entry.message.content);return!!extractPromptMatch(text3)}),content=lastMatch?.type==="message"&&lastMatch.message.role==="user"?lastMatch.message.content:void 0,text2=getUserText(content),match=text2?extractPromptMatch(text2):void 0;if(!match){ctx.ui.setWidget("prompt-url",void 0);return}setWidget(ctx,match),applySessionName(ctx,match),fetchGhMetadata(pi,match.kind,match.url).then(meta=>{let title=meta?.title?.trim(),authorText=formatAuthor(meta?.author);setWidget(ctx,match,title,authorText),applySessionName(ctx,match,title)})};pi.on("session_start",async(_event,ctx)=>{rebuildFromSession(ctx)})}var EFFORT_LEVELS=["minimal","low","medium","high","xhigh","max"],EFFORT_TOKENS=["off",...EFFORT_LEVELS],REASONING_ARGUMENTS=["on","off"],REASONING_USAGE="Usage: /reasoning [on|off]",EFFORTS_USAGE="Usage: /efforts [minimal|low|medium|high|xhigh|max]",DEFAULT_ON_LEVEL="medium";function modelKey(model){return`${model.provider}/${model.id}`}function noReasoningMessage(model){return`Model ${modelKey(model)} does not support reasoning.`}function onOffOnlyMessage(model){return`Reasoning effort is not configurable for ${modelKey(model)}; this model supports on/off only. Use /reasoning on or /reasoning off.`}function reasoningStatus(level){return level==="off"?"Reasoning: off.":`Reasoning: on (${level}).`}function effortsStatus(level,capability){return`Reasoning effort: ${level}. Available: ${capability.nonOffLevels.join(", ")}.`}function parseSingleArgument(args){let trimmed=args.trim();if(trimmed.length===0)return"";let tokens=trimmed.split(/\s+/);return tokens.length===1?tokens[0]??"":null}function clampToNonOff(level,capability){let supported=new Set(capability.nonOffLevels);if(supported.has(level))return level;let index=EFFORT_LEVELS.indexOf(level);if(index===-1)return capability.nonOffLevels[0];for(let i=index;i<EFFORT_LEVELS.length;i++){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}for(let i=index-1;i>=0;i--){let candidate=EFFORT_LEVELS[i];if(candidate&&supported.has(candidate))return candidate}return capability.nonOffLevels[0]}function resolvePreferredOnLevel(ctx,model,capability){let settingsManager=SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()}),lastOnLevel=settingsManager.getModelLastOnThinkingLevel(model.provider,model.id),remembered=settingsManager.getModelThinkingLevel(model.provider,model.id),globalDefault=settingsManager.getDefaultThinkingLevel(),preferred=lastOnLevel??nonOff(remembered)??nonOff(model.defaultThinkingLevel)??nonOff(globalDefault)??DEFAULT_ON_LEVEL;return clampToNonOff(preferred,capability)}function createSettingsManager(ctx){return SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()})}function nonOff(level){return level!==void 0&&level!=="off"?level:void 0}function toCompletions(values,prefix){let normalizedPrefix=prefix.trim(),matches=values.filter(value2=>value2.startsWith(normalizedPrefix));return matches.length>0?matches.map(value2=>({value:value2,label:value2})):null}function reasoningExtension(pi){let currentModel;pi.on("session_start",(_event,ctx)=>{currentModel=ctx.model}),pi.on("model_select",event=>{currentModel=event.model}),pi.registerCommand("reasoning",{description:"Show or toggle reasoning for the current model",argumentHint:"[on|off]",requiresArguments:!1,getArgumentCompletions:prefix=>toCompletions(REASONING_ARGUMENTS,prefix),handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!REASONING_ARGUMENTS.includes(argument)){ctx.ui.notify(REASONING_USAGE,"error");return}let capability=classifyReasoningCapability(model),currentLevel=pi.getThinkingLevel();if(argument===""){ctx.ui.notify(reasoningStatus(currentLevel),"info");return}if(argument==="off"){if(capability.kind==="none"){ctx.ui.notify(reasoningStatus("off"),"info");return}if(capability.kind==="always-on"){ctx.ui.notify(`Reasoning cannot be disabled for ${modelKey(model)}.`,"error");return}if(currentLevel!=="off"){let settingsManager2=createSettingsManager(ctx);settingsManager2.setModelLastOnThinkingLevel(model.provider,model.id,currentLevel),await settingsManager2.flush()}pi.setThinkingLevel("off"),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(currentLevel!=="off"){pi.setThinkingLevel(currentLevel),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info");return}let target=resolvePreferredOnLevel(ctx,model,capability);if(target===void 0){ctx.ui.notify(noReasoningMessage(model),"error");return}pi.setSessionThinkingLevel(target);let settingsManager=createSettingsManager(ctx);settingsManager.setModelThinkingLevel(model.provider,model.id,target,{preserveLastOn:!0}),settingsManager.setDefaultThinkingLevel(target),await settingsManager.flush(),ctx.ui.notify(reasoningStatus(pi.getThinkingLevel()),"info")}}),pi.registerCommand("efforts",{description:"Show or set the reasoning effort for the current model",argumentHint:"[minimal|low|medium|high|xhigh|max]",requiresArguments:!1,getArgumentCompletions:prefix=>{let capability=currentModel?classifyReasoningCapability(currentModel):void 0;return capability?.kind!=="graded"?null:toCompletions(capability.nonOffLevels,prefix)},handler:async(args,ctx)=>{let model=ctx.model;if(!model){ctx.ui.notify("No model is active.","error");return}currentModel=model;let argument=parseSingleArgument(args);if(argument===null||argument!==""&&!EFFORT_TOKENS.includes(argument)){ctx.ui.notify(EFFORTS_USAGE,"error");return}let capability=classifyReasoningCapability(model);if(capability.kind==="none"){ctx.ui.notify(noReasoningMessage(model),"error");return}if(capability.kind==="on-off"){ctx.ui.notify(onOffOnlyMessage(model),"error");return}if(argument===""){ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info");return}let level=argument;if(!capability.nonOffLevels.includes(level)){ctx.ui.notify(`Reasoning effort "${level}" is not supported by ${modelKey(model)}. Available: ${capability.nonOffLevels.join(", ")}.`,"error");return}pi.setThinkingLevel(level),ctx.ui.notify(effortsStatus(pi.getThinkingLevel(),capability),"info")}})}var FLAG_NAME2="no-recommended-models",AUTO_SWITCH_PROVENANCE=new Set(["provider-default","first-available"]),MODEL_ID_SUFFIXES=["-ultrafast","-unlocked","-256k","-fast"],CLAUDE_PROVIDERS=["anthropic-subscription","anthropic","anthropic-api","github-copilot","opencode"],KIMI_PROVIDERS=["kimi-coding","kimi-for-coding","moonshotai","opencode-go"],GPT_PROVIDERS=["chatgpt-subscription","openai","github-copilot","opencode"],GLM_PROVIDERS=["zai-coding-plan","opencode-go"],RECOMMENDED_DEFAULT_MODELS=[["claude-opus-5-5","medium",CLAUDE_PROVIDERS],["claude-fable-5-1","xhigh",CLAUDE_PROVIDERS],["kimi-k3","max",KIMI_PROVIDERS],["gpt-6-astra","xhigh",GPT_PROVIDERS],["gpt-6.1-sol","medium",GPT_PROVIDERS],["glm-5.3","max",GLM_PROVIDERS]],DEFAULT_RECOMMENDATIONS=RECOMMENDED_DEFAULT_MODELS.map(([modelId,thinkingLevel,providers])=>({modelId,thinkingLevel,providers})),DEFAULT_RECOMMENDATIONS_BY_MODEL_ID=new Map(DEFAULT_RECOMMENDATIONS.map(recommendation=>[recommendation.modelId,recommendation]));function canonicalModelId(modelId){let canonical=modelId.toLowerCase(),strippedSuffix=!0;for(;strippedSuffix;){strippedSuffix=!1;for(let suffix of MODEL_ID_SUFFIXES)if(canonical.endsWith(suffix)){canonical=canonical.slice(0,-suffix.length),strippedSuffix=!0;break}}return canonical==="k3"?"kimi-k3":canonical}function recommendationsFor(configuredModelIds){return configuredModelIds===void 0?DEFAULT_RECOMMENDATIONS:configuredModelIds.map(canonicalModelId).filter(modelId=>modelId.length>0).map(modelId=>DEFAULT_RECOMMENDATIONS_BY_MODEL_ID.get(modelId)??{modelId,thinkingLevel:"medium",providers:[]})}function findAvailableRecommendation(recommendations,ctx){let available=ctx.modelRegistry.getAvailable().filter(model=>ctx.modelRegistry.hasConfiguredAuth(model));for(let recommendation of recommendations){let candidates=available.filter(candidate=>canonicalModelId(candidate.id)===recommendation.modelId),model=recommendation.providers.length===0?candidates[0]:recommendation.providers.map(provider=>candidates.find(candidate=>candidate.provider===provider)).find(candidate=>candidate!==void 0);if(model)return{recommendation,model}}}function isRecommended(model,recommendations){return model!==void 0&&recommendations.some(recommendation=>canonicalModelId(model.id)===recommendation.modelId)}function nonRecommendedModelWarning(model){return`Non-recommended model '${model?.id??"<none>"}': odd behavior is the default state; a working session is the anomaly.`}function recommendedModelsExtension(pi){pi.registerFlag(FLAG_NAME2,{type:"boolean",default:!1,description:"Disable recommended model selection for this run."});let initialized=!1,disabled2=!1,disarmed=!1,automaticSelection=!1,warningShown=!1,canAutoSwitch=!1,recommendations=DEFAULT_RECOMMENDATIONS,warnWhenNoRecommendationIsAvailable=ctx=>{warningShown||findAvailableRecommendation(recommendations,ctx)||(warningShown=!0,ctx.ui.notify(nonRecommendedModelWarning(ctx.model),"warning"))};pi.on("session_start",async(event,ctx)=>{if(initialized)return;initialized=!0;let settingsManager=SettingsManager.create(ctx.cwd);if(disabled2=pi.getFlag(FLAG_NAME2)===!0||settingsManager.getWarnings().offRecommendedModel===!0,recommendations=recommendationsFor(settingsManager.getRecommendedModels()),canAutoSwitch=ctx.mode!=="app-server"&&event.initialModelProvenance!==void 0&&AUTO_SWITCH_PROVENANCE.has(event.initialModelProvenance),disabled2||!canAutoSwitch||isRecommended(ctx.model,recommendations))return;let target=findAvailableRecommendation(recommendations,ctx);if(!target){warnWhenNoRecommendationIsAvailable(ctx);return}let persistAsDefault=ctx.mode==="tui";automaticSelection=!0;try{if(!(persistAsDefault?await pi.setModel(target.model):await pi.setSessionModel(target.model))){warnWhenNoRecommendationIsAvailable(ctx);return}persistAsDefault?pi.setThinkingLevel(target.recommendation.thinkingLevel):pi.setSessionThinkingLevel(target.recommendation.thinkingLevel),ctx.ui.notify(`Switched to recommended model '${target.model.id}'.`,"info")}finally{automaticSelection=!1}}),pi.on("model_select",(event,ctx)=>{if(!(!initialized||disabled2||disarmed||automaticSelection||!canAutoSwitch)){if(event.source==="set"||event.source==="cycle"){disarmed=!0;return}isRecommended(event.model,recommendations)||warnWhenNoRecommendationIsAvailable(ctx)}})}function redraws_default(pi){pi.registerCommand("tui",{description:"Show TUI stats",handler:async(_args,ctx)=>{if(!ctx.hasUI)return;let redraws=0;await ctx.ui.custom((tui,_theme,_keybindings,done)=>(redraws=tui.fullRedraws,done(void 0),new Text("",0,0))),ctx.ui.notify(`TUI full redraws: ${redraws}`,"info")}})}function createRepositoryIdentityExtension(run2){return pi=>{let generation2=0;pi.on("session_start",async(_event,ctx)=>{let current=++generation2;if(ctx.sessionManager.getSessionFile()===void 0)return;let identity=await readRepositoryIdentity(ctx.cwd,run2);current!==generation2||identity===void 0||sameRepositoryIdentity(latestRecordedIdentity(ctx.sessionManager),identity)||pi.appendEntry(REPOSITORY_IDENTITY_ENTRY_TYPE,identity)}),pi.on("session_shutdown",()=>{generation2++})}}function latestRecordedIdentity(sessionManager){let recorded;for(let entry of sessionManager.getEntries())entry.type==="custom"&&entry.customType===REPOSITORY_IDENTITY_ENTRY_TYPE&&(recorded=parseRepositoryIdentity(entry.data)??recorded);return recorded}var repository_identity_default=createRepositoryIdentityExtension();import{readFileSync as readFileSync31,realpathSync as realpathSync7}from"node:fs";import{isAbsolute as isAbsolute16,relative as relative15}from"node:path";var RULE_ACTIVATION_ENTRY_TYPE="rule-activation";function parseRuleActivationDetails(value2){if(!isObject(value2))return;switch(Reflect.get(value2,"kind")){case"project-rules":return parseProjectRulesActivation(value2);case"ttsr":return parseTtsrActivation(value2);default:return}}function parseProjectRulesActivation(value2){let targetPath=Reflect.get(value2,"targetPath"),rules=stringList(Reflect.get(value2,"rules"));if(typeof targetPath!="string"||targetPath.length===0||rules===void 0)return;let toolCallId=Reflect.get(value2,"toolCallId");return{kind:"project-rules",targetPath,rules,...typeof toolCallId=="string"&&toolCallId.length>0?{toolCallId}:{}}}function parseTtsrActivation(value2){let owner=Reflect.get(value2,"owner"),rules=stringList(Reflect.get(value2,"rules")),remediation=Reflect.get(value2,"remediation");if(!(typeof owner!="string"||owner.length===0||rules===void 0||remediation!=="nudge"&&remediation!=="provider-error"))return{kind:"ttsr",owner,rules,remediation}}function stringList(value2){if(!(!Array.isArray(value2)||value2.length===0||!value2.every(entry=>typeof entry=="string"&&entry.length>0)))return value2}function isObject(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}var renderRuleActivationEntry=noticeEntryRenderer(entry=>{let details=parseRuleActivationDetails(entry.data);if(details!==void 0)return{title:titleLine3(details),why:summaryLine(details),expandedLine:detailLine(details)}});function titleLine3(details){switch(details.kind){case"project-rules":return`\u25CF Project rules \xB7 ${details.targetPath}`;case"ttsr":return`\u26A0 Stream rule \xB7 ${details.owner}`}}function summaryLine(details){switch(details.kind){case"project-rules":{let noun=details.rules.length===1?"instruction":"instructions";return`${details.rules.length} ${noun} matched and injected for this tool result.`}case"ttsr":return details.remediation==="nudge"?"Output interrupted; a corrective nudge was queued.":"Corrupted generation discarded; bounded provider retry started."}}function detailLine(details){switch(details.kind){case"project-rules":return details.rules.map(rule=>`rule ${rule}`).join(`
2089
2089
  `);case"ttsr":return`remediation ${details.remediation} \xB7 observed ${details.rules.join(", ")}`}}function registerRuleActivationRenderer(pi){pi.registerEntryRenderer(RULE_ACTIVATION_ENTRY_TYPE,renderRuleActivationEntry)}function appendRuleActivation(pi,details){pi.appendEntry(RULE_ACTIVATION_ENTRY_TYPE,details)}var RULE_SUBCOMMANDS=["list","show","paths","status"];function registerSlashCommands(pi,engine){pi.registerCommand("rules",{description:"Inspect loaded pi-rules.",getArgumentCompletions:prefix=>{let completions=RULE_SUBCOMMANDS.filter(subcommand=>subcommand.startsWith(prefix)).map(subcommand=>({value:subcommand,label:subcommand}));return completions.length>0?completions:null},handler:async(args,ctx)=>{let tokens=args.trim().length===0?[]:args.trim().split(/\s+/),subcommand=tokens[0]??"",loaded2=engine.loadStaticRules(ctx.cwd);if(subcommand===""||subcommand==="status"){notify(ctx,buildSummaryText(loaded2.rules,loaded2.diagnostics));return}if(subcommand==="list"){notify(ctx,formatRuleList(loaded2.rules));return}if(subcommand==="show"){let id=tokens[1];if(id===void 0){notify(ctx,"Rule ID is required","error");return}let rule=findRuleById(loaded2.rules,id);if(rule===null){notify(ctx,`Rule not found: ${id}`,"error");return}notify(ctx,rule.body);return}if(subcommand==="paths"){notify(ctx,loaded2.rules.map(rule=>rule.path).join(`
2090
2090
  `));return}notify(ctx,`Unknown /rules subcommand: ${subcommand}`,"error")}}),pi.registerCommand("reload-rules",{description:"Reload pi-rules for the current session.",handler:async(_args,ctx)=>{engine.resetSession(ctx.cwd);let loaded2=engine.loadStaticRules(ctx.cwd);notify(ctx,buildReloadText(loaded2.rules,loaded2.diagnostics))}})}function notify(ctx,message,severity2="info"){ctx.ui.notify(message,severity2)}function buildSummaryText(rules,diagnostics){return appendDiagnostics(`pi-rules: ${rules.length} rules from ${countSources(rules)} sources`,diagnostics)}function buildReloadText(rules,diagnostics){return appendDiagnostics(`Reloaded ${rules.length} rules from ${countSources(rules)} sources`,diagnostics)}function appendDiagnostics(text2,diagnostics){return diagnostics.length===0?text2:`${text2}, ${diagnostics.length} diagnostics`}function countSources(rules){return new Set(rules.map(rule=>rule.source)).size}function formatRuleList(rules){return rules.map(rule=>`${rule.relativePath} [${rule.source}, ${formatMatchReason(rule.matchReason)}]`).join(`
2091
- `)}function formatMatchReason(matchReason){return typeof matchReason=="string"?matchReason:matchReason.kind==="no-match"?matchReason.kind:`${matchReason.kind}:${matchReason.pattern}`}function findRuleById(rules,id){let exactMatch=rules.find(rule=>rule.relativePath===id);if(exactMatch!==void 0)return exactMatch;let suffixMatches=rules.filter(rule=>rule.relativePath.endsWith(id));return suffixMatches.length===1?suffixMatches[0]??null:null}import{realpathSync as realpathSync6,statSync as statSync15}from"node:fs";import{basename as basename15,dirname as dirname34,isAbsolute as isAbsolute13,join as join51,relative as relative14,resolve as resolve27}from"node:path";function createSessionState(cwd){return{cwd,staticDedup:new Set,dynamicDedup:new Map,dynamicTargetFingerprints:new Map,loadedRules:[],diagnostics:[]}}function staticDedupKey(cwd,rulePath,contentHash){return`${cwd}::${rulePath}::${contentHash}`}function dynamicDedupKey(scopeKey,rulePath,contentHash){return`${scopeKey}::${rulePath}::${contentHash}`}function markStaticInjected(state,rule){let key=staticDedupKey(state.cwd??"",rule.realPath,rule.contentHash);return state.staticDedup.has(key)?!1:(state.staticDedup.add(key),!0)}function markDynamicInjected(state,scopeKey,rule){let keys=state.dynamicDedup.get(scopeKey);keys===void 0&&(keys=new Set,state.dynamicDedup.set(scopeKey,keys));let key=dynamicDedupKey(scopeKey,rule.realPath,rule.contentHash);return keys.has(key)?!1:(keys.add(key),!0)}function isStaticInjected(state,rule){return state.staticDedup.has(staticDedupKey(state.cwd??"",rule.realPath,rule.contentHash))}function isDynamicInjected(state,scopeKey,rule){return state.dynamicDedup.get(scopeKey)?.has(dynamicDedupKey(scopeKey,rule.realPath,rule.contentHash))===!0}function clearSession(state){state.staticDedup.clear(),state.dynamicDedup.clear(),state.dynamicTargetFingerprints.clear(),state.loadedRules.length=0,state.diagnostics.length=0}import{existsSync as existsSync26,realpathSync as realpathSync4,statSync as statSync13}from"node:fs";import{homedir as homedir7}from"node:os";import{dirname as dirname32,join as join49,posix as posix3,relative as relative13,resolve as resolve25}from"node:path";var UnsupportedRuleSourceError=class extends Error{constructor(message){super(message),this.name="UnsupportedRuleSourceError"}},RuleFrontmatterParseError=class extends Error{constructor(message){super(message),this.name="RuleFrontmatterParseError"}};import{existsSync as existsSync25,lstatSync as lstatSync5,readdirSync as readdirSync5,realpathSync as realpathSync3,statSync as statSync12}from"node:fs";import{isAbsolute as isAbsolute12,join as join48,resolve as resolve24}from"node:path";function scanRuleFiles(options){let rootPath=toAbsolutePath(options.rootDir);if(!existsSync25(rootPath))return[];let rootStats;try{rootStats=statSync12(rootPath)}catch{return[]}if(!rootStats.isDirectory())return[];let results=[],visitedDirectories=new Set,excludedDirs=new Set(options.excludedDirs??SCANNER_EXCLUDED_DIRS),maxDepth=options.maxDepth??10;return scanDirectory(rootPath,0,maxDepth,excludedDirs,visitedDirectories,results),results}function toAbsolutePath(filePath){return isAbsolute12(filePath)?filePath:resolve24(filePath)}function scanDirectory(directoryPath,depth,maxDepth,excludedDirs,visitedDirectories,results){let realDirectoryPath;try{realDirectoryPath=realpathSync3.native(directoryPath)}catch{return}if(visitedDirectories.has(realDirectoryPath))return;visitedDirectories.add(realDirectoryPath);let entries;try{entries=readdirSync5(directoryPath,{withFileTypes:!0}).sort((leftEntry,rightEntry)=>leftEntry.name.localeCompare(rightEntry.name))}catch{return}for(let entry of entries){let entryPath=join48(directoryPath,entry.name);if(entry.isDirectory()){!excludedDirs.has(entry.name)&&depth<maxDepth&&scanDirectory(entryPath,depth+1,maxDepth,excludedDirs,visitedDirectories,results);continue}if(entry.isSymbolicLink()){scanSymbolicLink(entryPath,entry.name,depth,maxDepth,excludedDirs,visitedDirectories,results);continue}entry.isFile()&&isRuleFile(entry.name)&&results.push({path:entryPath,realPath:resolveRealPath(entryPath)})}}function scanSymbolicLink(linkPath2,linkName,depth,maxDepth,excludedDirs,visitedDirectories,results){let targetStats;try{targetStats=statSync12(linkPath2)}catch{return}if(targetStats.isDirectory()){!excludedDirs.has(linkName)&&depth<maxDepth&&scanDirectory(linkPath2,depth+1,maxDepth,excludedDirs,visitedDirectories,results);return}targetStats.isFile()&&isRuleFile(linkName)&&results.push({path:linkPath2,realPath:resolveRealPath(linkPath2)})}function isRuleFile(fileName){return RULE_FILE_EXTENSIONS.some(extension=>fileName.endsWith(extension))}function resolveRealPath(filePath){try{let realPath=realpathSync3.native(filePath);return lstatSync5(filePath).isSymbolicLink()?realPath:filePath}catch{return filePath}}function createRuleDiscoveryCache(){return{scannedRuleFiles:new Map,singleFileInfo:new Map}}function findRuleCandidates(options){let skipUserHome=options.skipUserHome??!1;if(options.projectRoot===null&&skipUserHome)return[];let disabledSources=options.disabledSources??new Set,candidates=[],homeDirectory=resolve25(options.homeDir??homedir7());return options.projectRoot!==null&&candidates.push(...findProjectCandidates(options.projectRoot,options.targetFile,disabledSources,options.cache)),skipUserHome||candidates.push(...findUserHomeCandidates(homeDirectory,disabledSources,options.cache)),candidates}function findProjectCandidates(projectRoot2,targetFile,disabledSources,cache){let rootDirectory=resolve25(projectRoot2),walkDirectories=getWalkDirectories(rootDirectory,targetFile),candidates=[];for(let walkDirectory of walkDirectories)for(let[parentDirectory,subDirectory]of PROJECT_RULE_SUBDIRS){let source2=toProjectRuleSource(parentDirectory,subDirectory);if(disabledSources.has(source2))continue;let ruleDirectory=join49(walkDirectory.directory,parentDirectory,subDirectory);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache))candidates.push({path:scannedFile.path,realPath:resolveRealPath2(scannedFile.path),source:source2,distance:targetFile===null?0:walkDirectory.distance,isGlobal:!1,isSingleFile:!1,relativePath:toRelativePath(rootDirectory,scannedFile.path)})}for(let walkDirectory of walkDirectories)for(let ruleFile of PROJECT_SINGLE_FILES){let source2=toProjectSingleFileSource(ruleFile);if(disabledSources.has(source2))continue;let filePath=join49(walkDirectory.directory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache);fileInfo!==null&&candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source:source2,distance:targetFile===null?0:walkDirectory.distance,isGlobal:!1,isSingleFile:!0,relativePath:toRelativePath(rootDirectory,filePath)})}return candidates}function findUserHomeCandidates(homeDirectory,disabledSources,cache){let candidates=[];for(let ruleSubdir of USER_HOME_RULE_SUBDIRS){let source2=toUserHomeRuleSource(ruleSubdir);if(disabledSources.has(source2))continue;let ruleDirectory=join49(homeDirectory,ruleSubdir);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache))candidates.push({path:scannedFile.path,realPath:resolveRealPath2(scannedFile.path),source:source2,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!1,relativePath:toRelativePath(homeDirectory,scannedFile.path)})}for(let ruleFile of USER_HOME_SINGLE_FILES){let source2=toUserHomeSingleFileSource(ruleFile);if(disabledSources.has(source2))continue;let filePath=join49(homeDirectory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache);if(fileInfo!==null){candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source:source2,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!0,relativePath:toRelativePath(homeDirectory,filePath)});break}}return candidates}function scanRuleFilesCached(rootDir,cache){if(cache===void 0)return scanRuleFiles({rootDir});let cached=cache.scannedRuleFiles.get(rootDir);if(cached!==void 0)return cached;let scannedFiles=scanRuleFiles({rootDir});return cache.scannedRuleFiles.set(rootDir,scannedFiles),scannedFiles}function singleFileInfoCached(filePath,cache){if(cache===void 0)return readSingleFileInfo(filePath);let cached=cache.singleFileInfo.get(filePath);if(cached!==void 0)return cached;let fileInfo=readSingleFileInfo(filePath);return cache.singleFileInfo.set(filePath,fileInfo),fileInfo}function getWalkDirectories(projectRoot2,targetFile){if(targetFile===null)return[{directory:projectRoot2,distance:0}];let startDirectory=dirname32(resolve25(targetFile));if(!isSameOrChildPath(startDirectory,projectRoot2))return[{directory:projectRoot2,distance:0}];let walkDirectories=[],currentDirectory=startDirectory,distance=0;for(;walkDirectories.push({directory:currentDirectory,distance}),currentDirectory!==projectRoot2;){let parentDirectory=dirname32(currentDirectory);if(parentDirectory===currentDirectory)break;currentDirectory=parentDirectory,distance+=1}return walkDirectories}function isSameOrChildPath(childPath,parentPath){let childRelativePath=relative13(parentPath,childPath);return childRelativePath===""||!childRelativePath.startsWith("..")&&!childRelativePath.startsWith("/")}function readSingleFileInfo(filePath){if(!existsSync26(filePath))return null;try{if(!statSync13(filePath).isFile())return null}catch{return null}return{path:filePath,realPath:resolveRealPath2(filePath)}}function resolveRealPath2(filePath){try{return realpathSync4.native(filePath)}catch{return filePath}}function toRelativePath(rootDirectory,filePath){return posix3.normalize(relative13(rootDirectory,filePath).replace(/\\/g,"/"))}function toProjectRuleSource(parentDirectory,subDirectory){let source2=`${parentDirectory}/${subDirectory}`;switch(source2){case".pi/rules":case".omo/rules":case".claude/rules":case".cursor/rules":case".github/instructions":return source2;default:throw new UnsupportedRuleSourceError(`Unsupported project rule source: ${source2}`)}}function toProjectSingleFileSource(ruleFile){switch(ruleFile){case".github/copilot-instructions.md":case"AGENTS.md":case"CLAUDE.md":case"CONTEXT.md":return ruleFile;default:throw new UnsupportedRuleSourceError(`Unsupported project single-file source: ${ruleFile}`)}}function toUserHomeRuleSource(ruleSubdir){let source2=`~/${ruleSubdir}`;switch(source2){case"~/.pi/rules":case"~/.omo/rules":case"~/.opencode/rules":case"~/.claude/rules":return source2;default:throw new UnsupportedRuleSourceError(`Unsupported user-home rule source: ${source2}`)}}function toUserHomeSingleFileSource(ruleFile){let source2=`~/${ruleFile}`;switch(source2){case"~/.config/opencode/AGENTS.md":case"~/.claude/CLAUDE.md":return source2;default:throw new UnsupportedRuleSourceError(`Unsupported user-home single-file source: ${source2}`)}}function truncationNotice(relativePath){return TRUNCATION_NOTICE.replace("{path}",relativePath)}function safeSliceEnd(body,end){if(end<=0)return 0;let lastCodeUnit=body.charCodeAt(end-1);return lastCodeUnit>=55296&&lastCodeUnit<=56319?end-1:end}function truncateRule(body,options){if(body.length<=options.maxChars)return{body,truncated:!1,originalLength:body.length};let notice2=truncationNotice(options.relativePath);if(options.maxChars<notice2.length)return{body:notice2,truncated:!0,originalLength:body.length};let sliceEnd=safeSliceEnd(body,options.maxChars-notice2.length);return{body:`${body.slice(0,sliceEnd)}${notice2}`,truncated:!0,originalLength:body.length}}function truncateBudget(input){let results=[],remainingBudget=input.maxResultChars;for(let rule of input.rules){if(remainingBudget>=rule.body.length){results.push({body:rule.body,truncated:!1,relativePath:rule.relativePath}),remainingBudget-=rule.body.length;continue}let notice2=truncationNotice(rule.relativePath);if(remainingBudget<=notice2.length)break;let sliceEnd=safeSliceEnd(rule.body,remainingBudget-notice2.length),body=`${rule.body.slice(0,sliceEnd)}${notice2}`;results.push({body,truncated:!0,relativePath:rule.relativePath}),remainingBudget-=body.length}return results}function formatRule(rule){return`Instructions from: ${rule.path}
2091
+ `)}function formatMatchReason(matchReason){return typeof matchReason=="string"?matchReason:matchReason.kind==="no-match"?matchReason.kind:`${matchReason.kind}:${matchReason.pattern}`}function findRuleById(rules,id){let exactMatch=rules.find(rule=>rule.relativePath===id);if(exactMatch!==void 0)return exactMatch;let suffixMatches=rules.filter(rule=>rule.relativePath.endsWith(id));return suffixMatches.length===1?suffixMatches[0]??null:null}import{realpathSync as realpathSync6,statSync as statSync15}from"node:fs";import{basename as basename15,dirname as dirname34,isAbsolute as isAbsolute14,join as join51,relative as relative14,resolve as resolve27}from"node:path";function createSessionState(cwd){return{cwd,staticDedup:new Set,dynamicDedup:new Map,dynamicTargetFingerprints:new Map,loadedRules:[],diagnostics:[]}}function staticDedupKey(cwd,rulePath,contentHash){return`${cwd}::${rulePath}::${contentHash}`}function dynamicDedupKey(scopeKey,rulePath,contentHash){return`${scopeKey}::${rulePath}::${contentHash}`}function markStaticInjected(state,rule){let key=staticDedupKey(state.cwd??"",rule.realPath,rule.contentHash);return state.staticDedup.has(key)?!1:(state.staticDedup.add(key),!0)}function markDynamicInjected(state,scopeKey,rule){let keys=state.dynamicDedup.get(scopeKey);keys===void 0&&(keys=new Set,state.dynamicDedup.set(scopeKey,keys));let key=dynamicDedupKey(scopeKey,rule.realPath,rule.contentHash);return keys.has(key)?!1:(keys.add(key),!0)}function isStaticInjected(state,rule){return state.staticDedup.has(staticDedupKey(state.cwd??"",rule.realPath,rule.contentHash))}function isDynamicInjected(state,scopeKey,rule){return state.dynamicDedup.get(scopeKey)?.has(dynamicDedupKey(scopeKey,rule.realPath,rule.contentHash))===!0}function clearSession(state){state.staticDedup.clear(),state.dynamicDedup.clear(),state.dynamicTargetFingerprints.clear(),state.loadedRules.length=0,state.diagnostics.length=0}import{existsSync as existsSync26,realpathSync as realpathSync4,statSync as statSync13}from"node:fs";import{homedir as homedir7}from"node:os";import{dirname as dirname32,isAbsolute as isAbsolute13,join as join49,posix as posix3,relative as relative13,resolve as resolve25}from"node:path";var UnsupportedRuleSourceError=class extends Error{constructor(message){super(message),this.name="UnsupportedRuleSourceError"}},RuleFrontmatterParseError=class extends Error{constructor(message){super(message),this.name="RuleFrontmatterParseError"}};import{existsSync as existsSync25,lstatSync as lstatSync5,readdirSync as readdirSync5,realpathSync as realpathSync3,statSync as statSync12}from"node:fs";import{isAbsolute as isAbsolute12,join as join48,resolve as resolve24}from"node:path";function scanRuleFiles(options){let rootPath=toAbsolutePath(options.rootDir);if(!existsSync25(rootPath))return[];let rootStats;try{rootStats=statSync12(rootPath)}catch{return[]}if(!rootStats.isDirectory())return[];let results=[],visitedDirectories=new Set,excludedDirs=new Set(options.excludedDirs??SCANNER_EXCLUDED_DIRS),maxDepth=options.maxDepth??10;return scanDirectory(rootPath,0,maxDepth,excludedDirs,visitedDirectories,results),results}function toAbsolutePath(filePath){return isAbsolute12(filePath)?filePath:resolve24(filePath)}function scanDirectory(directoryPath,depth,maxDepth,excludedDirs,visitedDirectories,results){let realDirectoryPath;try{realDirectoryPath=realpathSync3.native(directoryPath)}catch{return}if(visitedDirectories.has(realDirectoryPath))return;visitedDirectories.add(realDirectoryPath);let entries;try{entries=readdirSync5(directoryPath,{withFileTypes:!0}).sort((leftEntry,rightEntry)=>leftEntry.name.localeCompare(rightEntry.name))}catch{return}for(let entry of entries){let entryPath=join48(directoryPath,entry.name);if(entry.isDirectory()){!excludedDirs.has(entry.name)&&depth<maxDepth&&scanDirectory(entryPath,depth+1,maxDepth,excludedDirs,visitedDirectories,results);continue}if(entry.isSymbolicLink()){scanSymbolicLink(entryPath,entry.name,depth,maxDepth,excludedDirs,visitedDirectories,results);continue}entry.isFile()&&isRuleFile(entry.name)&&results.push({path:entryPath,realPath:resolveRealPath(entryPath)})}}function scanSymbolicLink(linkPath2,linkName,depth,maxDepth,excludedDirs,visitedDirectories,results){let targetStats;try{targetStats=statSync12(linkPath2)}catch{return}if(targetStats.isDirectory()){!excludedDirs.has(linkName)&&depth<maxDepth&&scanDirectory(linkPath2,depth+1,maxDepth,excludedDirs,visitedDirectories,results);return}targetStats.isFile()&&isRuleFile(linkName)&&results.push({path:linkPath2,realPath:resolveRealPath(linkPath2)})}function isRuleFile(fileName){return RULE_FILE_EXTENSIONS.some(extension=>fileName.endsWith(extension))}function resolveRealPath(filePath){try{let realPath=realpathSync3.native(filePath);return lstatSync5(filePath).isSymbolicLink()?realPath:filePath}catch{return filePath}}function createRuleDiscoveryCache(){return{scannedRuleFiles:new Map,singleFileInfo:new Map}}function findRuleCandidates(options){let skipUserHome=options.skipUserHome??!1;if(options.projectRoot===null&&skipUserHome)return[];let disabledSources=options.disabledSources??new Set,candidates=[],homeDirectory=resolve25(options.homeDir??homedir7());return options.projectRoot!==null&&candidates.push(...findProjectCandidates(options.projectRoot,options.targetFile,disabledSources,options.cache)),skipUserHome||candidates.push(...findUserHomeCandidates(homeDirectory,disabledSources,options.cache)),candidates}function findProjectCandidates(projectRoot2,targetFile,disabledSources,cache){let rootDirectory=resolve25(projectRoot2),walkDirectories=getWalkDirectories(rootDirectory,targetFile),candidates=[];for(let walkDirectory of walkDirectories)for(let[parentDirectory,subDirectory]of PROJECT_RULE_SUBDIRS){let source2=toProjectRuleSource(parentDirectory,subDirectory);if(disabledSources.has(source2))continue;let ruleDirectory=join49(walkDirectory.directory,parentDirectory,subDirectory);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache))candidates.push({path:scannedFile.path,realPath:resolveRealPath2(scannedFile.path),source:source2,distance:targetFile===null?0:walkDirectory.distance,isGlobal:!1,isSingleFile:!1,relativePath:toRelativePath(rootDirectory,scannedFile.path)})}for(let walkDirectory of walkDirectories)for(let ruleFile of PROJECT_SINGLE_FILES){let source2=toProjectSingleFileSource(ruleFile);if(disabledSources.has(source2))continue;let filePath=join49(walkDirectory.directory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache);fileInfo!==null&&candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source:source2,distance:targetFile===null?0:walkDirectory.distance,isGlobal:!1,isSingleFile:!0,relativePath:toRelativePath(rootDirectory,filePath)})}return candidates}function findUserHomeCandidates(homeDirectory,disabledSources,cache){let candidates=[];for(let ruleSubdir of USER_HOME_RULE_SUBDIRS){let source2=toUserHomeRuleSource(ruleSubdir);if(disabledSources.has(source2))continue;let ruleDirectory=join49(homeDirectory,ruleSubdir);for(let scannedFile of scanRuleFilesCached(ruleDirectory,cache))candidates.push({path:scannedFile.path,realPath:resolveRealPath2(scannedFile.path),source:source2,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!1,relativePath:toRelativePath(homeDirectory,scannedFile.path)})}for(let ruleFile of USER_HOME_SINGLE_FILES){let source2=toUserHomeSingleFileSource(ruleFile);if(disabledSources.has(source2))continue;let filePath=join49(homeDirectory,ruleFile),fileInfo=singleFileInfoCached(filePath,cache);if(fileInfo!==null){candidates.push({path:fileInfo.path,realPath:fileInfo.realPath,source:source2,distance:GLOBAL_DISTANCE,isGlobal:!0,isSingleFile:!0,relativePath:toRelativePath(homeDirectory,filePath)});break}}return candidates}function scanRuleFilesCached(rootDir,cache){if(cache===void 0)return scanRuleFiles({rootDir});let cached=cache.scannedRuleFiles.get(rootDir);if(cached!==void 0)return cached;let scannedFiles=scanRuleFiles({rootDir});return cache.scannedRuleFiles.set(rootDir,scannedFiles),scannedFiles}function singleFileInfoCached(filePath,cache){if(cache===void 0)return readSingleFileInfo(filePath);let cached=cache.singleFileInfo.get(filePath);if(cached!==void 0)return cached;let fileInfo=readSingleFileInfo(filePath);return cache.singleFileInfo.set(filePath,fileInfo),fileInfo}function getWalkDirectories(projectRoot2,targetFile){if(targetFile===null)return[{directory:projectRoot2,distance:0}];let startDirectory=dirname32(resolve25(targetFile));if(!isSameOrChildPath(startDirectory,projectRoot2))return[{directory:projectRoot2,distance:0}];let walkDirectories=[],currentDirectory=startDirectory,distance=0;for(;walkDirectories.push({directory:currentDirectory,distance}),relative13(projectRoot2,currentDirectory)!=="";){let parentDirectory=dirname32(currentDirectory);if(parentDirectory===currentDirectory)break;currentDirectory=parentDirectory,distance+=1}return walkDirectories}function isSameOrChildPath(childPath,parentPath){let childRelativePath=relative13(parentPath,childPath);return childRelativePath===""||!childRelativePath.startsWith("..")&&!isAbsolute13(childRelativePath)}function readSingleFileInfo(filePath){if(!existsSync26(filePath))return null;try{if(!statSync13(filePath).isFile())return null}catch{return null}return{path:filePath,realPath:resolveRealPath2(filePath)}}function resolveRealPath2(filePath){try{return realpathSync4.native(filePath)}catch{return filePath}}function toRelativePath(rootDirectory,filePath){return posix3.normalize(relative13(rootDirectory,filePath).replace(/\\/g,"/"))}function toProjectRuleSource(parentDirectory,subDirectory){let source2=`${parentDirectory}/${subDirectory}`;switch(source2){case".pi/rules":case".omo/rules":case".claude/rules":case".cursor/rules":case".github/instructions":return source2;default:throw new UnsupportedRuleSourceError(`Unsupported project rule source: ${source2}`)}}function toProjectSingleFileSource(ruleFile){switch(ruleFile){case".github/copilot-instructions.md":case"AGENTS.md":case"CLAUDE.md":case"CONTEXT.md":return ruleFile;default:throw new UnsupportedRuleSourceError(`Unsupported project single-file source: ${ruleFile}`)}}function toUserHomeRuleSource(ruleSubdir){let source2=`~/${ruleSubdir}`;switch(source2){case"~/.pi/rules":case"~/.omo/rules":case"~/.opencode/rules":case"~/.claude/rules":return source2;default:throw new UnsupportedRuleSourceError(`Unsupported user-home rule source: ${source2}`)}}function toUserHomeSingleFileSource(ruleFile){let source2=`~/${ruleFile}`;switch(source2){case"~/.config/opencode/AGENTS.md":case"~/.claude/CLAUDE.md":return source2;default:throw new UnsupportedRuleSourceError(`Unsupported user-home single-file source: ${source2}`)}}function truncationNotice(relativePath){return TRUNCATION_NOTICE.replace("{path}",relativePath)}function safeSliceEnd(body,end){if(end<=0)return 0;let lastCodeUnit=body.charCodeAt(end-1);return lastCodeUnit>=55296&&lastCodeUnit<=56319?end-1:end}function truncateRule(body,options){if(body.length<=options.maxChars)return{body,truncated:!1,originalLength:body.length};let notice2=truncationNotice(options.relativePath);if(options.maxChars<notice2.length)return{body:notice2,truncated:!0,originalLength:body.length};let sliceEnd=safeSliceEnd(body,options.maxChars-notice2.length);return{body:`${body.slice(0,sliceEnd)}${notice2}`,truncated:!0,originalLength:body.length}}function truncateBudget(input){let results=[],remainingBudget=input.maxResultChars;for(let rule of input.rules){if(remainingBudget>=rule.body.length){results.push({body:rule.body,truncated:!1,relativePath:rule.relativePath}),remainingBudget-=rule.body.length;continue}let notice2=truncationNotice(rule.relativePath);if(remainingBudget<=notice2.length)break;let sliceEnd=safeSliceEnd(rule.body,remainingBudget-notice2.length),body=`${rule.body.slice(0,sliceEnd)}${notice2}`;results.push({body,truncated:!0,relativePath:rule.relativePath}),remainingBudget-=body.length}return results}function formatRule(rule){return`Instructions from: ${rule.path}
2092
2092
  ${rule.body}`}function formatWithinResultBudget(rules,options,render2){let bodyBudget=options.maxResultChars;for(;bodyBudget>0;){let truncatedRules=truncateRules(rules,{...options,maxResultChars:bodyBudget});if(truncatedRules.length===0)return"";let block=render2(truncatedRules),overflow=block.length-options.maxResultChars;if(overflow<=0)return block;bodyBudget=Math.max(0,bodyBudget-overflow)}return""}function truncateRules(rules,options){let perRuleTruncated=rules.map(rule=>({path:rule.path,relativePath:rule.relativePath,body:truncateRule(rule.body,{maxChars:options.maxRuleChars,relativePath:rule.relativePath}).body})),budgetedRules=truncateBudget({rules:perRuleTruncated.map(rule=>({body:rule.body,relativePath:rule.relativePath})),maxResultChars:options.maxResultChars}),truncatedRules=[];for(let index=0;index<budgetedRules.length;index+=1){let sourceRule=perRuleTruncated[index],budgetedRule=budgetedRules[index];sourceRule===void 0||budgetedRule===void 0||truncatedRules.push({path:sourceRule.path,relativePath:budgetedRule.relativePath,body:budgetedRule.body})}return truncatedRules}function formatStaticBlock(rules,options){return rules.length===0?"":formatWithinResultBudget(rules,options,truncatedRules=>{let body=neutralizeEnvelopeMarkers(`${PROJECT_RULES_HEADING}
2093
2093
  ${truncatedRules.map(formatRule).join(`
2094
2094
 
@@ -2109,7 +2109,7 @@ ${truncatedRules.map(formatRule).join(`
2109
2109
  `;function parseRule(content){let normalizedContent=stripBom3(content),openingLength=getOpeningDelimiterLength(normalizedContent);if(openingLength===0)return{frontmatter:{},body:normalizedContent};let closingDelimiter=findClosingDelimiter(normalizedContent,openingLength);if(closingDelimiter===null)return{frontmatter:{},body:normalizedContent,diagnostic:"Missing closing frontmatter delimiter"};let yamlContent=normalizedContent.slice(openingLength,closingDelimiter.start),body=normalizedContent.slice(closingDelimiter.bodyStart);try{return{frontmatter:parseYamlFrontmatter(yamlContent),body}}catch(error2){let message=error2 instanceof Error?error2.message:"Invalid YAML frontmatter";return{frontmatter:{},body:normalizedContent,diagnostic:`Malformed frontmatter: ${message}`}}}function stripBom3(content){return content.startsWith("\uFEFF")?content.slice(1):content}function getOpeningDelimiterLength(content){return content.startsWith(FRONTMATTER_OPENING_CRLF)?FRONTMATTER_OPENING_CRLF.length:content.startsWith(FRONTMATTER_OPENING)?FRONTMATTER_OPENING.length:0}function findClosingDelimiter(content,openingLength){let lineStart=openingLength;for(;lineStart<=content.length;){let nextNewline=content.indexOf(`
2110
2110
  `,lineStart),lineEnd=nextNewline===-1?content.length:nextNewline;if(content.slice(lineStart,lineEnd).replace(/\r$/,"")==="---")return{start:lineStart,bodyStart:nextNewline===-1?content.length:nextNewline+1};if(nextNewline===-1)break;lineStart=nextNewline+1}return null}function parseYamlFrontmatter(yamlContent){let lines=yamlContent.replace(/\r\n/g,`
2111
2111
  `).split(`
2112
- `),frontmatter={},globValues=[],lineIndex=0;for(;lineIndex<lines.length;){let rawLine=lines[lineIndex];if(rawLine===void 0)break;let line=stripComment(rawLine).trim();if(line.length===0){lineIndex+=1;continue}let colonIndex=line.indexOf(":");if(colonIndex===-1)throw new RuleFrontmatterParseError(`Expected key-value pair on line ${lineIndex+1}`);let key=line.slice(0,colonIndex).trim(),rawValue=line.slice(colonIndex+1).trim();if(key==="description"){frontmatter.description=parseStringValue(rawValue),lineIndex+=1;continue}if(key==="alwaysApply"){frontmatter.alwaysApply=parseBooleanValue(rawValue,lineIndex+1),lineIndex+=1;continue}if(key==="globs"||key==="paths"||key==="applyTo"){let parsed=parseGlobValue(rawValue,lines,lineIndex);for(let glob of parsed.values)globValues.includes(glob)||globValues.push(glob);lineIndex+=parsed.consumed;continue}lineIndex+=1}if(globValues.length===1){let singleGlob=globValues[0];singleGlob!==void 0&&(frontmatter.globs=singleGlob)}else globValues.length>1&&(frontmatter.globs=globValues);return frontmatter}function parseBooleanValue(value2,lineNumber){if(value2==="true")return!0;if(value2==="false")return!1;throw new RuleFrontmatterParseError(`Expected boolean on line ${lineNumber}`)}function parseGlobValue(rawValue,lines,lineIndex){if(rawValue.startsWith("["))return{values:parseInlineArray(rawValue),consumed:1};if(rawValue.length===0)return parseMultilineArray(lines,lineIndex);let value2=parseStringValue(rawValue);return value2.includes(",")?{values:value2.split(",").map(item=>item.trim()).filter(Boolean),consumed:1}:{values:[value2],consumed:1}}function parseMultilineArray(lines,lineIndex){let values=[],consumed=1;for(let index=lineIndex+1;index<lines.length;index+=1){let rawLine=lines[index];if(rawLine===void 0)break;let lineWithoutComment=stripComment(rawLine);if(lineWithoutComment.trim().length===0){consumed+=1;continue}let arrayItem=lineWithoutComment.match(/^\s+-\s*(.*)$/);if(arrayItem===null)break;values.push(parseStringValue(arrayItem[1]??"")),consumed+=1}return{values:values.filter(Boolean),consumed}}function parseInlineArray(value2){let closingBracketIndex=findClosingBracket(value2);if(closingBracketIndex===-1)throw new RuleFrontmatterParseError("Unclosed inline array");if(value2.slice(closingBracketIndex+1).trim().length>0)throw new RuleFrontmatterParseError("Unexpected content after inline array");let content=value2.slice(1,closingBracketIndex).trim();return content.length===0?[]:splitCommaSeparated(content).map(parseStringValue).filter(Boolean)}function findClosingBracket(value2){let quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="]")return index}}return-1}function splitCommaSeparated(value2){let values=[],current="",quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){current+=character,escaped=!1;continue}if(quote!==null&&character==="\\"){current+=character,escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null),current+=character;continue}if(quote===null&&character===","){values.push(current.trim()),current="";continue}current+=character}}if(quote!==null)throw new RuleFrontmatterParseError("Unclosed quoted value");return values.push(current.trim()),values.filter(Boolean)}function parseStringValue(value2){if(value2.length===0)return"";if(value2.startsWith('"'))return parseJsonString(value2);if(value2.startsWith("'")&&value2.endsWith("'"))return value2.slice(1,-1);if(value2.startsWith("'"))throw new RuleFrontmatterParseError("Unclosed quoted value");return value2}function parseJsonString(value2){let parsedValue;try{parsedValue=JSON.parse(value2)}catch{throw new RuleFrontmatterParseError("Invalid JSON-quoted string")}if(typeof parsedValue!="string")throw new RuleFrontmatterParseError("Expected JSON-quoted string");return parsedValue}function stripComment(line){let quote=null,escaped=!1;for(let index=0;index<line.length;index+=1){let character=line[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="#")return line.slice(0,index)}}return line}import{existsSync as existsSync27,realpathSync as realpathSync5,statSync as statSync14}from"node:fs";import{homedir as homedir8}from"node:os";import{dirname as dirname33,join as join50,resolve as resolve26}from"node:path";function findProjectRoot(startPath,markers=PROJECT_MARKERS){let normalizedStartPath=resolve26(startPath);if(!existsSync27(normalizedStartPath))return null;let resolvedStartPath;try{resolvedStartPath=realpathSync5.native(normalizedStartPath)}catch{return null}let currentDirectory;try{currentDirectory=statSync14(resolvedStartPath).isDirectory()?resolvedStartPath:dirname33(resolvedStartPath)}catch{return null}let filesystemRoot=resolve26("/");for(;;){for(let marker of markers)if(existsSync27(join50(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname33(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}function widenToRepositoryRoot(projectRoot2){if(projectRoot2===null)return null;let repositoryFilesystemRoot=resolve26("/"),homeDirectory=resolveExistingPath(homedir8()),currentDirectory=resolveExistingPath(projectRoot2);for(;;){if(currentDirectory===homeDirectory)return projectRoot2;if(existsSync27(join50(currentDirectory,".git")))return currentDirectory;if(currentDirectory===repositoryFilesystemRoot)return projectRoot2;let parentDirectory=dirname33(currentDirectory);if(parentDirectory===currentDirectory)return projectRoot2;currentDirectory=parentDirectory}}function resolveExistingPath(path15){try{return realpathSync5.native(resolve26(path15))}catch{return resolve26(path15)}}var MAX_DYNAMIC_MATCH_CACHE_ENTRIES=4096,ROOT_SINGLE_FILE_SOURCES=new Set(PROJECT_SINGLE_FILES.filter(source2=>!source2.includes("/")));function defaultConfig(){return{disabled:!1,mode:"both",maxRuleChars:DEFAULT_MAX_RULE_CHARS,maxResultChars:DEFAULT_MAX_RESULT_CHARS,enabledSources:"auto"}}function createEngine(config,deps){let state=createSessionState(),dynamicMatchCache=new Map;function loadStaticRules(cwd){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="dynamic")return emptyLoadResult(state);let projectRoot2=deps.findProjectRoot(cwd),disabledSources=disabledSourcesFor(config),candidates=deps.findCandidates({projectRoot:projectRoot2,targetFile:null,...disabledSources===void 0?{}:{disabledSources}}),result3=loadStaticCandidates(candidates,deps,projectRoot2,new Map);return storeLastLoad(state,result3.rules,result3.diagnostics),result3}function loadDynamicRules(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return emptyLoadResult(state);let targetFiles=uniqueStrings(targetPaths),shouldCacheLookups=targetFiles.length>1,rules=[],diagnostics=[],seenRules=new Set,loadedRuleContent=new Map,projectMembership=new Map,disabledSources=disabledSourcesFor(config),discoveryCache=shouldCacheLookups?createRuleDiscoveryCache():void 0,candidateDiscoveryCache=new Map,projectRootCache=new Map,realPathCache=new Map,rootSingleFileSelections=new Set;for(let targetFile of targetFiles){let discoveryTarget=canonicalizePath2(targetFile),projectRoot2=widenToRepositoryRoot(shouldCacheLookups?findProjectRootCached(projectRootCache,discoveryTarget,deps.findProjectRoot):deps.findProjectRoot(discoveryTarget)),findOptions={projectRoot:projectRoot2,targetFile:discoveryTarget,...discoveryCache===void 0?{}:{cache:discoveryCache},...disabledSources===void 0?{}:{disabledSources}},candidates=shouldCacheLookups?findSortedCandidatesCached(candidateDiscoveryCache,deps.findCandidates,findOptions):sortCandidates(deps.findCandidates(findOptions));for(let candidate of candidates){let rootSingleFileSelectionKey=rootSingleFileSelectionKeyFor(candidate,projectRoot2);if(rootSingleFileSelectionKey!==null&&rootSingleFileSelections.has(rootSingleFileSelectionKey))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot2,{loadedRuleContent,projectMembership,realPathCache});if(loadedRule===null)continue;let matchReason=matchDynamicRuleCached(dynamicMatchCache,projectRoot2,discoveryTarget,candidate,loadedRule,deps.matchRule??matchRule);if(matchReason===null)continue;rootSingleFileSelectionKey!==null&&rootSingleFileSelections.add(rootSingleFileSelectionKey);let dedupKey=ruleDedupKey(loadedRule);seenRules.has(dedupKey)||(seenRules.add(dedupKey),rules.push({...loadedRule,matchReason}))}}let sortedRules=sortCandidates(rules);return storeLastLoad(state,sortedRules,diagnostics),{rules:sortedRules,diagnostics}}function fingerprintDynamicTargets(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return[];let fingerprintFn=deps.fileFingerprint??fileStatFingerprint,disabledSources=disabledSourcesFor(config),discoveryCache=createRuleDiscoveryCache(),cwdProjectRoot=deps.findProjectRoot(cwd),fingerprints=[];for(let targetFile of uniqueStrings(targetPaths)){let discoveryTarget=canonicalizePath2(targetFile),projectRoot2=widenToRepositoryRoot(cwdProjectRoot!==null&&isSameOrChildPath2(discoveryTarget,cwdProjectRoot)?cwdProjectRoot:deps.findProjectRoot(discoveryTarget)),findOptions={projectRoot:projectRoot2,targetFile:discoveryTarget,cache:discoveryCache,...disabledSources===void 0?{}:{disabledSources}},candidates=sortCandidates(deps.findCandidates(findOptions)),cacheKey=dynamicTargetCacheKey(targetFile);fingerprints.push({targetPath:targetFile,cacheKey,fingerprint:computeDynamicTargetFingerprint(targetFile,projectRoot2,candidates,config,fingerprintFn)})}return fingerprints}function commitDynamicTargetFingerprints(fingerprints){for(let target of fingerprints)state.dynamicTargetFingerprints.set(target.cacheKey,target.fingerprint)}function isDynamicTargetFingerprintCurrent(target){return state.dynamicTargetFingerprints.get(target.cacheKey)===target.fingerprint}return{state,config,loadStaticRules,loadDynamicRules,formatStatic:rules=>formatStaticBlock(rules,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),formatDynamic:(rules,target)=>formatDynamicBlock(rules,target,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),resetSession:cwd=>{clearSession(state),dynamicMatchCache.clear(),cwd!==void 0&&(state.cwd=cwd)},isStaticInjected:rule=>isStaticInjected(state,rule),isDynamicInjected:(scopeKey,rule)=>isDynamicInjected(state,scopeKey,rule),markStaticInjected:rule=>markStaticInjected(state,rule),markDynamicInjected:(scopeKey,rule)=>markDynamicInjected(state,scopeKey,rule),fingerprintDynamicTargets,isDynamicTargetFingerprintCurrent,commitDynamicTargetFingerprints}}function isSameOrChildPath2(childPath,parentPath){let childRelativePath=relative14(parentPath,resolve27(childPath));return childRelativePath===""||!childRelativePath.startsWith("..")&&!isAbsolute13(childRelativePath)}function matchDynamicRuleCached(cache,projectRoot2,targetFile,candidate,loadedRule,matchRuleImpl){let cacheKey=dynamicMatchCacheKey(projectRoot2,targetFile,candidate,loadedRule.contentHash);if(cache.has(cacheKey)){let cachedReason=cache.get(cacheKey)??null;return cache.delete(cacheKey),cache.set(cacheKey,cachedReason),cachedReason}let matchResult=matchRuleImpl({frontmatter:loadedRule.frontmatter,isSingleFile:candidate.isSingleFile,pathBases:pathBasesForTarget(projectRoot2,targetFile,candidate)}),reason=matchResult.matched?matchResult.reason:null;return setDynamicMatchCacheEntry(cache,cacheKey,reason),reason}function setDynamicMatchCacheEntry(cache,cacheKey,reason){if(cache.size>=MAX_DYNAMIC_MATCH_CACHE_ENTRIES){let oldestCacheKey=cache.keys().next().value;oldestCacheKey!==void 0&&cache.delete(oldestCacheKey)}cache.set(cacheKey,reason)}function dynamicMatchCacheKey(projectRoot2,targetFile,candidate,contentHash){return[projectRoot2??"",toPosixPath2(resolve27(targetFile)),candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),contentHash].join("\0")}function loadStaticCandidates(candidates,deps,projectRoot2,realPathCache){let rules=[],diagnostics=[],rootSingleFileSelected=!1;for(let candidate of sortCandidates(candidates)){if(isDedupedRootSingleFile(candidate,rootSingleFileSelected))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot2,{realPathCache});if(loadedRule===null)continue;let matchReason=staticMatchReason(loadedRule);matchReason!==null&&(isRootSingleFile(candidate)&&(rootSingleFileSelected=!0),rules.push({...loadedRule,matchReason}))}return{rules:sortCandidates(rules),diagnostics}}function loadCandidate2(candidate,deps,diagnostics,projectRoot2,caches){if(!isCandidateWithinProjectCached(candidate,projectRoot2,caches.projectMembership,caches.realPathCache))return diagnostics.push({severity:"warning",source:candidate.path,message:"Rule file resolves outside project root"}),null;let cachedContent=caches.loadedRuleContent?.get(candidate.realPath);if(cachedContent!==void 0)return loadedRuleFromContent(candidate,cachedContent,diagnostics);let content=deps.readFile(candidate.path);if(content===null)return caches.loadedRuleContent?.set(candidate.realPath,null),diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null;let parsed=parseRule(content),loadedContent={frontmatter:parsed.frontmatter,body:parsed.body,contentHash:hashContent(content)};return parsed.diagnostic!==void 0&&(loadedContent.diagnostic=parsed.diagnostic),caches.loadedRuleContent?.set(candidate.realPath,loadedContent),loadedRuleFromContent(candidate,loadedContent,diagnostics)}function loadedRuleFromContent(candidate,content,diagnostics){return content===null?(diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null):(content.diagnostic!==void 0&&diagnostics.push({severity:"warning",source:candidate.path,message:content.diagnostic}),{...candidate,frontmatter:content.frontmatter,body:content.body,contentHash:content.contentHash,matchReason:{kind:"no-match"}})}function ruleDedupKey(rule){return`${rule.realPath}::${rule.contentHash}`}function isCandidateWithinProject(candidate,projectRoot2,realPathCache){if(candidate.isGlobal)return!0;if(projectRoot2===null)return!1;let relativeRealPath=relative14(realPathOrResolved(projectRoot2,realPathCache),resolve27(candidate.realPath));return relativeRealPath===""||!relativeRealPath.startsWith("..")&&!isAbsolute13(relativeRealPath)}function realPathOrResolved(path15,cache){let cached=cache?.get(path15);if(cached!==void 0)return cached;try{let realPath=realpathSync6.native(path15);return cache?.set(path15,realPath),realPath}catch{let resolvedPath=resolve27(path15);return cache?.set(path15,resolvedPath),resolvedPath}}function isCandidateWithinProjectCached(candidate,projectRoot2,projectMembership,realPathCache){if(projectMembership===void 0)return isCandidateWithinProject(candidate,projectRoot2,realPathCache);let cacheKey=`${projectRoot2??""}\0${candidate.realPath}`,cached=projectMembership.get(cacheKey);if(cached!==void 0)return cached;let isWithinProject=isCandidateWithinProject(candidate,projectRoot2,realPathCache);return projectMembership.set(cacheKey,isWithinProject),isWithinProject}function findSortedCandidatesCached(cache,findCandidates,options){let cacheKey=candidateDiscoveryCacheKey(options),cached=cache.get(cacheKey);if(cached!==void 0)return cached;let candidates=sortCandidates(findCandidates(options));return cache.set(cacheKey,candidates),candidates}function candidateDiscoveryCacheKey(options){return[options.projectRoot??"",options.targetFile===null?"":dirname34(resolve27(options.targetFile)),...[...options.disabledSources??[]].sort()].join("\0")}function findProjectRootCached(cache,targetFile,findProjectRoot2){let cacheKey=dirname34(resolve27(targetFile));if(cache.has(cacheKey))return cache.get(cacheKey)??null;let projectRoot2=findProjectRoot2(targetFile);return cache.set(cacheKey,projectRoot2),projectRoot2}function staticMatchReason(rule){return rule.frontmatter.alwaysApply===!0?"alwaysApply":rule.isSingleFile?"single-file":null}function disabledSourcesFor(config){if(config.enabledSources==="auto")return;let enabledSources=new Set(config.enabledSources);return new Set([...SOURCE_PRIORITY.keys()].filter(source2=>!enabledSources.has(source2)))}function isDedupedRootSingleFile(candidate,rootSingleFileSelected){return rootSingleFileSelected&&isRootSingleFile(candidate)}function isRootSingleFile(candidate){return candidate.isSingleFile&&ROOT_SINGLE_FILE_SOURCES.has(candidate.source)&&candidate.relativePath===candidate.source}function rootSingleFileSelectionKeyFor(candidate,projectRoot2){return projectRoot2!==null&&isRootSingleFile(candidate)?projectRoot2:null}function pathBasesForTarget(projectRoot2,targetFile,candidate){let targetBasename=basename15(targetFile);if(projectRoot2===null)return{projectRelative:targetBasename,basename:targetBasename};let projectRelative=toPosixPath2(relative14(projectRoot2,targetFile)),scopeDirectory=scopeDirectoryForCandidate(projectRoot2,candidate);return scopeDirectory===null?{projectRelative,basename:targetBasename}:{projectRelative,scopeRelative:toPosixPath2(relative14(scopeDirectory,targetFile)),basename:targetBasename}}function scopeDirectoryForCandidate(projectRoot2,candidate){if(candidate.isGlobal)return null;if(candidate.isSingleFile)return dirname34(candidate.path);let sourceIndex=candidate.relativePath.indexOf(candidate.source);if(sourceIndex===-1)return projectRoot2;let scopeRelativeDirectory=candidate.relativePath.slice(0,sourceIndex).replace(/\/$/,"");return scopeRelativeDirectory.length===0?projectRoot2:join51(projectRoot2,scopeRelativeDirectory)}function toPosixPath2(path15){return path15.replaceAll("\\","/")}function dynamicTargetCacheKey(targetFile){return toPosixPath2(resolve27(targetFile))}function computeDynamicTargetFingerprint(targetFile,projectRoot2,candidates,config,fileFingerprintFn){let candidateFingerprint=candidates.map(candidate=>fingerprintCandidate(candidate,fileFingerprintFn)).join("");return hashContent(["v1",config.enabledSources==="auto"?"auto":config.enabledSources.join(","),projectRoot2??"",dynamicTargetCacheKey(targetFile),candidateFingerprint].join("\0"))}function fingerprintCandidate(candidate,fileFingerprintFn){return[candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),fileFingerprintFn(candidate.path)].join("\0")}function fileStatFingerprint(filePath){try{let stats=statSync15(filePath,{bigint:!0});return`${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`}catch{return"missing"}}function uniqueStrings(values){return[...new Set(values)]}function canonicalizePath2(path15){try{return realpathSync6.native(path15)}catch{return resolve27(path15)}}function storeLastLoad(state,rules,diagnostics){state.loadedRules.length=0,state.loadedRules.push(...rules),state.diagnostics.length=0,state.diagnostics.push(...diagnostics)}function emptyLoadResult(state){return storeLastLoad(state,[],[]),{rules:[],diagnostics:[]}}var TRUTHY_VALUES=new Set(["1","true","yes","on"]);function configFromEnvironment(env=process.env){let config=defaultConfig(),disabled2=readEnv(env,"PI_RULES_DISABLED");return config.disabled=disabled2!==void 0&&TRUTHY_VALUES.has(disabled2.trim().toLowerCase()),config.maxRuleChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RULE_CHARS"))??config.maxRuleChars,config.maxResultChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RESULT_CHARS"))??config.maxResultChars,config}function readEnv(env,name){let value2=env[name];return typeof value2=="string"&&value2.trim().length>0?value2:void 0}function parsePositiveInteger(value2){if(value2===void 0)return;let normalized2=value2.trim();if(!/^\d+$/.test(normalized2))return;let parsed=Number(normalized2);return Number.isSafeInteger(parsed)&&parsed>0?parsed:void 0}import{isAbsolute as isAbsolute14,resolve as resolve28}from"node:path";function isTrackedTool(toolName){return TRACKED_BUILTIN_TOOL_SET.has(toolName)}function extractToolPaths(event,cwd){if(event.isError||!isTrackedTool(event.toolName))return[];let filePaths=new Set;return(event.toolName==="read"||event.toolName==="edit")&&(addPath(filePaths,getStringProperty(event.details,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),event.toolName==="write"&&(addPath(filePaths,getStringProperty(event.input,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),[...filePaths]}function addPath(filePaths,filePath,cwd){filePath===void 0||filePath.length===0||filePaths.add(isAbsolute14(filePath)?filePath:resolve28(cwd,filePath))}function getStringProperty(value2,propertyName){if(!isRecord44(value2))return;let propertyValue=value2[propertyName];return typeof propertyValue=="string"?propertyValue:void 0}function isRecord44(value2){return typeof value2=="object"&&value2!==null}var MODE_VALUES=new Set(["static","dynamic","both","off"]),DYNAMIC_CONTEXT_SCOPE="live-context";function piRulesExtension(pi){pi.registerFlag("pi-rules-disabled",{type:"boolean",default:!1,description:"Disable pi-rules hooks."}),pi.registerFlag("pi-rules-mode",{type:"string",default:"both",description:"Rule injection mode: static, dynamic, both, or off."});let config=configFromEnvironment(),envDisabled=config.disabled,engine=createEngine(config,{findCandidates:findRuleCandidates,readFile:path15=>{try{return readFileSync31(path15,"utf-8")}catch{return null}},findProjectRoot,extractToolPaths});registerSlashCommands(pi,engine),registerRuleActivationRenderer(pi);let nativeContextPaths=new Set;function syncConfigFromFlags(){let disabled2=pi.getFlag("pi-rules-disabled"),mode=pi.getFlag("pi-rules-mode");typeof disabled2=="boolean"&&(engine.config.disabled=disabled2||envDisabled),typeof mode=="string"&&isPiRulesMode(mode)&&(engine.config.mode=mode)}pi.on("session_start",async(event,ctx)=>{syncConfigFromFlags(),engine.resetSession(ctx.cwd),!engine.config.disabled&&pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:event.reason})}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:"compact"}))});let onBeforeAgentStart=async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="dynamic")return;let loaded2=engine.loadStaticRules(ctx.cwd),commit=event.preview!==!0,contextPaths=commit?nativeContextPaths:new Set;contextPaths.clear();for(let path15 of event.systemPromptOptions.contextFiles?.flatMap(contextFile=>pathKeys(contextFile.path))??[])contextPaths.add(path15);for(let rule of loaded2.rules)commit&&(contextPaths.has(rule.path)||contextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!contextPaths.has(rule.path)&&!contextPaths.has(rule.realPath));if(rules.length===0)return;let block=engine.formatStatic(rules);if(commit)for(let rule of rules)engine.markStaticInjected(rule);return{systemPrompt:event.systemPrompt+block}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("tool_result",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="static"||event.isError)return;let targetPaths=extractToolPaths(event,ctx.cwd),firstTargetPath=targetPaths[0];if(firstTargetPath===void 0)return;let fingerprints=engine.fingerprintDynamicTargets(ctx.cwd,targetPaths),pendingFingerprints=fingerprints.filter(target=>!engine.isDynamicTargetFingerprintCurrent(target));if(pendingFingerprints.length===0){engine.commitDynamicTargetFingerprints(fingerprints);return}let loaded2=engine.loadDynamicRules(ctx.cwd,pendingFingerprints.map(target=>target.targetPath));engine.commitDynamicTargetFingerprints(fingerprints);for(let rule of loaded2.rules)(nativeContextPaths.has(rule.path)||nativeContextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!nativeContextPaths.has(rule.path)&&!nativeContextPaths.has(rule.realPath)&&!engine.isStaticInjected(rule)&&!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule));if(rules.length===0)return;let firstPendingTarget=pendingFingerprints[0]?.targetPath??firstTargetPath,targetPath=displayPath4(ctx.cwd,firstPendingTarget),block=engine.formatDynamic(rules,targetPath);for(let rule of rules)engine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule);return appendRuleActivation(pi,{kind:"project-rules",targetPath,rules:rules.map(rule=>rule.relativePath),toolCallId:event.toolCallId}),{content:[...event.content,{type:"text",text:block,audience:"model"}]}})}function isPiRulesMode(value2){return MODE_VALUES.has(value2)}function pathKeys(filePath){try{return[filePath,realpathSync7.native(filePath)]}catch{return[filePath]}}function displayPath4(cwd,filePath){return isAbsolute15(filePath)?relative15(cwd,filePath):filePath}var SCHEDULE_PROMPT_TOOL="schedule_prompt",PAST_TOLERANCE_MS=6e4,ABSOLUTE_DATE_TIME=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/i,SCHEDULE_PROMPT_DESCRIPTION=`Schedule a prompt to run later in THIS session: a reminder, a follow-up check, or a recurring task. The job is stored on disk and survives this process exiting (works in --print/headless runs). When it is due, a \`senpi schedule run\` runner delivers it back to this session as a new message that starts with "[Scheduled prompt <id> ...]".
2112
+ `),frontmatter={},globValues=[],lineIndex=0;for(;lineIndex<lines.length;){let rawLine=lines[lineIndex];if(rawLine===void 0)break;let line=stripComment(rawLine).trim();if(line.length===0){lineIndex+=1;continue}let colonIndex=line.indexOf(":");if(colonIndex===-1)throw new RuleFrontmatterParseError(`Expected key-value pair on line ${lineIndex+1}`);let key=line.slice(0,colonIndex).trim(),rawValue=line.slice(colonIndex+1).trim();if(key==="description"){frontmatter.description=parseStringValue(rawValue),lineIndex+=1;continue}if(key==="alwaysApply"){frontmatter.alwaysApply=parseBooleanValue(rawValue,lineIndex+1),lineIndex+=1;continue}if(key==="globs"||key==="paths"||key==="applyTo"){let parsed=parseGlobValue(rawValue,lines,lineIndex);for(let glob of parsed.values)globValues.includes(glob)||globValues.push(glob);lineIndex+=parsed.consumed;continue}lineIndex+=1}if(globValues.length===1){let singleGlob=globValues[0];singleGlob!==void 0&&(frontmatter.globs=singleGlob)}else globValues.length>1&&(frontmatter.globs=globValues);return frontmatter}function parseBooleanValue(value2,lineNumber){if(value2==="true")return!0;if(value2==="false")return!1;throw new RuleFrontmatterParseError(`Expected boolean on line ${lineNumber}`)}function parseGlobValue(rawValue,lines,lineIndex){if(rawValue.startsWith("["))return{values:parseInlineArray(rawValue),consumed:1};if(rawValue.length===0)return parseMultilineArray(lines,lineIndex);let value2=parseStringValue(rawValue);return value2.includes(",")?{values:value2.split(",").map(item=>item.trim()).filter(Boolean),consumed:1}:{values:[value2],consumed:1}}function parseMultilineArray(lines,lineIndex){let values=[],consumed=1;for(let index=lineIndex+1;index<lines.length;index+=1){let rawLine=lines[index];if(rawLine===void 0)break;let lineWithoutComment=stripComment(rawLine);if(lineWithoutComment.trim().length===0){consumed+=1;continue}let arrayItem=lineWithoutComment.match(/^\s+-\s*(.*)$/);if(arrayItem===null)break;values.push(parseStringValue(arrayItem[1]??"")),consumed+=1}return{values:values.filter(Boolean),consumed}}function parseInlineArray(value2){let closingBracketIndex=findClosingBracket(value2);if(closingBracketIndex===-1)throw new RuleFrontmatterParseError("Unclosed inline array");if(value2.slice(closingBracketIndex+1).trim().length>0)throw new RuleFrontmatterParseError("Unexpected content after inline array");let content=value2.slice(1,closingBracketIndex).trim();return content.length===0?[]:splitCommaSeparated(content).map(parseStringValue).filter(Boolean)}function findClosingBracket(value2){let quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="]")return index}}return-1}function splitCommaSeparated(value2){let values=[],current="",quote=null,escaped=!1;for(let index=0;index<value2.length;index+=1){let character=value2[index];if(character!==void 0){if(escaped){current+=character,escaped=!1;continue}if(quote!==null&&character==="\\"){current+=character,escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null),current+=character;continue}if(quote===null&&character===","){values.push(current.trim()),current="";continue}current+=character}}if(quote!==null)throw new RuleFrontmatterParseError("Unclosed quoted value");return values.push(current.trim()),values.filter(Boolean)}function parseStringValue(value2){if(value2.length===0)return"";if(value2.startsWith('"'))return parseJsonString(value2);if(value2.startsWith("'")&&value2.endsWith("'"))return value2.slice(1,-1);if(value2.startsWith("'"))throw new RuleFrontmatterParseError("Unclosed quoted value");return value2}function parseJsonString(value2){let parsedValue;try{parsedValue=JSON.parse(value2)}catch{throw new RuleFrontmatterParseError("Invalid JSON-quoted string")}if(typeof parsedValue!="string")throw new RuleFrontmatterParseError("Expected JSON-quoted string");return parsedValue}function stripComment(line){let quote=null,escaped=!1;for(let index=0;index<line.length;index+=1){let character=line[index];if(character!==void 0){if(escaped){escaped=!1;continue}if(quote!==null&&character==="\\"){escaped=!0;continue}if(character==='"'||character==="'"){quote===null?quote=character:quote===character&&(quote=null);continue}if(quote===null&&character==="#")return line.slice(0,index)}}return line}import{existsSync as existsSync27,realpathSync as realpathSync5,statSync as statSync14}from"node:fs";import{homedir as homedir8}from"node:os";import{dirname as dirname33,join as join50,resolve as resolve26}from"node:path";function findProjectRoot(startPath,markers=PROJECT_MARKERS){let normalizedStartPath=resolve26(startPath);if(!existsSync27(normalizedStartPath))return null;let resolvedStartPath;try{resolvedStartPath=realpathSync5.native(normalizedStartPath)}catch{return null}let currentDirectory;try{currentDirectory=statSync14(resolvedStartPath).isDirectory()?resolvedStartPath:dirname33(resolvedStartPath)}catch{return null}let filesystemRoot=resolve26("/");for(;;){for(let marker of markers)if(existsSync27(join50(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname33(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}function widenToRepositoryRoot(projectRoot2){if(projectRoot2===null)return null;let repositoryFilesystemRoot=resolve26("/"),homeDirectory=resolveExistingPath(homedir8()),currentDirectory=resolveExistingPath(projectRoot2);for(;;){if(currentDirectory===homeDirectory)return projectRoot2;if(existsSync27(join50(currentDirectory,".git")))return currentDirectory;if(currentDirectory===repositoryFilesystemRoot)return projectRoot2;let parentDirectory=dirname33(currentDirectory);if(parentDirectory===currentDirectory)return projectRoot2;currentDirectory=parentDirectory}}function resolveExistingPath(path15){try{return realpathSync5.native(resolve26(path15))}catch{return resolve26(path15)}}var MAX_DYNAMIC_MATCH_CACHE_ENTRIES=4096,ROOT_SINGLE_FILE_SOURCES=new Set(PROJECT_SINGLE_FILES.filter(source2=>!source2.includes("/")));function defaultConfig(){return{disabled:!1,mode:"both",maxRuleChars:DEFAULT_MAX_RULE_CHARS,maxResultChars:DEFAULT_MAX_RESULT_CHARS,enabledSources:"auto"}}function createEngine(config,deps){let state=createSessionState(),dynamicMatchCache=new Map;function loadStaticRules(cwd){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="dynamic")return emptyLoadResult(state);let projectRoot2=deps.findProjectRoot(cwd),disabledSources=disabledSourcesFor(config),candidates=deps.findCandidates({projectRoot:projectRoot2,targetFile:null,...disabledSources===void 0?{}:{disabledSources}}),result3=loadStaticCandidates(candidates,deps,projectRoot2,new Map);return storeLastLoad(state,result3.rules,result3.diagnostics),result3}function loadDynamicRules(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return emptyLoadResult(state);let targetFiles=uniqueStrings(targetPaths),shouldCacheLookups=targetFiles.length>1,rules=[],diagnostics=[],seenRules=new Set,loadedRuleContent=new Map,projectMembership=new Map,disabledSources=disabledSourcesFor(config),discoveryCache=shouldCacheLookups?createRuleDiscoveryCache():void 0,candidateDiscoveryCache=new Map,projectRootCache=new Map,realPathCache=new Map,rootSingleFileSelections=new Set;for(let targetFile of targetFiles){let discoveryTarget=canonicalizePath2(targetFile),projectRoot2=widenToRepositoryRoot(shouldCacheLookups?findProjectRootCached(projectRootCache,discoveryTarget,deps.findProjectRoot):deps.findProjectRoot(discoveryTarget)),findOptions={projectRoot:projectRoot2,targetFile:discoveryTarget,...discoveryCache===void 0?{}:{cache:discoveryCache},...disabledSources===void 0?{}:{disabledSources}},candidates=shouldCacheLookups?findSortedCandidatesCached(candidateDiscoveryCache,deps.findCandidates,findOptions):sortCandidates(deps.findCandidates(findOptions));for(let candidate of candidates){let rootSingleFileSelectionKey=rootSingleFileSelectionKeyFor(candidate,projectRoot2);if(rootSingleFileSelectionKey!==null&&rootSingleFileSelections.has(rootSingleFileSelectionKey))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot2,{loadedRuleContent,projectMembership,realPathCache});if(loadedRule===null)continue;let matchReason=matchDynamicRuleCached(dynamicMatchCache,projectRoot2,discoveryTarget,candidate,loadedRule,deps.matchRule??matchRule);if(matchReason===null)continue;rootSingleFileSelectionKey!==null&&rootSingleFileSelections.add(rootSingleFileSelectionKey);let dedupKey=ruleDedupKey(loadedRule);seenRules.has(dedupKey)||(seenRules.add(dedupKey),rules.push({...loadedRule,matchReason}))}}let sortedRules=sortCandidates(rules);return storeLastLoad(state,sortedRules,diagnostics),{rules:sortedRules,diagnostics}}function fingerprintDynamicTargets(cwd,targetPaths){if(state.cwd=cwd,config.disabled||config.mode==="off"||config.mode==="static"||targetPaths.length===0)return[];let fingerprintFn=deps.fileFingerprint??fileStatFingerprint,disabledSources=disabledSourcesFor(config),discoveryCache=createRuleDiscoveryCache(),cwdProjectRoot=deps.findProjectRoot(cwd),fingerprints=[];for(let targetFile of uniqueStrings(targetPaths)){let discoveryTarget=canonicalizePath2(targetFile),projectRoot2=widenToRepositoryRoot(cwdProjectRoot!==null&&isSameOrChildPath2(discoveryTarget,cwdProjectRoot)?cwdProjectRoot:deps.findProjectRoot(discoveryTarget)),findOptions={projectRoot:projectRoot2,targetFile:discoveryTarget,cache:discoveryCache,...disabledSources===void 0?{}:{disabledSources}},candidates=sortCandidates(deps.findCandidates(findOptions)),cacheKey=dynamicTargetCacheKey(targetFile);fingerprints.push({targetPath:targetFile,cacheKey,fingerprint:computeDynamicTargetFingerprint(targetFile,projectRoot2,candidates,config,fingerprintFn)})}return fingerprints}function commitDynamicTargetFingerprints(fingerprints){for(let target of fingerprints)state.dynamicTargetFingerprints.set(target.cacheKey,target.fingerprint)}function isDynamicTargetFingerprintCurrent(target){return state.dynamicTargetFingerprints.get(target.cacheKey)===target.fingerprint}return{state,config,loadStaticRules,loadDynamicRules,formatStatic:rules=>formatStaticBlock(rules,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),formatDynamic:(rules,target)=>formatDynamicBlock(rules,target,{maxRuleChars:config.maxRuleChars,maxResultChars:config.maxResultChars}),resetSession:cwd=>{clearSession(state),dynamicMatchCache.clear(),cwd!==void 0&&(state.cwd=cwd)},isStaticInjected:rule=>isStaticInjected(state,rule),isDynamicInjected:(scopeKey,rule)=>isDynamicInjected(state,scopeKey,rule),markStaticInjected:rule=>markStaticInjected(state,rule),markDynamicInjected:(scopeKey,rule)=>markDynamicInjected(state,scopeKey,rule),fingerprintDynamicTargets,isDynamicTargetFingerprintCurrent,commitDynamicTargetFingerprints}}function isSameOrChildPath2(childPath,parentPath){let childRelativePath=relative14(parentPath,resolve27(childPath));return childRelativePath===""||!childRelativePath.startsWith("..")&&!isAbsolute14(childRelativePath)}function matchDynamicRuleCached(cache,projectRoot2,targetFile,candidate,loadedRule,matchRuleImpl){let cacheKey=dynamicMatchCacheKey(projectRoot2,targetFile,candidate,loadedRule.contentHash);if(cache.has(cacheKey)){let cachedReason=cache.get(cacheKey)??null;return cache.delete(cacheKey),cache.set(cacheKey,cachedReason),cachedReason}let matchResult=matchRuleImpl({frontmatter:loadedRule.frontmatter,isSingleFile:candidate.isSingleFile,pathBases:pathBasesForTarget(projectRoot2,targetFile,candidate)}),reason=matchResult.matched?matchResult.reason:null;return setDynamicMatchCacheEntry(cache,cacheKey,reason),reason}function setDynamicMatchCacheEntry(cache,cacheKey,reason){if(cache.size>=MAX_DYNAMIC_MATCH_CACHE_ENTRIES){let oldestCacheKey=cache.keys().next().value;oldestCacheKey!==void 0&&cache.delete(oldestCacheKey)}cache.set(cacheKey,reason)}function dynamicMatchCacheKey(projectRoot2,targetFile,candidate,contentHash){return[projectRoot2??"",toPosixPath2(resolve27(targetFile)),candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),contentHash].join("\0")}function loadStaticCandidates(candidates,deps,projectRoot2,realPathCache){let rules=[],diagnostics=[],rootSingleFileSelected=!1;for(let candidate of sortCandidates(candidates)){if(isDedupedRootSingleFile(candidate,rootSingleFileSelected))continue;let loadedRule=loadCandidate2(candidate,deps,diagnostics,projectRoot2,{realPathCache});if(loadedRule===null)continue;let matchReason=staticMatchReason(loadedRule);matchReason!==null&&(isRootSingleFile(candidate)&&(rootSingleFileSelected=!0),rules.push({...loadedRule,matchReason}))}return{rules:sortCandidates(rules),diagnostics}}function loadCandidate2(candidate,deps,diagnostics,projectRoot2,caches){if(!isCandidateWithinProjectCached(candidate,projectRoot2,caches.projectMembership,caches.realPathCache))return diagnostics.push({severity:"warning",source:candidate.path,message:"Rule file resolves outside project root"}),null;let cachedContent=caches.loadedRuleContent?.get(candidate.realPath);if(cachedContent!==void 0)return loadedRuleFromContent(candidate,cachedContent,diagnostics);let content=deps.readFile(candidate.path);if(content===null)return caches.loadedRuleContent?.set(candidate.realPath,null),diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null;let parsed=parseRule(content),loadedContent={frontmatter:parsed.frontmatter,body:parsed.body,contentHash:hashContent(content)};return parsed.diagnostic!==void 0&&(loadedContent.diagnostic=parsed.diagnostic),caches.loadedRuleContent?.set(candidate.realPath,loadedContent),loadedRuleFromContent(candidate,loadedContent,diagnostics)}function loadedRuleFromContent(candidate,content,diagnostics){return content===null?(diagnostics.push({severity:"warning",source:candidate.path,message:"Unable to read rule file"}),null):(content.diagnostic!==void 0&&diagnostics.push({severity:"warning",source:candidate.path,message:content.diagnostic}),{...candidate,frontmatter:content.frontmatter,body:content.body,contentHash:content.contentHash,matchReason:{kind:"no-match"}})}function ruleDedupKey(rule){return`${rule.realPath}::${rule.contentHash}`}function isCandidateWithinProject(candidate,projectRoot2,realPathCache){if(candidate.isGlobal)return!0;if(projectRoot2===null)return!1;let relativeRealPath=relative14(realPathOrResolved(projectRoot2,realPathCache),resolve27(candidate.realPath));return relativeRealPath===""||!relativeRealPath.startsWith("..")&&!isAbsolute14(relativeRealPath)}function realPathOrResolved(path15,cache){let cached=cache?.get(path15);if(cached!==void 0)return cached;try{let realPath=realpathSync6.native(path15);return cache?.set(path15,realPath),realPath}catch{let resolvedPath=resolve27(path15);return cache?.set(path15,resolvedPath),resolvedPath}}function isCandidateWithinProjectCached(candidate,projectRoot2,projectMembership,realPathCache){if(projectMembership===void 0)return isCandidateWithinProject(candidate,projectRoot2,realPathCache);let cacheKey=`${projectRoot2??""}\0${candidate.realPath}`,cached=projectMembership.get(cacheKey);if(cached!==void 0)return cached;let isWithinProject=isCandidateWithinProject(candidate,projectRoot2,realPathCache);return projectMembership.set(cacheKey,isWithinProject),isWithinProject}function findSortedCandidatesCached(cache,findCandidates,options){let cacheKey=candidateDiscoveryCacheKey(options),cached=cache.get(cacheKey);if(cached!==void 0)return cached;let candidates=sortCandidates(findCandidates(options));return cache.set(cacheKey,candidates),candidates}function candidateDiscoveryCacheKey(options){return[options.projectRoot??"",options.targetFile===null?"":dirname34(resolve27(options.targetFile)),...[...options.disabledSources??[]].sort()].join("\0")}function findProjectRootCached(cache,targetFile,findProjectRoot2){let cacheKey=dirname34(resolve27(targetFile));if(cache.has(cacheKey))return cache.get(cacheKey)??null;let projectRoot2=findProjectRoot2(targetFile);return cache.set(cacheKey,projectRoot2),projectRoot2}function staticMatchReason(rule){return rule.frontmatter.alwaysApply===!0?"alwaysApply":rule.isSingleFile?"single-file":null}function disabledSourcesFor(config){if(config.enabledSources==="auto")return;let enabledSources=new Set(config.enabledSources);return new Set([...SOURCE_PRIORITY.keys()].filter(source2=>!enabledSources.has(source2)))}function isDedupedRootSingleFile(candidate,rootSingleFileSelected){return rootSingleFileSelected&&isRootSingleFile(candidate)}function isRootSingleFile(candidate){return candidate.isSingleFile&&ROOT_SINGLE_FILE_SOURCES.has(candidate.source)&&candidate.relativePath===candidate.source}function rootSingleFileSelectionKeyFor(candidate,projectRoot2){return projectRoot2!==null&&isRootSingleFile(candidate)?projectRoot2:null}function pathBasesForTarget(projectRoot2,targetFile,candidate){let targetBasename=basename15(targetFile);if(projectRoot2===null)return{projectRelative:targetBasename,basename:targetBasename};let projectRelative=toPosixPath2(relative14(projectRoot2,targetFile)),scopeDirectory=scopeDirectoryForCandidate(projectRoot2,candidate);return scopeDirectory===null?{projectRelative,basename:targetBasename}:{projectRelative,scopeRelative:toPosixPath2(relative14(scopeDirectory,targetFile)),basename:targetBasename}}function scopeDirectoryForCandidate(projectRoot2,candidate){if(candidate.isGlobal)return null;if(candidate.isSingleFile)return dirname34(candidate.path);let sourceIndex=candidate.relativePath.indexOf(candidate.source);if(sourceIndex===-1)return projectRoot2;let scopeRelativeDirectory=candidate.relativePath.slice(0,sourceIndex).replace(/\/$/,"");return scopeRelativeDirectory.length===0?projectRoot2:join51(projectRoot2,scopeRelativeDirectory)}function toPosixPath2(path15){return path15.replaceAll("\\","/")}function dynamicTargetCacheKey(targetFile){return toPosixPath2(resolve27(targetFile))}function computeDynamicTargetFingerprint(targetFile,projectRoot2,candidates,config,fileFingerprintFn){let candidateFingerprint=candidates.map(candidate=>fingerprintCandidate(candidate,fileFingerprintFn)).join("");return hashContent(["v1",config.enabledSources==="auto"?"auto":config.enabledSources.join(","),projectRoot2??"",dynamicTargetCacheKey(targetFile),candidateFingerprint].join("\0"))}function fingerprintCandidate(candidate,fileFingerprintFn){return[candidate.realPath,candidate.relativePath,candidate.source,candidate.isGlobal?"global":"project",candidate.isSingleFile?"single":"multi",String(candidate.distance),fileFingerprintFn(candidate.path)].join("\0")}function fileStatFingerprint(filePath){try{let stats=statSync15(filePath,{bigint:!0});return`${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`}catch{return"missing"}}function uniqueStrings(values){return[...new Set(values)]}function canonicalizePath2(path15){try{return realpathSync6.native(path15)}catch{return resolve27(path15)}}function storeLastLoad(state,rules,diagnostics){state.loadedRules.length=0,state.loadedRules.push(...rules),state.diagnostics.length=0,state.diagnostics.push(...diagnostics)}function emptyLoadResult(state){return storeLastLoad(state,[],[]),{rules:[],diagnostics:[]}}var TRUTHY_VALUES=new Set(["1","true","yes","on"]);function configFromEnvironment(env=process.env){let config=defaultConfig(),disabled2=readEnv(env,"PI_RULES_DISABLED");return config.disabled=disabled2!==void 0&&TRUTHY_VALUES.has(disabled2.trim().toLowerCase()),config.maxRuleChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RULE_CHARS"))??config.maxRuleChars,config.maxResultChars=parsePositiveInteger(readEnv(env,"PI_RULES_MAX_RESULT_CHARS"))??config.maxResultChars,config}function readEnv(env,name){let value2=env[name];return typeof value2=="string"&&value2.trim().length>0?value2:void 0}function parsePositiveInteger(value2){if(value2===void 0)return;let normalized2=value2.trim();if(!/^\d+$/.test(normalized2))return;let parsed=Number(normalized2);return Number.isSafeInteger(parsed)&&parsed>0?parsed:void 0}import{isAbsolute as isAbsolute15,resolve as resolve28}from"node:path";function isTrackedTool(toolName){return TRACKED_BUILTIN_TOOL_SET.has(toolName)}function extractToolPaths(event,cwd){if(event.isError||!isTrackedTool(event.toolName))return[];let filePaths=new Set;return(event.toolName==="read"||event.toolName==="edit")&&(addPath(filePaths,getStringProperty(event.details,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),event.toolName==="write"&&(addPath(filePaths,getStringProperty(event.input,"filePath"),cwd),addPath(filePaths,getStringProperty(event.input,"path"),cwd)),[...filePaths]}function addPath(filePaths,filePath,cwd){filePath===void 0||filePath.length===0||filePaths.add(isAbsolute15(filePath)?filePath:resolve28(cwd,filePath))}function getStringProperty(value2,propertyName){if(!isRecord44(value2))return;let propertyValue=value2[propertyName];return typeof propertyValue=="string"?propertyValue:void 0}function isRecord44(value2){return typeof value2=="object"&&value2!==null}var MODE_VALUES=new Set(["static","dynamic","both","off"]),DYNAMIC_CONTEXT_SCOPE="live-context";function piRulesExtension(pi){pi.registerFlag("pi-rules-disabled",{type:"boolean",default:!1,description:"Disable pi-rules hooks."}),pi.registerFlag("pi-rules-mode",{type:"string",default:"both",description:"Rule injection mode: static, dynamic, both, or off."});let config=configFromEnvironment(),envDisabled=config.disabled,engine=createEngine(config,{findCandidates:findRuleCandidates,readFile:path15=>{try{return readFileSync31(path15,"utf-8")}catch{return null}},findProjectRoot,extractToolPaths});registerSlashCommands(pi,engine),registerRuleActivationRenderer(pi);let nativeContextPaths=new Set;function syncConfigFromFlags(){let disabled2=pi.getFlag("pi-rules-disabled"),mode=pi.getFlag("pi-rules-mode");typeof disabled2=="boolean"&&(engine.config.disabled=disabled2||envDisabled),typeof mode=="string"&&isPiRulesMode(mode)&&(engine.config.mode=mode)}pi.on("session_start",async(event,ctx)=>{syncConfigFromFlags(),engine.resetSession(ctx.cwd),!engine.config.disabled&&pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:event.reason})}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(engine.resetSession(ctx.cwd),pi.appendEntry("pi-rules.scan",{cwd:ctx.cwd,reason:"compact"}))});let onBeforeAgentStart=async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="dynamic")return;let loaded2=engine.loadStaticRules(ctx.cwd),commit=event.preview!==!0,contextPaths=commit?nativeContextPaths:new Set;contextPaths.clear();for(let path15 of event.systemPromptOptions.contextFiles?.flatMap(contextFile=>pathKeys(contextFile.path))??[])contextPaths.add(path15);for(let rule of loaded2.rules)commit&&(contextPaths.has(rule.path)||contextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!contextPaths.has(rule.path)&&!contextPaths.has(rule.realPath));if(rules.length===0)return;let block=engine.formatStatic(rules);if(commit)for(let rule of rules)engine.markStaticInjected(rule);return{systemPrompt:event.systemPrompt+block}};pi.on("before_agent_start",onBeforeAgentStart,{previewSafe:!0}),pi.on("tool_result",async(event,ctx)=>{if(syncConfigFromFlags(),engine.config.disabled||engine.config.mode==="off"||engine.config.mode==="static"||event.isError)return;let targetPaths=extractToolPaths(event,ctx.cwd),firstTargetPath=targetPaths[0];if(firstTargetPath===void 0)return;let fingerprints=engine.fingerprintDynamicTargets(ctx.cwd,targetPaths),pendingFingerprints=fingerprints.filter(target=>!engine.isDynamicTargetFingerprintCurrent(target));if(pendingFingerprints.length===0){engine.commitDynamicTargetFingerprints(fingerprints);return}let loaded2=engine.loadDynamicRules(ctx.cwd,pendingFingerprints.map(target=>target.targetPath));engine.commitDynamicTargetFingerprints(fingerprints);for(let rule of loaded2.rules)(nativeContextPaths.has(rule.path)||nativeContextPaths.has(rule.realPath))&&engine.markStaticInjected(rule);let rules=loaded2.rules.filter(rule=>!nativeContextPaths.has(rule.path)&&!nativeContextPaths.has(rule.realPath)&&!engine.isStaticInjected(rule)&&!engine.isDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule));if(rules.length===0)return;let firstPendingTarget=pendingFingerprints[0]?.targetPath??firstTargetPath,targetPath=displayPath4(ctx.cwd,firstPendingTarget),block=engine.formatDynamic(rules,targetPath);for(let rule of rules)engine.markDynamicInjected(DYNAMIC_CONTEXT_SCOPE,rule);return appendRuleActivation(pi,{kind:"project-rules",targetPath,rules:rules.map(rule=>rule.relativePath),toolCallId:event.toolCallId}),{content:[...event.content,{type:"text",text:block,audience:"model"}]}})}function isPiRulesMode(value2){return MODE_VALUES.has(value2)}function pathKeys(filePath){try{return[filePath,realpathSync7.native(filePath)]}catch{return[filePath]}}function displayPath4(cwd,filePath){return isAbsolute16(filePath)?relative15(cwd,filePath):filePath}var SCHEDULE_PROMPT_TOOL="schedule_prompt",PAST_TOLERANCE_MS=6e4,ABSOLUTE_DATE_TIME=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/i,SCHEDULE_PROMPT_DESCRIPTION=`Schedule a prompt to run later in THIS session: a reminder, a follow-up check, or a recurring task. The job is stored on disk and survives this process exiting (works in --print/headless runs). When it is due, a \`senpi schedule run\` runner delivers it back to this session as a new message that starts with "[Scheduled prompt <id> ...]".
2113
2113
 
2114
2114
  - action "create": pass \`prompt\` (what to do or say when it fires, written as an instruction to your future self) and exactly one of \`delaySeconds\` or \`at\` (ISO 8601 date-time; include the UTC offset, e.g. 2026-09-28T09:00:00+09:00). Optional \`everySeconds\` (>= ${60}) repeats it.
2115
2115
  - action "list": this session's scheduled jobs.
@@ -2117,7 +2117,7 @@ ${truncatedRules.map(formatRule).join(`
2117
2117
 
2118
2118
  If this session is open in another senpi process when a job is due, the default runner waits until it closes. Limits: prompt ${16384} bytes, ${50} pending jobs per session.`,schedulePromptSchema=typebox_exports.Object({action:typebox_exports.Union([typebox_exports.Literal("create"),typebox_exports.Literal("list"),typebox_exports.Literal("cancel")],{description:"create a job, list this session's jobs, or cancel one by id."}),prompt:typebox_exports.Optional(typebox_exports.String({description:"create: the prompt delivered to this session when the job fires."})),delaySeconds:typebox_exports.Optional(typebox_exports.Integer({description:"create: fire this many seconds from now."})),at:typebox_exports.Optional(typebox_exports.String({description:"create: absolute ISO 8601 date-time with UTC offset to fire at."})),everySeconds:typebox_exports.Optional(typebox_exports.Integer({description:`create: repeat every N seconds (minimum ${60}).`})),id:typebox_exports.Optional(typebox_exports.String({description:"cancel: the job id (sch_...)."}))},{additionalProperties:!1});function describeJob(job,state){let due=new Date(job.dueAt),every=job.everyMs===null?"":`, every ${Math.round(job.everyMs/1e3)}s`,error2=job.lastError===null?"":`, last error: ${job.lastError}`,prompt=job.prompt.length>120?`${job.prompt.slice(0,117)}...`:job.prompt;return`${job.id} [${state}] due ${due.toISOString()} (${due.toString()})${every}${error2}: ${prompt}`}function resolveDueAt(delaySeconds,at,now2){let trimmedAt=at?.trim()??"";if(delaySeconds===void 0==(trimmedAt.length===0))throw new Error("create needs exactly one of delaySeconds or at.");if(delaySeconds!==void 0){if(!Number.isSafeInteger(delaySeconds)||delaySeconds<0)throw new Error("delaySeconds must be a non-negative integer.");return now2+delaySeconds*1e3}if(!ABSOLUTE_DATE_TIME.test(trimmedAt))throw new Error(`at must be an ISO 8601 date-time with Z or a UTC offset (e.g. 2026-09-28T09:00:00+09:00): ${trimmedAt}`);let dueAt=Date.parse(trimmedAt);if(!Number.isFinite(dueAt))throw new Error(`at is not a valid date-time: ${trimmedAt}`);if(dueAt<now2-PAST_TOLERANCE_MS)throw new Error(`at (${new Date(dueAt).toISOString()}) is in the past; now is ${new Date(now2).toISOString()}.`);return dueAt}function checkCapacity(jobs,sessionId){let pending=jobs.filter(record7=>record7.state==="pending");if(pending.length>=1e3)throw new Error(`the schedule already holds ${1e3} pending jobs; cancel some first.`);if(pending.filter(record7=>record7.job.sessionId===sessionId).length>=50)throw new Error(`this session already has ${50} pending jobs; cancel some first.`)}async function create(params,ctx,now2){let prompt=params.prompt?.trim()??"";if(prompt.length===0)throw new Error("create needs a non-empty prompt.");if(Buffer.byteLength(prompt,"utf8")>16384)throw new Error(`prompt must be at most ${16384} bytes.`);let dueAt=resolveDueAt(params.delaySeconds,params.at,now2);if(dueAt-now2>316224e5)throw new Error("a job can be scheduled at most 366 days ahead.");let everyMs=null;if(params.everySeconds!==void 0){if(!Number.isSafeInteger(params.everySeconds)||params.everySeconds<60)throw new Error(`everySeconds must be an integer of at least ${60}.`);if(params.everySeconds*1e3>316224e5)throw new Error(`everySeconds must be at most ${316224e5/1e3} (366 days).`);everyMs=params.everySeconds*1e3}let dir=scheduleDir(ctx.agentDir),sessionId=ctx.sessionManager.getSessionId();checkCapacity((await listScheduledJobs(dir)).jobs,sessionId);let job=await createScheduledJob(dir,{sessionId,sessionFile:ctx.sessionManager.getSessionFile()??null,cwd:ctx.cwd,prompt,dueAt,everyMs},now2),runnerAvailable=await isWatchRunnerAvailable(dir,now2),lines=[`Scheduled ${describeJob(job,"pending")}`];return lines.push(runnerAvailable?"A schedule runner is active; it will deliver the prompt to this session when due.":"No `senpi schedule run --watch` runner is active right now; the job fires the next time a runner runs."),{content:[{type:"text",text:lines.join(`
2119
2119
  `)}],details:{action:"create",jobs:[{state:"pending",job}],runnerAvailable}}}async function list2(ctx){let sessionId=ctx.sessionManager.getSessionId(),{jobs}=await listScheduledJobs(scheduleDir(ctx.agentDir)),own=jobs.filter(({job})=>job.sessionId===sessionId);return{content:[{type:"text",text:own.length===0?"No scheduled jobs for this session.":own.map(({state,job})=>describeJob(job,state)).join(`
2120
- `)}],details:{action:"list",jobs:own}}}async function cancel(params,ctx){let id=params.id?.trim()??"";if(id.length===0)throw new Error("cancel needs the job id.");let removed=await cancelScheduledJob(scheduleDir(ctx.agentDir),id,{sessionId:ctx.sessionManager.getSessionId()});if(removed===void 0)throw new Error(`No scheduled job ${id} in this session.`);return{content:[{type:"text",text:removed.inFlight?`Cancelled ${id}. One delivery had already started and may still arrive; nothing after it will run.`:`Cancelled ${describeJob(removed.job,"pending")}`}],details:{action:"cancel",jobs:[{state:"pending",job:removed.job}],inFlight:removed.inFlight}}}function registerScheduleTool(pi,deps){pi.registerTool({name:SCHEDULE_PROMPT_TOOL,label:"Schedule Prompt",description:SCHEDULE_PROMPT_DESCRIPTION,parameters:schedulePromptSchema,exposure:"search",searchKeywords:["reminder","remind","later","schedule","cron","timer","alarm","follow up","recurring"],executionMode:"sequential",async execute(_toolCallId,params,_signal,_onUpdate,ctx){switch(params.action){case"create":return create(params,ctx,deps.now());case"list":return list2(ctx);case"cancel":return cancel(params,ctx)}}})}function scheduleExtension(pi){registerScheduleTool(pi,{now:()=>Date.now()})}import{join as join58}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}import{mkdir as mkdir11,rm as rm8}from"node:fs/promises";import{isAbsolute as isAbsolute16,join as join52}from"node:path";function modelOnlyText(text2){return{type:"text",text:text2,audience:"model"}}function isModelOnlyText(part){return typeof part=="object"&&part!==null&&"type"in part&&part.type==="text"&&"audience"in part&&part.audience==="model"}var TERMINAL_TOOL_MAX_LINES=2e3,TERMINAL_TOOL_MAX_BYTES=50*1024,OSC_PATTERN=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,CSI_PATTERN=/\x1b\[[0-?]*[ -/]*[@-~]/g,DESIGNATE_AND_SINGLE_PATTERN=/\x1b(?:[()#%*+][0-9A-Za-z]|[0-9<=>@-Z\\-_])/g,C0_CONTROL_PATTERN=/[\x00-\x07\x0b\x0c\x0e-\x1f\x7f]/g;function stripEscapeSequences(text2){return text2.replace(OSC_PATTERN,"").replace(CSI_PATTERN,"").replace(DESIGNATE_AND_SINGLE_PATTERN,"").replace(C0_CONTROL_PATTERN,"")}function collapseRedraws(line){let cells=[],cursor=0;for(let ch of line)ch==="\r"?cursor=0:ch==="\b"?cursor>0&&(cursor-=1):(cells[cursor]=ch,cursor+=1);return cells.join("")}function sanitizeTerminalOutput(raw){return stripEscapeSequences(raw).replace(/\r\n/g,`
2120
+ `)}],details:{action:"list",jobs:own}}}async function cancel(params,ctx){let id=params.id?.trim()??"";if(id.length===0)throw new Error("cancel needs the job id.");let removed=await cancelScheduledJob(scheduleDir(ctx.agentDir),id,{sessionId:ctx.sessionManager.getSessionId()});if(removed===void 0)throw new Error(`No scheduled job ${id} in this session.`);return{content:[{type:"text",text:removed.inFlight?`Cancelled ${id}. One delivery had already started and may still arrive; nothing after it will run.`:`Cancelled ${describeJob(removed.job,"pending")}`}],details:{action:"cancel",jobs:[{state:"pending",job:removed.job}],inFlight:removed.inFlight}}}function registerScheduleTool(pi,deps){pi.registerTool({name:SCHEDULE_PROMPT_TOOL,label:"Schedule Prompt",description:SCHEDULE_PROMPT_DESCRIPTION,parameters:schedulePromptSchema,exposure:"search",searchKeywords:["reminder","remind","later","schedule","cron","timer","alarm","follow up","recurring"],executionMode:"sequential",async execute(_toolCallId,params,_signal,_onUpdate,ctx){switch(params.action){case"create":return create(params,ctx,deps.now());case"list":return list2(ctx);case"cancel":return cancel(params,ctx)}}})}function scheduleExtension(pi){registerScheduleTool(pi,{now:()=>Date.now()})}import{join as join58}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}import{mkdir as mkdir11,rm as rm8}from"node:fs/promises";import{isAbsolute as isAbsolute17,join as join52}from"node:path";function modelOnlyText(text2){return{type:"text",text:text2,audience:"model"}}function isModelOnlyText(part){return typeof part=="object"&&part!==null&&"type"in part&&part.type==="text"&&"audience"in part&&part.audience==="model"}var TERMINAL_TOOL_MAX_LINES=2e3,TERMINAL_TOOL_MAX_BYTES=50*1024,OSC_PATTERN=/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,CSI_PATTERN=/\x1b\[[0-?]*[ -/]*[@-~]/g,DESIGNATE_AND_SINGLE_PATTERN=/\x1b(?:[()#%*+][0-9A-Za-z]|[0-9<=>@-Z\\-_])/g,C0_CONTROL_PATTERN=/[\x00-\x07\x0b\x0c\x0e-\x1f\x7f]/g;function stripEscapeSequences(text2){return text2.replace(OSC_PATTERN,"").replace(CSI_PATTERN,"").replace(DESIGNATE_AND_SINGLE_PATTERN,"").replace(C0_CONTROL_PATTERN,"")}function collapseRedraws(line){let cells=[],cursor=0;for(let ch of line)ch==="\r"?cursor=0:ch==="\b"?cursor>0&&(cursor-=1):(cells[cursor]=ch,cursor+=1);return cells.join("")}function sanitizeTerminalOutput(raw){return stripEscapeSequences(raw).replace(/\r\n/g,`
2121
2121
  `).split(`
2122
2122
  `).map(collapseRedraws).join(`
2123
2123
  `)}function formatTerminalToolOutput(raw){let sanitized=sanitizeTerminalOutput(raw).trimEnd(),truncation=truncateTail2(sanitized,{maxLines:TERMINAL_TOOL_MAX_LINES,maxBytes:TERMINAL_TOOL_MAX_BYTES});if(!truncation.truncated)return{text:sanitized,body:sanitized,truncated:!1,truncation};let marker=truncation.lastLinePartial?`[Showing last ${formatSize2(truncation.outputBytes)} of a single line; earlier output dropped]`:`[Showing lines ${truncation.totalLines-truncation.outputLines+1}-${truncation.totalLines} of ${truncation.totalLines}; earlier output dropped]`;return{text:`${truncation.content}
@@ -2129,7 +2129,7 @@ ${marker}`,body:truncation.content,marker,truncated:!0,truncation}}function spli
2129
2129
  `),created}function describeExit(runtime){let exit=runtime.exitResult;return exit?exit.timedOut?"timed_out":exit.cancelled?"killed":exit.exitCode===0?"completed":exit.exitCode!==null?`exited_${exit.exitCode}`:exit.signal?`signal_${exit.signal}`:"exited":null}var NON_INTERACTIVE_MODES2=new Set(["print","json"]),TERMINAL_NOTIFICATION_CUSTOM_TYPE="senpi-terminal:notification",NOTICE_TAIL_MAX_CHARS=2e3;function getTerminalNotificationDelivery(deps,customType=TERMINAL_NOTIFICATION_CUSTOM_TYPE){let mode=deps.getMode();if(mode==="off")return;let ctx=deps.getContext();if(!(!ctx||NON_INTERACTIVE_MODES2.has(ctx.mode)||!ctx.model))return{send:(content,options)=>deps.sendMessage({customType,content,display:!1,...options?.details===void 0?{}:{details:options.details}},{triggerTurn:!0,deliverAs:mode==="wake"||options?.forceWake===!0?"steer":"followUp"})}}function buildNotice(id,runtime){let status=describeExit(runtime)??"exited",code=runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`,tail=sanitizeTerminalOutput(runtime.fullOutput()).trimEnd(),tailSection="";if(tail.length>0){let truncated=tail.length>NOTICE_TAIL_MAX_CHARS,shown=truncated?tail.slice(tail.length-NOTICE_TAIL_MAX_CHARS):tail,note=truncated?`
2130
2130
  [Final output truncated to the last ${NOTICE_TAIL_MAX_CHARS} chars; the full history is still peekable.]`:"";tailSection=`
2131
2131
  Final output:
2132
- ${shown}${note}`}return`<system-reminder>Background terminal session ${id} finished: ${status}${codeText}.${tailSection}</system-reminder>`}var TerminalNotifier=class{constructor(deps){this.notified=new Set,this.deps=deps}notifyCompletion(id,runtime){if(this.notified.has(id))return;let delivery=getTerminalNotificationDelivery(this.deps);delivery&&(this.notified.add(id),delivery.send(buildNotice(id,runtime)))}};function terminalStateDir(ctx){if(ctx!==void 0&&NON_INTERACTIVE_MODES2.has(ctx.mode))return;let sessionDir=ctx?.sessionManager?.getSessionDir?.();if(!(sessionDir===void 0||sessionDir.length===0||!isAbsolute16(sessionDir)))return join52(sessionDir,"extensions","terminal")}function monitorStateDir(terminalDir,monitorId){return join52(terminalDir,"state",monitorId)}async function ensureMonitorStateDir(terminalDir,monitorId){let dir=monitorStateDir(terminalDir,monitorId);return await mkdir11(dir,{recursive:!0,mode:448}),dir}async function removeMonitorStateDir(terminalDir,monitorId){await rm8(monitorStateDir(terminalDir,monitorId),{recursive:!0,force:!0})}var TerminalManager=class{constructor(options={}){this.runtimes=new Map,this.monitorIds=new Map,this.exited=new Set,this.reservations=0,this.maxSessions=options.maxSessions??DEFAULT_MAX_SESSIONS,this.scrollback=options.scrollback}get size(){return this.runtimes.size}get activeSize(){return this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations}reserve(){if(this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations>=this.maxSessions)return null;this.reservations+=1;let released=!1;return()=>{released||(released=!0,this.reservations-=1)}}async create(command,options){let pty=await loadPty(),release4=this.reserve();if(!release4)throw new pty.SessionRegistryCapacityError(this.maxSessions);this.registry??=new pty.SessionRegistry({maxSessions:this.maxSessions});let registry=this.registry,runtimeOptions={...options,scrollback:this.scrollback},{TerminalRuntimeSession}=await import("./runtime-session-CWJNFRHY.js"),runtime=new TerminalRuntimeSession(command,runtimeOptions),entry;try{entry=await registry.create({command,session:runtime.session})}catch(error2){throw release4(),runtime.dispose(),runtime.session.kill(),error2}return this.runtimes.set(entry.id,runtime),runtime.session.onExit(()=>{this.exited.add(entry.id)}),release4(),this.reconcileRuntimes(),{id:entry.id,runtime}}get(id){let registry=this.registry;return!registry||!registry.get(id)?null:this.runtimes.get(id)??null}bindMonitorId(monitorId,sessionId){this.monitorIds.set(monitorId,sessionId)}monitorIdOf(runtimeId){for(let[monitorId,sessionId]of this.monitorIds)if(sessionId===runtimeId)return monitorId}resolveId(idOrMonitorId){if(idOrMonitorId.startsWith("mon_"))return this.monitorIds.get(idOrMonitorId);let registry=this.registry;if(registry)return registry.get(idOrMonitorId)?idOrMonitorId:void 0}list(){let registry=this.registry;if(!registry)return[];let result3=[];for(let entry of registry.list()){let runtime=this.runtimes.get(entry.id);runtime&&result3.push({id:entry.id,runtime})}return result3}async stop(id){let registry=this.registry;if(!registry)return!1;let stopped=await registry.stop(id);return this.reconcileRuntimes(),stopped}async teardown(){let registry=this.registry;registry&&await registry.teardown(),this.registry=void 0;for(let runtime of this.runtimes.values())runtime.dispose();this.runtimes.clear(),this.exited.clear(),this.monitorIds.clear()}reconcileRuntimes(){let registry=this.registry;if(!registry)return;let liveIds=new Set(registry.list().map(entry=>entry.id));for(let[id,runtime]of this.runtimes)if(!liveIds.has(id)){runtime.dispose(),this.runtimes.delete(id),this.exited.delete(id);for(let[monitorId,sessionId]of this.monitorIds)sessionId===id&&this.monitorIds.delete(monitorId)}}};import{randomBytes as randomBytes5}from"node:crypto";import{watch}from"node:fs";import{access as access2,lstat,open as open4,stat as stat5}from"node:fs/promises";import{basename as basename16,dirname as dirname35,join as join53,resolve as resolve29}from"node:path";import{createHash as createHash19}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash19("sha256"),first=Buffer.alloc(Math.min(65536,metadata.size));if(first.length>0&&(await handle.read(first,0,first.length,0),hash.update(first)),metadata.size>65536){let middle=Buffer.alloc(65536);await handle.read(middle,0,middle.length,Math.floor((metadata.size-middle.length)/2)),hash.update(middle);let last=Buffer.alloc(65536);await handle.read(last,0,last.length,metadata.size-last.length),hash.update(last)}return`${metadata.size}:${hash.digest("hex")}`}var FileWatchLoop=class{#check;#timer;#stopped=!1;constructor(check){this.#check=check,this.#start()}pause(){this.#timer!==void 0&&(clearInterval(this.#timer),this.#timer=void 0)}resume(){this.#stopped||this.#timer!==void 0||(this.#start(),this.#check())}stop(){this.#stopped=!0,this.pause()}#start(){this.#timer=setInterval(this.#check,250)}};var MonitorLineBuffer=class{#tail="";append(chunk){let remaining=this.#tail+chunk,lines=[];for(;;){let newline=remaining.indexOf(`
2132
+ ${shown}${note}`}return`<system-reminder>Background terminal session ${id} finished: ${status}${codeText}.${tailSection}</system-reminder>`}var TerminalNotifier=class{constructor(deps){this.notified=new Set,this.deps=deps}notifyCompletion(id,runtime){if(this.notified.has(id))return;let delivery=getTerminalNotificationDelivery(this.deps);delivery&&(this.notified.add(id),delivery.send(buildNotice(id,runtime)))}};function terminalStateDir(ctx){if(ctx!==void 0&&NON_INTERACTIVE_MODES2.has(ctx.mode))return;let sessionDir=ctx?.sessionManager?.getSessionDir?.();if(!(sessionDir===void 0||sessionDir.length===0||!isAbsolute17(sessionDir)))return join52(sessionDir,"extensions","terminal")}function monitorStateDir(terminalDir,monitorId){return join52(terminalDir,"state",monitorId)}async function ensureMonitorStateDir(terminalDir,monitorId){let dir=monitorStateDir(terminalDir,monitorId);return await mkdir11(dir,{recursive:!0,mode:448}),dir}async function removeMonitorStateDir(terminalDir,monitorId){await rm8(monitorStateDir(terminalDir,monitorId),{recursive:!0,force:!0})}var TerminalManager=class{constructor(options={}){this.runtimes=new Map,this.monitorIds=new Map,this.exited=new Set,this.reservations=0,this.maxSessions=options.maxSessions??DEFAULT_MAX_SESSIONS,this.scrollback=options.scrollback}get size(){return this.runtimes.size}get activeSize(){return this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations}reserve(){if(this.reconcileRuntimes(),this.runtimes.size-this.exited.size+this.reservations>=this.maxSessions)return null;this.reservations+=1;let released=!1;return()=>{released||(released=!0,this.reservations-=1)}}async create(command,options){let pty=await loadPty(),release4=this.reserve();if(!release4)throw new pty.SessionRegistryCapacityError(this.maxSessions);this.registry??=new pty.SessionRegistry({maxSessions:this.maxSessions});let registry=this.registry,runtimeOptions={...options,scrollback:this.scrollback},{TerminalRuntimeSession}=await import("./runtime-session-CWJNFRHY.js"),runtime=new TerminalRuntimeSession(command,runtimeOptions),entry;try{entry=await registry.create({command,session:runtime.session})}catch(error2){throw release4(),runtime.dispose(),runtime.session.kill(),error2}return this.runtimes.set(entry.id,runtime),runtime.session.onExit(()=>{this.exited.add(entry.id)}),release4(),this.reconcileRuntimes(),{id:entry.id,runtime}}get(id){let registry=this.registry;return!registry||!registry.get(id)?null:this.runtimes.get(id)??null}bindMonitorId(monitorId,sessionId){this.monitorIds.set(monitorId,sessionId)}monitorIdOf(runtimeId){for(let[monitorId,sessionId]of this.monitorIds)if(sessionId===runtimeId)return monitorId}resolveId(idOrMonitorId){if(idOrMonitorId.startsWith("mon_"))return this.monitorIds.get(idOrMonitorId);let registry=this.registry;if(registry)return registry.get(idOrMonitorId)?idOrMonitorId:void 0}list(){let registry=this.registry;if(!registry)return[];let result3=[];for(let entry of registry.list()){let runtime=this.runtimes.get(entry.id);runtime&&result3.push({id:entry.id,runtime})}return result3}async stop(id){let registry=this.registry;if(!registry)return!1;let stopped=await registry.stop(id);return this.reconcileRuntimes(),stopped}async teardown(){let registry=this.registry;registry&&await registry.teardown(),this.registry=void 0;for(let runtime of this.runtimes.values())runtime.dispose();this.runtimes.clear(),this.exited.clear(),this.monitorIds.clear()}reconcileRuntimes(){let registry=this.registry;if(!registry)return;let liveIds=new Set(registry.list().map(entry=>entry.id));for(let[id,runtime]of this.runtimes)if(!liveIds.has(id)){runtime.dispose(),this.runtimes.delete(id),this.exited.delete(id);for(let[monitorId,sessionId]of this.monitorIds)sessionId===id&&this.monitorIds.delete(monitorId)}}};import{randomBytes as randomBytes5}from"node:crypto";import{watch}from"node:fs";import{access as access2,lstat,open as open4,stat as stat5}from"node:fs/promises";import{basename as basename16,dirname as dirname35,join as join53,resolve as resolve29}from"node:path";import{createHash as createHash19}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash19("sha256"),first=Buffer.alloc(Math.min(65536,metadata.size));if(first.length>0&&(await handle.read(first,0,first.length,0),hash.update(first)),metadata.size>65536){let middle=Buffer.alloc(65536);await handle.read(middle,0,middle.length,Math.floor((metadata.size-middle.length)/2)),hash.update(middle);let last=Buffer.alloc(65536);await handle.read(last,0,last.length,metadata.size-last.length),hash.update(last)}return`${metadata.size}:${hash.digest("hex")}`}var FileWatchLoop=class{#check;#timer;#stopped=!1;constructor(check){this.#check=check,this.#start()}pause(){this.#timer!==void 0&&(clearInterval(this.#timer),this.#timer=void 0)}resume(){this.#stopped||this.#timer!==void 0||(this.#start(),this.#check())}stop(){this.#stopped=!0,this.pause()}#start(){this.#timer=setInterval(this.#check,250)}};var MonitorLineBuffer=class{#tail="";append(chunk){let remaining=this.#tail+chunk,lines=[];for(;;){let newline=remaining.indexOf(`
2133
2133
  `);if(newline<0)break;let rawLine=remaining.slice(0,newline);remaining=remaining.slice(newline+1),lines.push(rawLine.endsWith("\r")?rawLine.slice(0,-1):rawLine)}return this.#tail=remaining.length>65536?remaining.slice(-65536):remaining,lines}};var MONITOR_ID_ALPHABET="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function allocateMonitorId(){let id="mon_",buffer=0,bits=0;for(let byte of randomBytes5(10))for(buffer=buffer<<8|byte,bits+=8;bits>=5;)bits-=5,id+=MONITOR_ID_ALPHABET[buffer>>bits&31];return id}var MonitorRegistry=class{#records=new Map;#emit;#onChange;#onEnded;#onFire;#reserve;#files=new Map;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#pending=new Set;#lifecycle=0;constructor(emit,options){this.#emit=emit,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire,this.#reserve=options?.reserve}setParked(parked){if(this.#parked!==parked){this.#parked=parked;for(let record7 of this.#files.values())parked?record7.watch.pause():record7.paused||record7.watch.resume()}}snapshot(){return[...this.#records.values(),...this.#files.values()].map(record7=>({id:record7.id,monitorId:record7.monitorId,description:record7.description,paused:record7.paused,startedAtMs:record7.startedAtMs,command:record7.command,filter:record7.filter?.source??null,persistent:record7.persistent,deadlineMs:record7.deadlineMs,fireCount:record7.fireCount,lastFiredAtMs:record7.lastFiredAtMs,expiresAt:record7.expiresAt,fireWindow:"fireWindow"in record7?record7.fireWindow:void 0}))}async registerFile(options){if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.");this.#pendingRegistrations+=1;let lifecycle=this.#lifecycle,release4=this.#reserve?.();if(this.#reserve&&!release4)throw this.#pendingRegistrations-=1,new Error("Cannot create file monitor: terminal capacity is already in use.");let pending={release:release4??void 0,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),options.timeoutMs),settled:!1};this.#pending.add(pending);let path15=resolve29(options.cwd,options.path),parent=dirname35(path15),approvedParent;try{await this.#registrationAwait(pending,access2(parent)),approvedParent=realpathWithoutOpen(parent);let approvedParentAtPermission=options.approvedParent;if(approvedParentAtPermission!==void 0&&approvedParent!==approvedParentAtPermission)throw new Error(`Cannot watch file: parent directory changed during permission approval: ${parent}`);if(this.#disposed)throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2 instanceof Error&&error2.message.includes("disposed")?error2:error2?.code!=="ENOENT"?new Error(`Cannot access parent directory ${parent}: ${error2 instanceof Error?error2.message:String(error2)}`):new Error(`Cannot watch file: parent directory does not exist: ${parent}`)}let initial=null,initialHandle;try{if((await this.#registrationAwait(pending,lstat(path15))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path15}`);if(initialHandle=await this.#registrationAwait(pending,open4(path15,"r"),async handle=>{await handle.close()}),initial=await this.#registrationAwait(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path15}`);if(realpathWithoutOpen(path15)!==join53(approvedParent,basename16(path15)))throw new Error(`Cannot watch file: target identity changed: ${path15}`);if((await this.#registrationAwait(pending,lstat(path15))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path15}`);let reboundStat=await this.#registrationAwait(pending,stat5(path15));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path15}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw this.#finishPending(pending),this.#pendingRegistrations-=1,error2}if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error("Cannot create file monitor: monitor registry is disposed.");let id=`watch_${this.#nextFileId++}`,watcher;try{let activationParent=realpathWithoutOpen(parent);if(activationParent!==approvedParent)throw new Error(`Cannot watch file: parent directory changed during registration: ${parent}`);await this.#registrationAwait(pending,probeDirectoryOpenable(activationParent)),watcher=watch(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename16(String(name))===basename16(path15))&&this.#checkFile(id)})}catch(error2){throw this.#finishPending(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path15}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record8=this.#files.get(id);record8&&this.#settleFile(record8,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#finishPending(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath2=join53(approvedParent,basename16(path15)),digest3;try{digest3=initial&&initialHandle?await this.#registrationAwait(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#emit({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError);if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let persistent=options.persistent??options.expiresAt!==void 0,record7={id,monitorId:options.monitorId??allocateMonitorId(),sessionId:id,description:options.description,startedAtMs:Date.now(),command:null,filter:null,persistent,deadlineMs:persistent?null:options.deadlineMs??Date.now()+options.timeoutMs,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,path:path15,canonicalPath:canonicalPath2,canonicalParent:approvedParent,event:options.event,watcher,release:release4??(()=>{}),watch:new FileWatchLoop(()=>{this.#checkFile(id)}),paused:!1,settled:!1,present:initial!==null,mtimeMs:initial?.mtimeMs??0,size:initial?.size??0,digest:digest3,device:initial?.dev??0,inode:initial?.ino??0,pendingChange:!1,dirty:!1,dirtyPasses:0,dirtyWindowStartedAt:0,checking:void 0,deadline:persistent?void 0:setTimeout(()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")},options.timeoutMs)};if(this.#files.set(id,record7),this.#parked&&record7.watch.pause(),finishRegistration(),this.#finishPending(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record7,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#notifyChange(),{id,monitorId:record7.monitorId}}fileCheckpoint(id){let r=this.#files.get(id);return r&&{dev:r.device,ino:r.inode,size:r.size,mtimeMs:r.mtimeMs,digest:r.digest,present:r.present}}emitFileLine(id,line){return this.#files.has(id)&&this.emitLine(id,line)}emitLine(id,line){let record7=this.#records.get(id)??this.#files.get(id);return!record7||record7.settled?!1:(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),!0)}async stopFile(id){let record7=this.#files.get(id);return record7?(this.#settleFile(record7,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record7 of records)this.#settleFile(record7,"watcher killed");for(let pending of[...this.#pending])this.#finishPending(pending);return records.length}#settleFile(record7,summary){if(record7.settled)return;record7.settled=!0,record7.watch.stop(),clearTimeout(record7.deadline),record7.watcher.close(),record7.release(),this.#files.delete(record7.id),this.#notifyChange(),this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#emitEnded(record7,reason,null)}async#checkFile(id){let record7=this.#files.get(id);if(!(!record7||record7.settled||record7.paused||this.#parked)){if(record7.checking){record7.dirty=!0;return}return record7.checking=this.#checkFileImpl(record7).catch(error2=>{record7.settled||this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record7.checking=void 0;let now2=Date.now();now2-record7.dirtyWindowStartedAt>=1e3&&(record7.dirtyWindowStartedAt=now2,record7.dirtyPasses=0),record7.dirty&&!record7.settled&&record7.dirtyPasses<1?(record7.dirty=!1,record7.dirtyPasses+=1,this.#checkFile(id)):record7.dirty=!1}),record7.checking}}async#checkFileImpl(record7){if(record7.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname35(record7.path))!==record7.canonicalParent){this.#settleFile(record7,`watcher error: monitored parent changed: ${dirname35(record7.path)}`);return}if((await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(realpathWithoutOpen(record7.canonicalPath)!==record7.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);handle=await open4(record7.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record7.path}`);if((opened.dev!==record7.device||opened.ino!==record7.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);if(current=opened,(await lstat(record7.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record7.path}`);let reboundPath=await stat5(record7.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){this.#settleFile(record7,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await this.#digestHandle(handle):"",present&&handle){let afterDigest=await stat5(record7.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record7.path}`)}}finally{await handle?.close()}let changed=record7.event==="create"?!record7.present&&present:record7.present&&present&&(current.mtimeMs!==record7.mtimeMs||current.size!==record7.size||digest3!==record7.digest);record7.pendingChange||=changed,!record7.present&&current&&(record7.device=current.dev,record7.inode=current.ino),record7.present=present,record7.mtimeMs=current?.mtimeMs??0,record7.size=current?.size??0,record7.digest=digest3,!(!record7.pendingChange||record7.paused||record7.settled)&&(record7.pendingChange=!1,!record7.settled&&(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line:`${record7.event} ${record7.path}`}),this.#settleFile(record7,"watcher completed")))}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record7={id:options.id,monitorId:options.monitorId??allocateMonitorId(),sessionId:options.id,description:options.description,startedAtMs:Date.now(),command:options.command??null,persistent:options.persistent??durable,deadlineMs:options.persistent??durable?null:options.deadlineMs??null,fireCount:0,lastFiredAtMs:null,expiresAt:options.expiresAt,runtime:options.runtime,filter:options.filter,lineBuffer:new MonitorLineBuffer,mutedDropped:0,paused:!1,settled:!1,fireWindow:durable?{...options.fireWindow??{startMs:Date.now(),count:0}}:void 0,unsubscribeOutput:void 0,unsubscribeExit:void 0};return this.#records.set(record7.id,record7),this.#notifyChange(),this.#consume(record7,record7.runtime.fullOutput()),record7.unsubscribeOutput=record7.runtime.onOutput(chunk=>this.#consume(record7,chunk)),record7.unsubscribeExit=record7.runtime.session.onExit(()=>this.#settle(record7)),record7.runtime.exited&&this.#settle(record7),record7.monitorId}pause(ids){let paused=[];for(let id of ids){let record7=this.#records.get(id)??this.#files.get(id);!record7||record7.paused||(record7.paused=!0,"watch"in record7&&record7.watch.pause(),paused.push(record7.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#records.keys(),...this.#files.keys()])}resume(ids){let candidates=ids??[...this.#records.keys(),...this.#files.keys()],resumed=[];for(let id of candidates){let record7=this.#records.get(id)??this.#files.get(id);if(!record7?.paused)continue;record7.paused=!1;let mutedDropped="mutedDropped"in record7?record7.mutedDropped:0;"mutedDropped"in record7&&(record7.mutedDropped=0),"fireWindow"in record7&&record7.fireWindow!==void 0&&(record7.fireWindow.count=0),resumed.push({id:record7.id,mutedDropped}),"watch"in record7&&!this.#parked&&record7.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#records.get(id)?.mutedDropped??0}rearm(id){let record7=this.#records.get(id)??this.#files.get(id);return record7?record7.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){for(let record7 of this.#records.values())if(record7.monitorId===monitorId)return record7.fireWindow={...fireWindow2},!0;return!1}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record7 of[...this.#records.values()])this.#disposeRecord(record7);for(let record7 of this.#files.values())this.#settleFile(record7,"watcher disposed");for(let pending of this.#pending)this.#finishPending(pending);this.#records.clear(),this.#notifyChange()}#finishPending(pending,transfer=!1){pending.settled||(pending.settled=!0,clearTimeout(pending.deadline),this.#pending.delete(pending),transfer?pending.release=void 0:(pending.abort.abort(),pending.release?.()))}async#registrationAwait(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value2=>lateCleanup?.(value2),()=>{}),new Error("Cannot create file monitor: registration timed out or was disposed.");let aborted=!1,abort=new Promise((_,reject)=>pending.abort.signal.addEventListener("abort",()=>{aborted=!0,reject(new Error("Cannot create file monitor: registration timed out or was disposed."))},{once:!0})),guarded=operation.then(value2=>(aborted&&lateCleanup?.(value2),value2),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}#notifyChange(){this.#onChange?.(this.snapshot())}#consume(record7,chunk){if(!(record7.settled||chunk.length===0)){for(let line of record7.lineBuffer.append(chunk))if(!record7.filter||record7.filter.test(line)){if(record7.paused){record7.mutedDropped+=1;continue}if(this.#emitForRecord(record7,{type:"line",id:record7.id,description:record7.description,line}),record7.fireWindow!==void 0){let now2=Date.now();now2-record7.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record7.fireWindow={startMs:now2,count:0}),record7.fireWindow.count+=1,record7.fireWindow.count>=DEFAULT_DURABLE_MONITOR_FIRE_BUDGET&&(record7.paused=!0,this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:FIRE_BUDGET_AUTO_MUTE_SUMMARY}),this.#notifyChange())}}}}#settle(record7){if(record7.settled)return;record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#notifyChange();let status=describeExit(record7.runtime)??"exited",code=record7.runtime.exitResult?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#emitForRecord(record7,{type:"summary",id:record7.id,description:record7.description,summary:`watcher ${status}${codeText}`});let exit=record7.runtime.exitResult;this.#emitEnded(record7,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record7){record7.settled||(record7.settled=!0,record7.unsubscribeOutput?.(),record7.unsubscribeExit?.(),this.#records.delete(record7.id),this.#emitEnded(record7,"disposed",null))}#emitForRecord(record7,event){record7.fireCount+=1,record7.lastFiredAtMs=Date.now(),this.#emit(event),record7.settled||this.#onFire?.(this.snapshot())}#emitEnded(record7,reason,exitCode){this.#onEnded?.({id:record7.id,description:record7.description,startedAtMs:record7.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record7.fireCount})}};var MAX_PARKED_MONITOR_EVENTS=100,MAX_PARKED_EXITS=32,TerminalSessionBundle=class{#sinks=null;#parkedMonitorEvents=[];#parkedMonitorEndings=[];#parkedExits=new Map;#backgrounds=new Map;#torndown=!1;constructor(options){this.manager=new TerminalManager(options),this.monitors=new MonitorRegistry(event=>this.#dispatchMonitorEvent(event),{onChange:snapshot=>this.#sinks?.onMonitorState(snapshot),onFire:snapshot=>this.#sinks?.onMonitorState(snapshot,!1),onEnded:event=>{this.#sinks?this.#sinks.onMonitorEnded(event):this.#parkedMonitorEndings.push(event)},reserve:()=>this.manager.reserve()})}bind(sinks){if(this.#torndown)return;this.#sinks=sinks;let parkedMonitorEvents=this.#parkedMonitorEvents;this.#parkedMonitorEvents=[];let parkedMonitorEndings=this.#parkedMonitorEndings;this.#parkedMonitorEndings=[];let parkedExits=[...this.#parkedExits];this.#parkedExits.clear(),sinks.onMonitorState(this.monitors.snapshot()),sinks.onBackgroundState(this.backgroundSnapshot());for(let event of parkedMonitorEvents)sinks.onMonitorEvent(event);for(let event of parkedMonitorEndings)sinks.onMonitorEnded(event);for(let[id,runtime]of parkedExits)sinks.onBackgroundExit(id,runtime)}park(){this.#sinks=null}backgroundSnapshot(){return[...this.#backgrounds.values()]}notifyBackgroundStart(id,description,startedAtMs=Date.now()){this.#torndown||(this.#backgrounds.set(id,{id,description,startedAtMs}),this.#sinks?.onBackgroundState(this.backgroundSnapshot()))}notifyBackgroundExit(id,runtime){if(!this.#torndown){if(this.#backgrounds.delete(id)&&this.#sinks?.onBackgroundState(this.backgroundSnapshot()),this.#sinks){this.#sinks.onBackgroundExit(id,runtime);return}this.#parkedExits.size>=MAX_PARKED_EXITS||this.#parkedExits.set(id,runtime)}}async teardown(){this.#torndown||(this.#parkedMonitorEvents=[],this.#parkedExits.clear(),this.monitors.dispose(),this.#backgrounds.size>0&&(this.#backgrounds.clear(),this.#sinks?.onBackgroundState([])),this.#torndown=!0,this.#parkedMonitorEndings=[],this.#sinks=null,await this.manager.teardown())}#dispatchMonitorEvent(event){if(!this.#torndown){if(this.#sinks){this.#sinks.onMonitorEvent(event);return}this.#parkedMonitorEvents.push(event),this.#parkedMonitorEvents.length>MAX_PARKED_MONITOR_EVENTS&&this.#parkedMonitorEvents.shift()}}},parkedBundles=new Map;async function parkBundle(sessionKey,bundle){let previous=parkedBundles.get(sessionKey);parkedBundles.set(sessionKey,bundle),previous&&previous!==bundle&&await previous.teardown()}function claimParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);return parkedBundles.delete(sessionKey),bundle}async function teardownParkedBundle(sessionKey){let bundle=parkedBundles.get(sessionKey);parkedBundles.delete(sessionKey),await bundle?.teardown()}function sessionKeyOf(ctx){return ctx?.sessionManager?.getSessionId?.()}function createBundle(state){return new TerminalSessionBundle({maxSessions:state.settings.maxSessions,scrollback:state.settings.scrollback})}function bundleSinks(pi,state){return{onMonitorEvent:event=>state.monitorNotifier?.notifyEvent(event),onMonitorEnded:event=>{if(pi.events?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),pi.rpc?.emit(TERMINAL_MONITOR_ENDED_EVENT,event),event.reason==="disposed")return;let dir=terminalStateDir(state.ctx),monitorId=state.bundle?.manager.monitorIdOf(event.id);dir===void 0||monitorId===void 0||removeMonitorStateDir(dir,monitorId).catch(error2=>{state.ctx?.ui?.notify?.(`Could not remove the state dir of ${monitorId}: ${error2 instanceof Error?error2.message:String(error2)}`,"warning")})},onMonitorState:(snapshot,transition=!0)=>{state.parked||state.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,paused:entry.paused,startedAtMs:entry.startedAtMs,command:entry.command,filter:entry.filter,persistent:entry.persistent,deadlineMs:entry.deadlineMs,fireCount:entry.fireCount,lastFiredAtMs:entry.lastFiredAtMs}))};pi.events?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),pi.rpc?.emit(TERMINAL_MONITOR_STATE_EVENT,payload),transition&&(pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-monitors",activeCount:snapshot.length,monitors:snapshot.map(entry=>({id:entry.id,description:entry.description,startedAtMs:entry.startedAtMs}))}),state.manifestWriter&&state.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let record7=()=>{let writer=state.manifestWriter;if(writer)for(let entry of snapshot){if(state.recordedBackgroundIds.has(entry.id))continue;state.recordedBackgroundIds.add(entry.id);let identity=state.bundle?.manager.get(entry.id)?.identity();writer.recordBackgroundStart(entry.id,entry.description??entry.id,entry.startedAtMs,identity)}};if(state.manifestWriter===null&&state.ensurePersistence!==null&&snapshot.length>0){state.ensurePersistence().then(record7);return}record7()},onBackgroundExit:(id,runtime)=>{state.recordedBackgroundIds.delete(id),state.manifestWriter&&state.manifestWriter.recordBackgroundExit(id),state.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state){let requireBundle=()=>(state.bundle||(state.bundle=createBundle(state),state.bundle.monitors.setParked(state.parked),state.bundle.bind(bundleSinks(pi,state))),state.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state.ctx?.cwd??process.cwd()},get shellPath(){return state.shellPath},get defaultCols(){return state.settings.defaultCols},get defaultRows(){return state.settings.defaultRows},get timeoutAction(){return state.settings.timeoutAction},get maxDurableMonitors(){return state.settings.maxDurableMonitors},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state.monitorNotifier?.resume(ids),ensurePersistence:()=>state.ensurePersistence?.()??Promise.resolve()}}import{randomUUID as randomUUID9}from"node:crypto";import{mkdir as mkdir12}from"node:fs/promises";import{join as join54}from"node:path";var LEASE_RECORD_VERSION=2,generationTokens=new Map,liveTokens=new Set;function currentLeaseToken(encodedSessionId2){return generationTokens.get(encodedSessionId2)}function retireLeaseToken(token){liveTokens.delete(token)}function probeAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){let code=errorCode(error2);if(code==="EPERM")return!0;if(code==="ESRCH")return!1;throw error2}}var isFiniteNumber4=value2=>typeof value2=="number"&&Number.isFinite(value2);function readLeaseRecord(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let candidate=parsed;return!isFiniteNumber4(candidate.pid)||!isFiniteNumber4(candidate.startedAtMs)?"unparseable":{pid:candidate.pid,startedAtMs:candidate.startedAtMs,...isFiniteNumber4(candidate.v)?{v:candidate.v}:{},...typeof candidate.token=="string"?{token:candidate.token}:{},...isFiniteNumber4(candidate.bootAtMs)?{bootAtMs:candidate.bootAtMs}:{},...isFiniteNumber4(candidate.processStartedAtMs)?{processStartedAtMs:candidate.processStartedAtMs}:{},...isFiniteNumber4(candidate.acquiredAtMs)?{acquiredAtMs:candidate.acquiredAtMs}:{}}}catch{return"unparseable"}}async function readLeaseFile(path15){let raw=await readLeaseText(path15);return raw===void 0?"missing":readLeaseRecord(raw)}async function classifyLease(existing,self,probes){if(existing.pid===self.pid)return existing.token!==void 0&&(probes.liveTokens??liveTokens).has(existing.token)?"live-foreign":"self";if(!probeAlive(existing.pid,probes.isProcessAlive))return"dead";let observedStart;try{observedStart=await probes.readProcessStartMs(existing.pid)}catch{observedStart=void 0}return observedStart===void 0?"live-foreign":existing.processStartedAtMs===void 0?observedStart<=existing.startedAtMs+PROCESS_START_TOLERANCE_MS?"live-foreign":"reused":sameProcessStart(existing.processStartedAtMs,observedStart)?"live-foreign":"reused"}function holderOf(record7){return{pid:record7.pid,startedAtMs:record7.startedAtMs,...record7.bootAtMs!==void 0?{bootAtMs:record7.bootAtMs}:{}}}async function acquireTerminalLease(options){let now2=(options.now??Date.now)(),self=options.self??{pid:options.pid??process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs()},pid=options.pid??self.pid,path15=join54(options.dir,`${options.encodedSessionId}.lease`);await mkdir12(options.dir,{recursive:!0});let token=randomUUID9(),record7={v:LEASE_RECORD_VERSION,token,pid,startedAtMs:now2,bootAtMs:self.bootAtMs,processStartedAtMs:self.processStartedAtMs,acquiredAtMs:now2},acquired=()=>(generationTokens.set(options.encodedSessionId,token),liveTokens.add(token),{acquired:!0,path:path15,pid,token}),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},content=JSON.stringify(record7);for(let attempt2=0;attempt2<3;attempt2+=1){try{return await publishExclusive(path15,content),acquired()}catch(error2){if(errorCode(error2)!=="EEXIST")throw error2}let raw2=await readLeaseText(path15);if(raw2===void 0)continue;let existing=readLeaseRecord(raw2),verdict=existing==="unparseable"?"dead":await classifyLease(existing,{...self,pid},probes);if(verdict==="self")return await publishReplace(path15,content),acquired();if(verdict==="live-foreign"&&existing!=="unparseable")return{acquired:!1,holder:holderOf(existing)};let reclaim=await reclaimInspected(path15,raw2,probes);if(reclaim.outcome==="busy"&&reclaim.holder!==void 0){let{pid:holderPid,processStartedAtMs,bootAtMs}=reclaim.holder;return{acquired:!1,holder:{pid:holderPid,startedAtMs:processStartedAtMs,bootAtMs}}}}let raw=await readLeaseText(path15),last=raw===void 0?"unparseable":readLeaseRecord(raw);if(last!=="unparseable"&&await classifyLease(last,{...self,pid},probes)==="live-foreign")return{acquired:!1,holder:holderOf(last)};throw new Error(`terminal lease ${path15} kept changing while it was being acquired`)}async function releaseTerminalLease(handle){let existing=await readLeaseFile(handle.path);if(!(existing==="missing"||existing==="unparseable")&&existing.pid===handle.pid&&!(handle.token!==void 0&&existing.token!==void 0&&existing.token!==handle.token)&&(await unlinkIfPresent(handle.path),existing.token!==void 0)){liveTokens.delete(existing.token);for(let[sessionId,token]of generationTokens)token===existing.token&&generationTokens.delete(sessionId)}}var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",QUEUE_OVERHEAD_CHARS=512,MONITOR_NOTIFICATION_CUSTOM_TYPE="senpi-monitor:notification",WAKE_STREAK_QUIET_GAP_MULTIPLIER=2,systemScheduler={now:()=>Date.now(),setTimeout:(callback,delayMs)=>setTimeout(callback,delayMs),clearTimeout:timer=>clearTimeout(timer)};function boundedPositiveInt(value2,fallback,minimum,maximum){return Number.isFinite(value2)?Math.min(Math.max(Math.trunc(value2),minimum),maximum):fallback}function resolveSettings3(settings){return{coalesceWindowMs:boundedPositiveInt(settings.coalesceWindowMs,2e3,1,6e4),rateLimitMs:boundedPositiveInt(settings.rateLimitMs,5e3,1,36e5),maxLinesPerInjection:boundedPositiveInt(settings.maxLinesPerInjection,50,1,200),maxCharsPerInjection:boundedPositiveInt(settings.maxCharsPerInjection,4096,512,16384),wakeBudget:boundedPositiveInt(settings.wakeBudget,5,1,100)}}function eventBody(event){let value2=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value2).replace(/[\r\n]+/g," ").trimEnd()}function clip(text2,maxChars){return text2.length<=maxChars?text2:maxChars<=3?text2.slice(0,maxChars):`${text2.slice(0,maxChars-3)}...`}function formatEvents(events){let groups=new Map;for(let event of events){let group=groups.get(event.id)??{description:event.description,bodies:[]};group.bodies.push(eventBody(event)),groups.set(event.id,group)}return[...groups.values()].map(group=>`Monitor event(${group.description}): ${group.bodies.join(`
2134
2134
  `)}`).join(`
2135
2135
  `)}var MonitorNotifier=class{#deps;#scheduler;#events=[];#eventChars=0;#overflow=new Map;#lastInjectionAt=new Map;#lastInjectedBatch=new Map;#timer;#scheduledAt;#consecutiveWakes=0;#lastWakeAt;constructor(deps){this.#deps=deps,this.#scheduler=deps.scheduler??systemScheduler}notifyEvent(event){if(event.type==="summary"&&(this.#lastInjectionAt.delete(event.id),this.#lastInjectedBatch.delete(event.id)),!getTerminalNotificationDelivery(this.#deps,MONITOR_NOTIFICATION_CUSTOM_TYPE))return;let settings=resolveSettings3(this.#deps.getSettings()),rendered=`Monitor event(${event.description}): ${eventBody(event)}`,queueLimit=Math.max(1,settings.maxCharsPerInjection-QUEUE_OVERHEAD_CHARS);event.type!=="summary"&&(this.#events.length>=settings.maxLinesPerInjection||this.#eventChars+rendered.length>queueLimit)?this.#recordOverflow(event):(this.#events.push(event),this.#eventChars+=rendered.length),this.#schedule(settings.coalesceWindowMs)}noteActivity(){this.#consecutiveWakes=0}resume(ids){for(let id of ids)this.#lastInjectionAt.delete(id),this.#lastInjectedBatch.delete(id);this.#consecutiveWakes=0}rearm(id){this.resume([id])}dispose(){this.#timer!==void 0&&this.#scheduler.clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledAt=void 0,this.#events=[],this.#eventChars=0,this.#overflow.clear(),this.#lastInjectedBatch.clear()}#recordOverflow(event){let overflow=this.#overflow.get(event.id)??{id:event.id,description:event.description,count:0,kinds:new Set};overflow.count++,overflow.kinds.add(event.type),this.#overflow.set(event.id,overflow)}#schedule(delayMs){let due=this.#scheduler.now()+delayMs;this.#timer!==void 0&&this.#scheduledAt!==void 0&&this.#scheduledAt<=due||(this.#timer!==void 0&&this.#scheduler.clearTimeout(this.#timer),this.#scheduledAt=due,this.#timer=this.#scheduler.setTimeout(()=>this.#flush(),delayMs))}#flush(){this.#timer=void 0,this.#scheduledAt=void 0;let delivery=getTerminalNotificationDelivery(this.#deps,MONITOR_NOTIFICATION_CUSTOM_TYPE);if(!delivery){this.dispose();return}let settings=resolveSettings3(this.#deps.getSettings()),now2=this.#scheduler.now(),pendingIds=new Set([...this.#events.map(event=>event.id),...this.#overflow.keys()]);if(pendingIds.size===0)return;let summaryIds=new Set(this.#events.filter(event=>event.type==="summary").map(event=>event.id)),ready=new Set([...pendingIds].filter(id=>{if(summaryIds.has(id))return!0;let last=this.#lastInjectionAt.get(id);return last===void 0||now2-last>=settings.rateLimitMs}));if(ready.size===0){this.#scheduleNextRateLimit(pendingIds,now2,settings);return}let fingerprints=this.#batchFingerprints(ready),suppressedIds=new Set([...fingerprints].filter(([id,fingerprint])=>this.#lastInjectedBatch.get(id)===fingerprint).map(([id])=>id)),injectedIds=new Set([...ready].filter(id=>!suppressedIds.has(id))),selected=this.#events.filter(event=>injectedIds.has(event.id)),deferred=this.#events.filter(event=>!ready.has(event.id));if(injectedIds.size===0){this.#discardSuppressed(deferred,now2,settings);return}let overflowCount=[...this.#overflow.values()].filter(overflow=>injectedIds.has(overflow.id)).reduce((total,overflow)=>total+overflow.count,0);this.#lastWakeAt!==void 0&&now2-this.#lastWakeAt>settings.rateLimitMs*WAKE_STREAK_QUIET_GAP_MULTIPLIER&&(this.#consecutiveWakes=0);let deliversSummary=selected.some(event=>event.type==="summary"&&event.summary!==FIRE_BUDGET_AUTO_MUTE_SUMMARY),reachesBudget=!deliversSummary&&this.#consecutiveWakes+1>=settings.wakeBudget,pauseNotice=reachesBudget?"Monitor paused after repeated updates. Completion still wakes this session; peek bash_output or re-arm only for intermediate events.":"",content=this.#buildMessage(selected,overflowCount,pauseNotice,settings.maxCharsPerInjection),details={monitors:this.#monitorDetails(selected,injectedIds)};delivery.send(content,reachesBudget?{forceWake:!0,details}:{details}),this.#lastWakeAt=now2;for(let id of injectedIds){this.#lastInjectionAt.set(id,now2),this.#overflow.delete(id);let fingerprint=fingerprints.get(id);fingerprint===void 0?this.#lastInjectedBatch.delete(id):this.#lastInjectedBatch.set(id,fingerprint)}if(this.#events=deferred,this.#eventChars=deferred.reduce((total,event)=>total+`Monitor event(${event.description}): ${eventBody(event)}`.length,0),this.#consecutiveWakes=deliversSummary?0:this.#consecutiveWakes+1,reachesBudget){this.#deps.pauseMonitors([...injectedIds]),this.#events=[],this.#eventChars=0,this.#overflow.clear(),this.#consecutiveWakes=0;return}let remainingIds=new Set([...this.#events.map(event=>event.id),...this.#overflow.keys()]);remainingIds.size>0&&this.#scheduleNextRateLimit(remainingIds,now2,settings)}#scheduleNextRateLimit(ids,now2,settings){let nextAt=Math.min(...[...ids].map(id=>(this.#lastInjectionAt.get(id)??now2)+settings.rateLimitMs));this.#schedule(Math.max(1,nextAt-now2))}#batchFingerprints(ids){let fingerprints=new Map;for(let id of ids){if((this.#overflow.get(id)?.count??0)>0)continue;let batch=this.#events.filter(event=>event.id===id);batch.length===0||batch.some(event=>event.type!=="line")||fingerprints.set(id,batch.map(eventBody).join(`
@@ -2178,8 +2178,8 @@ manual \`&\` backgrounding \u2014 use the built-in session tools:
2178
2178
  \`["ctrl+c"]\`, \`["enter"]\`) to steer a REPL or interrupt a process.
2179
2179
  - \`bash_resize({ bash_id, cols, rows })\` resizes the PTY so full-screen programs reflow.
2180
2180
  - \`kill_bash({ bash_id })\` (or \`{ all: true }\`) tears the session tree down with no orphans.
2181
- `}var RESTORE_DIGEST_CUSTOM_TYPE="senpi-terminal:restore-digest",PREFIX="Terminal state after restart",BUCKETS=["restored","muted","lost","completed","attachedElsewhere","expired"];function isActionable(digest3){return digest3.results.some(result3=>result3.outcome==="lost"||result3.orphan!==void 0)||digest3.backgroundSessions.some(session=>session.outcome==="running")}var label2=result3=>`${result3.monitorId} "${result3.description}"`,outcomeName=outcome=>outcome.replace(/[A-Z]/g,letter=>` ${letter.toLowerCase()}`),downtimeNote=ms=>ms>0?` (offline up to ${formatElapsedSeconds(ms/1e3)})`:"";function orphanNote(orphan){return`orphan pid ${orphan.pid} ${orphan.action==="killed"?"killed":"left running"}`}function sentenceEntry(result3){let fallback=result3.outcome==="restored"||result3.outcome==="muted"?result3.kind==="file"?"rechecked":"respawned":void 0,notes=[result3.reason??fallback,result3.orphan&&orphanNote(result3.orphan)].filter(note=>note);return notes.length>0?`${label2(result3)} (${notes.join(", ")})`:label2(result3)}function backgroundEntry(session){if(session.outcome==="exited")return`${session.id} exited`;let pid=session.pid===void 0?"":`pid ${session.pid}, `;return`${session.id} "${session.command}" still running (${pid}output not captured)`}function decidedSentence(digest3){let clauses=[];for(let outcome of BUCKETS){let entries=digest3.results.filter(result3=>result3.outcome===outcome).map(sentenceEntry);entries.length>0&&clauses.push(`${outcomeName(outcome)} ${entries.length} - ${entries.join(", ")}`)}return digest3.backgroundSessions.length>0&&clauses.push(`background: ${digest3.backgroundSessions.map(backgroundEntry).join(", ")}`),`${PREFIX}${downtimeNote(digest3.downtimeMs)}: ${clauses.join("; ")||"nothing to restore"}.`}function buildRestoreDigest(digest3,meta){let outcome=meta.outcome==="decided"&&digest3.storeError?"corrupt":meta.outcome,holder=meta.holderPid===void 0?void 0:`pid ${meta.holderPid}`,content=outcome==="deferred"?holder===void 0?`${PREFIX}: waiting for the session lease; monitors come back here once it is acquired.`:`${PREFIX}: monitors held by ${holder}; they come back here when that process exits.`:outcome==="corrupt"?`${PREFIX}: the saved monitor state was unreadable, nothing was restored.`:decidedSentence(digest3);return{customType:RESTORE_DIGEST_CUSTOM_TYPE,content,display:!0,details:{generation:meta.generation,outcome,downtimeMs:digest3.downtimeMs,downtimeIsUpperBound:!0,...meta.holderPid===void 0?{}:{holder:{pid:meta.holderPid}},actionable:isActionable(digest3),monitors:digest3.results,backgroundSessions:digest3.backgroundSessions}}}function createDigestSlot(){let pendingMessage,decidedDelivered=!1,isDecided=message=>message.details.outcome!=="deferred";return{set(message){decidedDelivered||!isDecided(message)&&pendingMessage!==void 0&&isDecided(pendingMessage)||(pendingMessage=message)},pending:()=>pendingMessage,flush(deliver2){let message=pendingMessage;return message===void 0||!deliver2(message)?!1:(pendingMessage=void 0,isDecided(message)&&(decidedDelivered=!0),!0)}}}function deliverRestoreDigest(pi,ctx,message){if(ctx?.model===void 0)return!1;ctx.ui?.notify(message.content,"info");let actionable=message.details.actionable;return pi.sendMessage(message,{triggerTurn:actionable,deliverAs:actionable?"followUp":"nextTurn"}),!0}function monitorLine(result3){let reason=result3.reason===void 0?"":`: ${result3.reason}`,orphan=result3.orphan===void 0?"":` (${orphanNote(result3.orphan)})`,tone=result3.outcome==="lost"||result3.orphan!==void 0?"warning":"dim";return{text:`${label2(result3)} ${outcomeName(result3.outcome)}${reason}${orphan}`,tone}}var renderRestoreDigest=noticeMessageRenderer(message=>{let details=message.details;if(details===void 0)return;let sessions2=details.backgroundSessions,counts=`${details.monitors.length} monitors \xB7 ${sessions2.length} background sessions`,content=typeof message.content=="string"?message.content:"";return{title:`${PREFIX}${downtimeNote(details.downtimeMs)}`,tone:details.actionable?"warning":"accent",why:details.outcome==="decided"?counts:content.slice(PREFIX.length+2),extra:[...details.monitors.map(monitorLine),...sessions2.map(session=>({text:backgroundEntry(session),tone:"dim"}))]}});function registerRestoreDigestRenderer(pi){pi.registerMessageRenderer(RESTORE_DIGEST_CUSTOM_TYPE,renderRestoreDigest)}import{existsSync as existsSync28}from"node:fs";import{stat as stat6}from"node:fs/promises";import{isAbsolute as isAbsolute17}from"node:path";import{execFile as execFile3}from"node:child_process";import{readFile as readFile13}from"node:fs/promises";var OWNER_START_TOLERANCE_MS=2e3,DEFAULT_KILL_GRACE_MS=1e3,LSTART_LENGTH=24;function errorCode3(error2){return typeof error2=="object"&&error2!==null&&"code"in error2?error2.code:void 0}function isProcessAlive2(pid){try{return process.kill(pid,0),!0}catch(error2){return errorCode3(error2)!=="ESRCH"}}function execText(command,args){return new Promise((resolve46,reject)=>{let env={...process.env,LC_ALL:"C"};execFile3(command,[...args],{encoding:"utf8",timeout:5e3,windowsHide:!0,env},(error2,stdout)=>{error2?reject(error2):resolve46(stdout)})})}async function readLinuxEvidence(pid){let[startedAtMs,environ,cmdline]=await Promise.all([readProcessStartMs(pid),readFile13(`/proc/${pid}/environ`,"utf8"),readFile13(`/proc/${pid}/cmdline`,"utf8")]);return{startedAtMs,environ,argv:cmdline.split("\0").filter(Boolean).join(" ")}}async function readDarwinEvidence(pid){let text2=(await execText("ps",["-o","lstart=,command=","-p",String(pid)])).trim();if(!(text2.length<=LSTART_LENGTH))return{startedAtMs:new Date(text2.slice(0,LSTART_LENGTH)).getTime(),argv:text2.slice(LSTART_LENGTH).trim()}}async function readWindowsEvidence(pid){let script=`Get-CimInstance Win32_Process -Filter "ProcessId=${pid}" | ForEach-Object { $_.CreationDate.ToUniversalTime().ToString('o') + '|' + $_.CommandLine }`,text2=(await execText("powershell",["-NoProfile","-NonInteractive","-Command",script])).trim(),separator=text2.indexOf("|");if(!(separator<0))return{startedAtMs:new Date(text2.slice(0,separator)).getTime(),argv:text2.slice(separator+1).trim()}}function defaultEvidenceReader(platform5){return platform5==="linux"?readLinuxEvidence:platform5==="darwin"?readDarwinEvidence:platform5==="win32"?readWindowsEvidence:async()=>{}}function argvMatches(observed,argv){if(observed===void 0||argv.length===0)return!1;let command=argv[argv.length-1]??"";return observed.trim()===argv.join(" ")||command.length>0&&observed.includes(command)}async function confirmOwner(runtime,monitorId,probes={}){let platform5=probes.platform??process.platform;try{if(!sameBoot(runtime.bootAtMs,(probes.bootAtMs??processBootAtMs)())||!(probes.isProcessAlive??isProcessAlive2)(runtime.pid))return"dead";let evidence=await(probes.readProcessEvidence??defaultEvidenceReader(platform5))(runtime.pid);return evidence?.startedAtMs===void 0||!Number.isFinite(evidence.startedAtMs)||Math.abs(evidence.startedAtMs-runtime.startedAtMs)>OWNER_START_TOLERANCE_MS?"unverifiable":(platform5==="linux"&&monitorId!==void 0?(evidence.environ??"").split("\0").includes(`SENPI_MONITOR_ID=${monitorId}`):argvMatches(evidence.argv,runtime.argv))?"confirmed":"unverifiable"}catch{return"unverifiable"}}async function killTree(runtime,options={}){let kill=options.kill??((pid,signal)=>process.kill(pid,signal)),wait=options.wait??(ms=>new Promise(resolve46=>setTimeout(resolve46,ms))),target=runtime.processGroupId!==void 0?-runtime.processGroupId:runtime.pid;try{kill(target,"SIGTERM")}catch(error2){if(errorCode3(error2)==="ESRCH")return{action:"already-dead"};throw error2}if(await wait(options.graceMs??DEFAULT_KILL_GRACE_MS),(options.isProcessAlive??isProcessAlive2)(runtime.pid))try{kill(target,"SIGKILL")}catch(error2){if(errorCode3(error2)!=="ESRCH")throw error2}return{action:"killed"}}async function reapBeforeRespawn(runtime,monitorId,probes={}){let verdict=await confirmOwner(runtime,monitorId,probes);return verdict==="dead"?{action:"none"}:verdict==="confirmed"&&(probes.platform??process.platform)!=="win32"?killTree(runtime,probes):{action:"none",reason:`previous watcher pid ${runtime.pid} unverifiable`}}import{open as open5}from"node:fs/promises";var TAIL_BYTES=256*1024;async function sessionActivityBeforeMs(sessionFile,beforeMs){if(sessionFile===void 0)return;let text2;try{let handle=await open5(sessionFile,"r");try{let{size}=await handle.stat(),length=Math.min(size,TAIL_BYTES),buffer=Buffer.alloc(length);await handle.read(buffer,0,length,size-length),text2=buffer.toString("utf8")}finally{await handle.close()}}catch(error2){if(typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT")return;throw error2}let newest;for(let match of text2.matchAll(/"timestamp":"([^"]+)"/g)){let stamp=Date.parse(match[1]??"");!Number.isFinite(stamp)||stamp>=beforeMs||(newest===void 0||stamp>newest)&&(newest=stamp)}return newest}var TERMINAL_MANIFEST_VERSION=1,TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS=3e4;var InvalidTerminalManifestError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidTerminalManifestError"}},RUNTIME_KINDS=["command","file"],DURABILITY_CLASSES=["ephemeral","restartable-command","checkpointed-file"],FILE_EVENTS=["create","modify"],isStr=value2=>typeof value2=="string"&&value2.length>0,isNum=value2=>typeof value2=="number"&&Number.isFinite(value2),isBool=value2=>typeof value2=="boolean",isObj=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function invalid(message){throw new InvalidTerminalManifestError(`terminal manifest is invalid: ${message}`)}function str(raw,field2){return isStr(raw[field2])||invalid(`field ${field2} must be a non-empty string`),raw[field2]}function num(raw,field2){return isNum(raw[field2])||invalid(`field ${field2} must be a finite number`),raw[field2]}function digest2(raw,field2){return typeof raw[field2]!="string"&&invalid(`field ${field2} must be a string`),raw[field2]}function bool(raw,field2){return isBool(raw[field2])||invalid(`field ${field2} must be a boolean`),raw[field2]}function opt(raw,field2,required){return raw[field2]===void 0?void 0:required(raw,field2)}function oneOf(values,raw,field2){let value2=raw[field2];return(typeof value2!="string"||!values.includes(value2))&&invalid(`field ${field2} must be one of: ${values.join(", ")}`),value2}function checkpoint(raw){return isObj(raw)||invalid("field lastCheckpoint must be an object"),{dev:num(raw,"dev"),ino:num(raw,"ino"),size:num(raw,"size"),mtimeMs:num(raw,"mtimeMs"),digest:digest2(raw,"digest"),present:bool(raw,"present")}}function fireWindow(raw){return isObj(raw)||invalid("field fireWindow must be an object"),{startMs:num(raw,"startMs"),count:num(raw,"count")}}function runtimeIdentity(raw,field2){let value2=raw[field2];isObj(value2)||invalid(`field ${field2} must be an object`);let argv=value2.argv;(!Array.isArray(argv)||!argv.every(isStr))&&invalid(`field ${field2}.argv must be an array of strings`);let pid=value2.pid;isNum(pid)||invalid(`field ${field2}.pid must be a finite number`);let groupId=value2.processGroupId;return groupId!==void 0&&!isNum(groupId)&&invalid(`field ${field2}.processGroupId must be a finite number`),{pid,...groupId!==void 0?{processGroupId:groupId}:{},startedAtMs:num(value2,"startedAtMs"),bootAtMs:num(value2,"bootAtMs"),argv}}function parseMonitor(entry){return isObj(entry)||invalid("a monitor entry must be an object"),{monitorId:str(entry,"monitorId"),sessionId:str(entry,"sessionId"),description:str(entry,"description"),runtimeKind:oneOf(RUNTIME_KINDS,entry,"runtimeKind"),durabilityClass:oneOf(DURABILITY_CLASSES,entry,"durabilityClass"),command:opt(entry,"command",str),path:opt(entry,"path",str),event:opt(entry,"event",(raw,field2)=>oneOf(FILE_EVENTS,raw,field2)),filter:opt(entry,"filter",str),cwd:opt(entry,"cwd",str),approvedParent:opt(entry,"approvedParent",str),createdAt:num(entry,"createdAt"),expiresAt:entry.expiresAt===void 0||entry.expiresAt===null?null:num(entry,"expiresAt"),persistent:bool(entry,"persistent"),suspended:bool(entry,"suspended"),lastCheckpoint:entry.lastCheckpoint===null?null:checkpoint(entry.lastCheckpoint),deliveryPaused:bool(entry,"deliveryPaused"),fireWindow:fireWindow(entry.fireWindow),...entry.runtime===void 0?{}:{runtime:runtimeIdentity(entry,"runtime")},...entry.deadlineMs===void 0?{}:{deadlineMs:num(entry,"deadlineMs")}}}function parseBackgroundSession(entry){return isObj(entry)||invalid("a background session entry must be an object"),{id:str(entry,"id"),command:str(entry,"command"),startedAtMs:num(entry,"startedAtMs"),...entry.runtime===void 0?{}:{runtime:runtimeIdentity(entry,"runtime")}}}function parseTerminalManifest(raw,ref){return isObj(raw)||invalid("the payload must be an object"),Array.isArray(raw.monitors)||invalid("field monitors must be an array"),Array.isArray(raw.backgroundSessions)||invalid("field backgroundSessions must be an array"),{version:TERMINAL_MANIFEST_VERSION,sessionId:ref.sessionId,monitors:raw.monitors.map(parseMonitor),backgroundSessions:raw.backgroundSessions.map(parseBackgroundSession),updatedAt:num(raw,"updatedAt")}}function reapplyPersistedMute(registry,monitor,runtimeId){return monitor.deliveryPaused?(registry.pause([runtimeId]),"muted"):"restored"}var stubRestoreHandlers={"restartable-command":()=>({outcome:"lost",reason:"no restore handler"}),"checkpointed-file":()=>({outcome:"lost",reason:"no restore handler"})};function emptyDigest(){return{restored:0,lost:0,expired:0,muted:0,completed:0,attachedElsewhere:0,storeError:!1,results:[],backgroundSessions:[],downtimeMs:0}}async function defaultBackgroundAlive(session){return session.runtime===void 0?!1:await confirmOwner(session.runtime,void 0)==="confirmed"}function resultFor(monitor,outcome,handled){return{monitorId:monitor.monitorId,description:monitor.description,kind:monitor.runtimeKind,outcome,...monitor.command!==void 0?{command:monitor.command}:{},...monitor.path!==void 0?{path:monitor.path}:{},...handled?.reason!==void 0?{reason:handled.reason}:{},...handled?.orphan!==void 0?{orphan:handled.orphan}:{}}}async function restoreTerminalState(options){let state;try{state=await options.manifest.read()}catch{return{...emptyDigest(),storeError:!0}}if(state===null)return emptyDigest();let now2=(options.now??Date.now)(),lastSeen=Math.max(state.updatedAt,await sessionActivityBeforeMs(options.sessionFile,options.processStartedAtMs??now2)??0),downtimeMs=Math.max(0,now2-lastSeen),handlers={...stubRestoreHandlers,...options.handlers},results=await Promise.all(state.monitors.map(async monitor=>{if(monitor.expiresAt!==null&&monitor.expiresAt<=now2)return resultFor(monitor,"expired");if(monitor.durabilityClass==="ephemeral"){if(monitor.deadlineMs===void 0||monitor.deadlineMs<=now2)return resultFor(monitor,"lost",{outcome:"lost",reason:"deadline passed while detached"});let handled2=await(monitor.runtimeKind==="file"?handlers["checkpointed-file"]:handlers["restartable-command"])(monitor,{downtimeMs,remainingMs:monitor.deadlineMs-now2});return resultFor(monitor,handled2.outcome,handled2)}let handled=await handlers[monitor.durabilityClass](monitor,{downtimeMs});return resultFor(monitor,handled.outcome,handled)})),isAlive2=options.isBackgroundAlive??defaultBackgroundAlive,backgroundSessions=await Promise.all(state.backgroundSessions.map(async session=>session.runtime!==void 0&&await isAlive2(session)?{id:session.id,command:session.command,outcome:"running",pid:session.runtime.pid}:{id:session.id,command:session.command,outcome:"exited"})),digest3={...emptyDigest(),results,backgroundSessions,downtimeMs};for(let result3 of results)digest3[result3.outcome]+=1;return digest3.lost+=backgroundSessions.length,digest3}var MAX_REASON_OUTPUT_CHARS=200,lost=(reason,orphan)=>({outcome:"lost",reason,...orphan!==void 0?{orphan}:{}});async function defaultDirectoryExists(path15){try{return(await stat6(path15)).isDirectory()}catch{return!1}}function compileFilter(source2){if(source2!==void 0)try{return new RegExp(source2)}catch{return}}function dimension(value2,fallback){return value2!==void 0&&Number.isFinite(value2)&&value2>=1?Math.trunc(value2):fallback}function exitsWithin(runtime,ms){return runtime.exited?Promise.resolve(!0):new Promise(resolve46=>{let timer=setTimeout(()=>{unsubscribe(),resolve46(!1)},ms),unsubscribe=runtime.session.onExit(()=>{clearTimeout(timer),resolve46(!0)})})}function firstOutputLine(runtime){return(sanitizeTerminalOutput(runtime.fullOutput()).split(`
2182
- `).map(text2=>text2.trim()).find(text2=>text2.length>0)??"").slice(0,MAX_REASON_OUTPUT_CHARS)}function orphanOf(runtime,reap){if(!(runtime===void 0||reap===void 0)){if(reap.action==="killed")return{pid:runtime.pid,action:"killed"};if(reap.reason!==void 0)return{pid:runtime.pid,action:"unverified"}}}async function restoreEnvironment(deps,monitor,context){let env={[MONITOR_ENV_ID]:monitor.monitorId,[MONITOR_ENV_RESTORED]:"1",[MONITOR_ENV_DOWNTIME_MS]:String(context.downtimeMs)},terminalDir=terminalStateDir(deps.ctx.getSessionContext?.());return monitor.persistent&&terminalDir!==void 0&&(env[MONITOR_ENV_STATE_DIR]=await ensureMonitorStateDir(terminalDir,monitor.monitorId)),env}function createRestartableCommandHandler(deps){let spawn13=deps.spawn??spawnCommandSession,directoryExists=deps.directoryExists??defaultDirectoryExists,reapOrphan=deps.reapOrphan??reapBeforeRespawn,graceMs=deps.graceMs??RESTORE_GRACE_MS;return async(monitor,context)=>{let ephemeralTimeLeft=monitor.persistent?void 0:context.remainingMs;if(monitor.runtimeKind!=="command"||!monitor.persistent&&ephemeralTimeLeft===void 0)return lost("not a restorable command watch");let{command,cwd}=monitor;if(command===void 0||command.length===0)return lost("no command was recorded");if(cwd===void 0||!isAbsolute17(cwd))return lost("no absolute cwd was recorded");if(!await directoryExists(cwd))return lost(`cwd no longer exists: ${cwd}`);let reap=monitor.runtime===void 0?void 0:await reapOrphan(monitor.runtime,monitor.monitorId),orphan=orphanOf(monitor.runtime,reap),spawned;try{spawned=await spawn13(deps.ctx,{command,cols:dimension(deps.ctx.defaultCols,DEFAULT_COLS),rows:dimension(deps.ctx.defaultRows,DEFAULT_ROWS),cwd,envOverrides:await restoreEnvironment(deps,monitor,context),...ephemeralTimeLeft!==void 0?{timeoutMs:ephemeralTimeLeft}:{}})}catch(error2){return lost(`spawn failed: ${error2 instanceof Error?error2.message:String(error2)}`,orphan)}deps.registry.register({id:spawned.id,monitorId:monitor.monitorId,description:monitor.description,command,persistent:monitor.persistent,deadlineMs:ephemeralTimeLeft!==void 0?Date.now()+ephemeralTimeLeft:null,runtime:spawned.runtime,filter:compileFilter(monitor.filter),...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}}),deps.ctx.manager.bindMonitorId(monitor.monitorId,spawned.id);let startedAt=Date.now();if(await exitsWithin(spawned.runtime,graceMs)){let code=spawned.runtime.exitResult?.exitCode??null;if(code===0)return{outcome:"completed",...orphan!==void 0?{orphan}:{}};let output=firstOutputLine(spawned.runtime),exit=code===null?"exited":`exited ${code}`;return lost(`${exit} in ${Date.now()-startedAt}ms${output.length>0?`: ${output}`:""}`,orphan)}deps.registry.emitLine(spawned.id,`restored after up to ${formatElapsedSeconds(context.downtimeMs/1e3)} offline; the command started fresh`),deps.onRestored?.(monitor.monitorId,spawned.id);let outcome=reapplyPersistedMute(deps.registry,monitor,spawned.id),runtime=spawned.runtime.identity();return{outcome,...orphan!==void 0?{orphan}:{},...runtime!==void 0?{runtime}:{}}}}import{stat as stat7}from"node:fs/promises";import{resolve as resolve30}from"node:path";function classifyDetachedChange(saved,live){return saved.present?live.present?live.dev!==saved.dev||live.ino!==saved.ino?"replaced":live.mtimeMs!==saved.mtimeMs||live.size!==saved.size||live.digest!==saved.digest?"modified":null:"gone":live.present?"created":null}function lost2(reason){return{outcome:"lost",reason}}function remainingMs(monitor,now2){return monitor.expiresAt===null?DEFAULT_RESTORED_WATCH_MS:Math.max(1,monitor.expiresAt-now2)}var DEFAULT_RESTORED_WATCH_MS=3e5;function createCheckpointedFileRestoreHandler(deps){let now2=deps.now??Date.now;return async(monitor,context)=>{if(monitor.runtimeKind!=="file"||monitor.path===void 0||monitor.cwd===void 0)return lost2(`monitor ${monitor.monitorId} is not a restorable file watch`);let ephemeral=monitor.durabilityClass==="ephemeral";if(ephemeral&&context.remainingMs===void 0)return lost2(`monitor ${monitor.monitorId} has no time left on its deadline`);let saved=monitor.lastCheckpoint;if(saved===null)return lost2(`monitor ${monitor.monitorId} has no checkpoint to compare against`);if(saved.present)try{if(!(await stat7(resolve30(monitor.cwd,monitor.path))).isFile())return lost2(`watched path is no longer a regular file: ${monitor.path}`)}catch(error2){return lost2(`watched path is gone: ${monitor.path} (${error2 instanceof Error?error2.message:error2})`)}let runtimeId;try{let startedAt=now2(),lifetime=ephemeral&&context.remainingMs!==void 0?{persistent:!1,deadlineMs:startedAt+context.remainingMs,timeoutMs:context.remainingMs}:{persistent:!0,deadlineMs:null,timeoutMs:remainingMs(monitor,startedAt)};runtimeId=(await deps.registry.registerFile({description:monitor.description,path:monitor.path,monitorId:monitor.monitorId,...lifetime,event:monitor.event??"create",cwd:monitor.cwd,...monitor.approvedParent!==void 0?{approvedParent:monitor.approvedParent}:{},...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}})).id}catch(error2){return lost2(`cannot re-watch ${monitor.path}: ${error2 instanceof Error?error2.message:String(error2)}`)}let live=deps.registry.fileCheckpoint(runtimeId);if(live===void 0)return lost2(`monitor ${monitor.monitorId} settled before its checkpoint was compared`);let change=classifyDetachedChange(saved,live);return change==="gone"?(await deps.registry.stopFile(runtimeId),lost2(`watched path is gone: ${monitor.path}`)):(deps.bindMonitorId?.(monitor.monitorId,runtimeId),change!==null&&deps.registry.emitFileLine(runtimeId,`changed while detached: ${change} ${monitor.path}`),deps.writer?.scheduleCheckpoint(monitor.monitorId,live),{outcome:"restored"})}}import{stat as stat8}from"node:fs/promises";import{join as join55}from"node:path";var LEASE_KEEPER_INTERVAL_MS=1e4;function isAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="EPERM"}}async function leaseFileExists(path15){try{return await stat8(path15),!0}catch{return!1}}function createLeaseKeeper(options){let intervalMs=options.intervalMs??LEASE_KEEPER_INTERVAL_MS,path15=join55(options.dir,`${options.encodedSessionId}.lease`),state="idle",holder=null,timer,inFlight=Promise.resolve(),arm=()=>{timer=setTimeout(()=>{timer=void 0,inFlight=tick().catch(error2=>{state==="waiting"&&arm(),options.onError?.(error2)})},intervalMs),timer.unref()},tryAcquire=async()=>{let result3=await acquireTerminalLease({dir:options.dir,encodedSessionId:options.encodedSessionId,now:options.now,self:options.self,isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs});if(state!=="waiting"){result3.acquired&&await releaseTerminalLease(result3);return}if(result3.acquired){state="owner",timer=void 0,await options.onTakeover(result3);return}holder=result3.holder,arm()},tick=async()=>{if(state!=="waiting")return;keeper.onTick?.();let current=holder,gone=current===null||!await leaseFileExists(path15)||!isAlive(current.pid,options.isProcessAlive);if(state==="waiting"){if(gone){await tryAcquire();return}arm()}},keeper={get state(){return state},start(initialHolder){state==="stopped"||state==="owner"||(holder=initialHolder,state="waiting",timer===void 0&&arm())},stop(){timer!==void 0&&clearTimeout(timer),timer=void 0,state!=="owner"&&(state="stopped")},settled:()=>inFlight};return keeper}import{unlink as unlink2}from"node:fs/promises";import{join as join56}from"node:path";function createTerminalManifestStore(session){return createSidecarStore({baseDir:join56(session.getSessionDir(),"extensions","terminal"),sessionId:session.getSessionId(),version:TERMINAL_MANIFEST_VERSION,tempPrefix:"terminal",parse:parseTerminalManifest})}var TerminalManifestWriter=class{#sessionId;#debounceMs;#now;#entries=new Map;#backgrounds=new Map;#pending=new Map;#timer;#tail=Promise.resolve();constructor(options){this.store=createTerminalManifestStore(options.session),this.#sessionId=options.session.getSessionId(),this.#debounceMs=options.debounceMs??TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS,this.#now=options.now??Date.now}recordRegister(registration){return this.#entries.set(registration.monitorId,this.#entryFor(registration)),this.#persist()}adoptRestored(entry){this.#entries.set(entry.monitorId,{...entry,suspended:!1})}persistRestored(){return this.#persist()}async seedFromDisk(){let state;try{state=await this.store.read()}catch{return}if(state!==null){for(let entry of state.monitors)entry.suspended||this.#entries.set(entry.monitorId,entry);for(let background of state.backgroundSessions)this.#backgrounds.set(background.id,background)}}durableCount(){let count=0;for(let entry of this.#entries.values())entry.durabilityClass!=="ephemeral"&&(count+=1);return count}observeMonitorState(snapshot){let live=new Map;for(let entry of snapshot){if(typeof entry.monitorId!="string"||entry.monitorId.length===0)throw new Error(`terminal manifest writer saw a monitor snapshot entry without a stable monitorId (runtime id ${entry.id}); surfacing instead of silently skipping it`);live.set(entry.monitorId,{paused:entry.paused,fireWindow:entry.fireWindow})}let changed=!1;for(let[monitorId,known]of this.#entries){let current=live.get(monitorId);if(current===void 0){if(known.suspended)continue;this.#entries.delete(monitorId),changed=!0;continue}let fireWindow2=current.fireWindow??known.fireWindow;(known.deliveryPaused!==current.paused||known.fireWindow.count!==fireWindow2.count)&&(this.#entries.set(monitorId,{...known,deliveryPaused:current.paused,fireWindow:fireWindow2}),changed=!0)}return changed?this.#persist():Promise.resolve()}scheduleCheckpoint(monitorId,checkpoint2){this.#pending.set(monitorId,checkpoint2),this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=setTimeout(()=>{this.#timer=void 0,this.#absorbPending(),this.#persist()},this.#debounceMs)}async flush(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#pending.size===0?await this.#tail:(this.#absorbPending(),await this.#persist())}async recordShutdown(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#absorbPending();for(let[monitorId,entry]of this.#entries)this.#entries.set(monitorId,{...entry,suspended:!0});await this.#persist()}recordBackgroundStart(id,command,startedAtMs,runtime){return this.#backgrounds.set(id,{id,command,startedAtMs:startedAtMs??this.#now(),...runtime===void 0?{}:{runtime}}),this.#persist()}recordBackgroundExit(id){return this.#backgrounds.delete(id)?this.#persist():Promise.resolve()}#absorbPending(){for(let[monitorId,checkpoint2]of this.#pending){let entry=this.#entries.get(monitorId);entry&&this.#entries.set(monitorId,{...entry,lastCheckpoint:checkpoint2})}this.#pending.clear()}#entryFor({monitorId,spec:spec2,runtime,deadlineMs}){let createdAt=this.#now(),persistent=spec2.persistent===!0;return{monitorId,sessionId:this.#sessionId,description:spec2.description,runtimeKind:spec2.kind,durabilityClass:persistent?spec2.kind==="file"?"checkpointed-file":"restartable-command":"ephemeral",command:spec2.kind==="command"?spec2.command:void 0,path:spec2.kind==="file"?spec2.path:void 0,event:spec2.kind==="file"?spec2.event:void 0,filter:spec2.kind==="command"?spec2.filter:void 0,cwd:spec2.cwd,approvedParent:spec2.kind==="file"?spec2.approvedParent:void 0,createdAt,expiresAt:persistent?createdAt+DURABLE_MONITOR_EXPIRY_MS:null,persistent,suspended:!1,lastCheckpoint:null,deliveryPaused:!1,fireWindow:{startMs:createdAt,count:0},...runtime===void 0?{}:{runtime},...deadlineMs===void 0||persistent?{}:{deadlineMs}}}async#removeFile(){try{await unlink2(this.store.filePath)}catch(error2){if(!(typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"))throw error2}this.store.clear()}#persist(){let run2=this.#tail.then(()=>this.#entries.size===0&&this.#backgrounds.size===0?this.#removeFile():this.store.write({version:TERMINAL_MANIFEST_VERSION,sessionId:this.#sessionId,monitors:[...this.#entries.values()],backgroundSessions:[...this.#backgrounds.values()],updatedAt:this.#now()}));return this.#tail=run2.then(()=>{},error2=>{this.persistFailure=error2}),this.#tail}};import{readdir as defaultReaddir,readFile as readFile14,stat as stat9,unlink as unlink3}from"node:fs/promises";import{join as join57}from"node:path";function isEnoent(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}async function unlinkIfPresent2(path15){try{await unlink3(path15)}catch(error2){if(!isEnoent(error2))throw error2}}var ABANDONED_TEMP_MS=3e4;async function sweepTerminalStateDir(dir,options){let names=(options.readdir?await options.readdir(dir):await defaultReaddir(dir)).slice(0,options.limit??500),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},removedLeases=0,removedManifests=0;for(let name of names){if(options.keep.has(name))continue;let path15=join57(dir,name);try{if(name.endsWith(".lock")){let seen=await reclaimLockState(path15,probes);seen.state==="stale"&&await breakStaleLock(path15,seen.raw);continue}if(name.endsWith(".tmp")||name.endsWith(".reclaim")||name.endsWith(".broken")){let info=await stat9(path15).catch(()=>{});info!==void 0&&Date.now()-info.mtimeMs>ABANDONED_TEMP_MS&&await unlinkIfPresent2(path15);continue}if(name.endsWith(".lease")){let raw=await readFile14(path15,"utf8"),record7=readLeaseRecord(raw),verdict=record7==="unparseable"?"dead":await classifyLease(record7,options.self,probes);(verdict==="dead"||verdict==="reused")&&(await reclaimInspected(path15,raw,probes)).outcome==="removed"&&(removedLeases+=1)}else if(name.endsWith(".json")){let parsed=JSON.parse(await readFile14(path15,"utf8"));if(typeof parsed!="object"||parsed===null||!("monitors"in parsed)||!("backgroundSessions"in parsed))continue;let monitors=parsed.monitors,backgroundSessions=parsed.backgroundSessions;if(!Array.isArray(monitors)||!Array.isArray(backgroundSessions))continue;monitors.length===0&&backgroundSessions.length===0&&(await unlinkIfPresent2(path15),removedManifests+=1)}}catch{}}return{examined:names.length,removedLeases,removedManifests}}import{resolve as resolve31}from"node:path";function resolveTerminalId(manager,id){return manager.resolveId?.(id)??id}function textResult2(text2,extra){return{content:[{type:"text",text:text2}],details:extra?.details,isError:extra?.isError}}function errorResult(text2){return{content:[{type:"text",text:text2}],details:void 0,isError:!0}}function noticedResult(text2,notices,extra){return{content:splitModelOnlyNotices(text2,notices),details:extra?.details,isError:extra?.isError}}var manifestWriters=new Map,pendingSpecs=new Map,MAX_PENDING_MONITOR_SPECS=32;function bindTerminalManifestWriter(sessionId,writer){manifestWriters.set(sessionId,writer);let queued=pendingSpecs.get(sessionId);pendingSpecs.delete(sessionId);for(let registration of queued??[])writer.recordRegister(registration)}function unbindTerminalManifestWriter(sessionId){manifestWriters.delete(sessionId)}function pendingDurableSpecCount(sessionId){let count=0;for(let registration of pendingSpecs.get(sessionId)??[])registration.spec.persistent&&(count+=1);return count}function manifestSessionKey(ctx){return ctx.getSessionContext?.()?.sessionManager?.getSessionId?.()}async function handMonitorSpec(sessionKey,registration){if(sessionKey===void 0)return;let writer=manifestWriters.get(sessionKey);if(writer){await writer.recordRegister(registration);return}let queue=pendingSpecs.get(sessionKey)??[];queue.push(registration),queue.length>MAX_PENDING_MONITOR_SPECS&&queue.shift(),pendingSpecs.set(sessionKey,queue)}function handFileCheckpoint(sessionKey,monitorId,registry,runtimeId){let writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey),checkpoint2=registry.fileCheckpoint(runtimeId);writer&&checkpoint2&&writer.scheduleCheckpoint(monitorId,checkpoint2)}function durableAdmissionError(ctx){let limit=ctx.maxDurableMonitors??"unlimited";if(limit==="unlimited")return;let sessionKey=manifestSessionKey(ctx);if(!(sessionKey===void 0||(manifestWriters.get(sessionKey)?.durableCount()??0)+pendingDurableSpecCount(sessionKey)<limit))return errorResult(`Cannot start another persistent monitor: this session already holds ${limit} durable monitors, the limit set by terminal.maxDurableMonitors. Stop one with kill_bash first, or raise the setting.`)}var DEFAULT_MONITOR_TIMEOUT_MS=3e5,MAX_MONITOR_TIMEOUT_MS=36e5,monitorSchema=typebox_exports.Object({action:typebox_exports.Optional(StringEnum(["create","rearm"],{description:"Defaults to create. rearm resumes a monitor paused by the wake budget."})),description:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:200,description:"Create (required): specific label shown with every event, e.g. 'errors in deploy.log'."})),command:typebox_exports.Optional(typebox_exports.String({description:"Create, command branch (XOR path): shell command to run and watch in a PTY-backed monitor session."})),path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Create, file branch (XOR command): one regular file to watch natively, whose parent directory must already exist; takes no filter."})),event:typebox_exports.Optional(StringEnum(["create","modify"],{description:"File branch only: which file event fires the watch (defaults to create)."})),filter:typebox_exports.Optional(typebox_exports.String({description:"Only PTY output lines matching this regex become monitor events."})),timeout_ms:typebox_exports.Optional(typebox_exports.Number({minimum:1,maximum:MAX_MONITOR_TIMEOUT_MS,description:"Watcher deadline in milliseconds (default 300000; ignored when persistent)."})),persistent:typebox_exports.Optional(typebox_exports.Boolean({description:"Standing watch: no deadline, and it survives a session restart (command re-run once, file rescanned and any detached change reported). Expires 7 days after creation; no per-session cap unless the terminal.maxDurableMonitors setting sets one; stop one with kill_bash."})),bash_id:typebox_exports.Optional(typebox_exports.String({description:"Rearm: paused monitor id (mon_ or bash_id) to resume; omit for all paused."}))});function isFileCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.path=="string"&&input.path.length>0}function isCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.command=="string"&&input.command.length>0}function resolveDimension(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function resolveTimeoutMs(value2){return Math.min(Math.max(Math.trunc(value2??DEFAULT_MONITOR_TIMEOUT_MS),1),MAX_MONITOR_TIMEOUT_MS)}function compileFilter2(filter){if(filter!==void 0)return new RegExp(filter)}function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0,keep="end"){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=keep==="start"?allVisualLines.slice(0,maxVisualLines):allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}var OUTPUT_PREVIEW_LINES=8,BashOutputResultComponent=class{#text="";#isPartial=!1;#expanded=!1;setResult(result3,options){this.#text=result3.content.filter(content=>content.type==="text"&&!isModelOnlyText(content)).map(content=>content.type==="text"?content.text:"").join(`
2181
+ `}var RESTORE_DIGEST_CUSTOM_TYPE="senpi-terminal:restore-digest",PREFIX="Terminal state after restart",BUCKETS=["restored","muted","lost","completed","attachedElsewhere","expired"];function isActionable(digest3){return digest3.results.some(result3=>result3.outcome==="lost"||result3.orphan!==void 0)||digest3.backgroundSessions.some(session=>session.outcome==="running")}var label2=result3=>`${result3.monitorId} "${result3.description}"`,outcomeName=outcome=>outcome.replace(/[A-Z]/g,letter=>` ${letter.toLowerCase()}`),downtimeNote=ms=>ms>0?` (offline up to ${formatElapsedSeconds(ms/1e3)})`:"";function orphanNote(orphan){return`orphan pid ${orphan.pid} ${orphan.action==="killed"?"killed":"left running"}`}function sentenceEntry(result3){let fallback=result3.outcome==="restored"||result3.outcome==="muted"?result3.kind==="file"?"rechecked":"respawned":void 0,notes=[result3.reason??fallback,result3.orphan&&orphanNote(result3.orphan)].filter(note=>note);return notes.length>0?`${label2(result3)} (${notes.join(", ")})`:label2(result3)}function backgroundEntry(session){if(session.outcome==="exited")return`${session.id} exited`;let pid=session.pid===void 0?"":`pid ${session.pid}, `;return`${session.id} "${session.command}" still running (${pid}output not captured)`}function decidedSentence(digest3){let clauses=[];for(let outcome of BUCKETS){let entries=digest3.results.filter(result3=>result3.outcome===outcome).map(sentenceEntry);entries.length>0&&clauses.push(`${outcomeName(outcome)} ${entries.length} - ${entries.join(", ")}`)}return digest3.backgroundSessions.length>0&&clauses.push(`background: ${digest3.backgroundSessions.map(backgroundEntry).join(", ")}`),`${PREFIX}${downtimeNote(digest3.downtimeMs)}: ${clauses.join("; ")||"nothing to restore"}.`}function buildRestoreDigest(digest3,meta){let outcome=meta.outcome==="decided"&&digest3.storeError?"corrupt":meta.outcome,holder=meta.holderPid===void 0?void 0:`pid ${meta.holderPid}`,content=outcome==="deferred"?holder===void 0?`${PREFIX}: waiting for the session lease; monitors come back here once it is acquired.`:`${PREFIX}: monitors held by ${holder}; they come back here when that process exits.`:outcome==="corrupt"?`${PREFIX}: the saved monitor state was unreadable, nothing was restored.`:decidedSentence(digest3);return{customType:RESTORE_DIGEST_CUSTOM_TYPE,content,display:!0,details:{generation:meta.generation,outcome,downtimeMs:digest3.downtimeMs,downtimeIsUpperBound:!0,...meta.holderPid===void 0?{}:{holder:{pid:meta.holderPid}},actionable:isActionable(digest3),monitors:digest3.results,backgroundSessions:digest3.backgroundSessions}}}function createDigestSlot(){let pendingMessage,decidedDelivered=!1,isDecided=message=>message.details.outcome!=="deferred";return{set(message){decidedDelivered||!isDecided(message)&&pendingMessage!==void 0&&isDecided(pendingMessage)||(pendingMessage=message)},pending:()=>pendingMessage,flush(deliver2){let message=pendingMessage;return message===void 0||!deliver2(message)?!1:(pendingMessage=void 0,isDecided(message)&&(decidedDelivered=!0),!0)}}}function deliverRestoreDigest(pi,ctx,message){if(ctx?.model===void 0)return!1;ctx.ui?.notify(message.content,"info");let actionable=message.details.actionable;return pi.sendMessage(message,{triggerTurn:actionable,deliverAs:actionable?"followUp":"nextTurn"}),!0}function monitorLine(result3){let reason=result3.reason===void 0?"":`: ${result3.reason}`,orphan=result3.orphan===void 0?"":` (${orphanNote(result3.orphan)})`,tone=result3.outcome==="lost"||result3.orphan!==void 0?"warning":"dim";return{text:`${label2(result3)} ${outcomeName(result3.outcome)}${reason}${orphan}`,tone}}var renderRestoreDigest=noticeMessageRenderer(message=>{let details=message.details;if(details===void 0)return;let sessions2=details.backgroundSessions,counts=`${details.monitors.length} monitors \xB7 ${sessions2.length} background sessions`,content=typeof message.content=="string"?message.content:"";return{title:`${PREFIX}${downtimeNote(details.downtimeMs)}`,tone:details.actionable?"warning":"accent",why:details.outcome==="decided"?counts:content.slice(PREFIX.length+2),extra:[...details.monitors.map(monitorLine),...sessions2.map(session=>({text:backgroundEntry(session),tone:"dim"}))]}});function registerRestoreDigestRenderer(pi){pi.registerMessageRenderer(RESTORE_DIGEST_CUSTOM_TYPE,renderRestoreDigest)}import{existsSync as existsSync28}from"node:fs";import{stat as stat6}from"node:fs/promises";import{isAbsolute as isAbsolute18}from"node:path";import{execFile as execFile3}from"node:child_process";import{readFile as readFile13}from"node:fs/promises";var OWNER_START_TOLERANCE_MS=2e3,DEFAULT_KILL_GRACE_MS=1e3,LSTART_LENGTH=24;function errorCode3(error2){return typeof error2=="object"&&error2!==null&&"code"in error2?error2.code:void 0}function isProcessAlive2(pid){try{return process.kill(pid,0),!0}catch(error2){return errorCode3(error2)!=="ESRCH"}}function execText(command,args){return new Promise((resolve46,reject)=>{let env={...process.env,LC_ALL:"C"};execFile3(command,[...args],{encoding:"utf8",timeout:5e3,windowsHide:!0,env},(error2,stdout)=>{error2?reject(error2):resolve46(stdout)})})}async function readLinuxEvidence(pid){let[startedAtMs,environ,cmdline]=await Promise.all([readProcessStartMs(pid),readFile13(`/proc/${pid}/environ`,"utf8"),readFile13(`/proc/${pid}/cmdline`,"utf8")]);return{startedAtMs,environ,argv:cmdline.split("\0").filter(Boolean).join(" ")}}async function readDarwinEvidence(pid){let text2=(await execText("ps",["-o","lstart=,command=","-p",String(pid)])).trim();if(!(text2.length<=LSTART_LENGTH))return{startedAtMs:new Date(text2.slice(0,LSTART_LENGTH)).getTime(),argv:text2.slice(LSTART_LENGTH).trim()}}async function readWindowsEvidence(pid){let script=`Get-CimInstance Win32_Process -Filter "ProcessId=${pid}" | ForEach-Object { $_.CreationDate.ToUniversalTime().ToString('o') + '|' + $_.CommandLine }`,text2=(await execText("powershell",["-NoProfile","-NonInteractive","-Command",script])).trim(),separator=text2.indexOf("|");if(!(separator<0))return{startedAtMs:new Date(text2.slice(0,separator)).getTime(),argv:text2.slice(separator+1).trim()}}function defaultEvidenceReader(platform5){return platform5==="linux"?readLinuxEvidence:platform5==="darwin"?readDarwinEvidence:platform5==="win32"?readWindowsEvidence:async()=>{}}function argvMatches(observed,argv){if(observed===void 0||argv.length===0)return!1;let command=argv[argv.length-1]??"";return observed.trim()===argv.join(" ")||command.length>0&&observed.includes(command)}async function confirmOwner(runtime,monitorId,probes={}){let platform5=probes.platform??process.platform;try{if(!sameBoot(runtime.bootAtMs,(probes.bootAtMs??processBootAtMs)())||!(probes.isProcessAlive??isProcessAlive2)(runtime.pid))return"dead";let evidence=await(probes.readProcessEvidence??defaultEvidenceReader(platform5))(runtime.pid);return evidence?.startedAtMs===void 0||!Number.isFinite(evidence.startedAtMs)||Math.abs(evidence.startedAtMs-runtime.startedAtMs)>OWNER_START_TOLERANCE_MS?"unverifiable":(platform5==="linux"&&monitorId!==void 0?(evidence.environ??"").split("\0").includes(`SENPI_MONITOR_ID=${monitorId}`):argvMatches(evidence.argv,runtime.argv))?"confirmed":"unverifiable"}catch{return"unverifiable"}}async function killTree(runtime,options={}){let kill=options.kill??((pid,signal)=>process.kill(pid,signal)),wait=options.wait??(ms=>new Promise(resolve46=>setTimeout(resolve46,ms))),target=runtime.processGroupId!==void 0?-runtime.processGroupId:runtime.pid;try{kill(target,"SIGTERM")}catch(error2){if(errorCode3(error2)==="ESRCH")return{action:"already-dead"};throw error2}if(await wait(options.graceMs??DEFAULT_KILL_GRACE_MS),(options.isProcessAlive??isProcessAlive2)(runtime.pid))try{kill(target,"SIGKILL")}catch(error2){if(errorCode3(error2)!=="ESRCH")throw error2}return{action:"killed"}}async function reapBeforeRespawn(runtime,monitorId,probes={}){let verdict=await confirmOwner(runtime,monitorId,probes);return verdict==="dead"?{action:"none"}:verdict==="confirmed"&&(probes.platform??process.platform)!=="win32"?killTree(runtime,probes):{action:"none",reason:`previous watcher pid ${runtime.pid} unverifiable`}}import{open as open5}from"node:fs/promises";var TAIL_BYTES=256*1024;async function sessionActivityBeforeMs(sessionFile,beforeMs){if(sessionFile===void 0)return;let text2;try{let handle=await open5(sessionFile,"r");try{let{size}=await handle.stat(),length=Math.min(size,TAIL_BYTES),buffer=Buffer.alloc(length);await handle.read(buffer,0,length,size-length),text2=buffer.toString("utf8")}finally{await handle.close()}}catch(error2){if(typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT")return;throw error2}let newest;for(let match of text2.matchAll(/"timestamp":"([^"]+)"/g)){let stamp=Date.parse(match[1]??"");!Number.isFinite(stamp)||stamp>=beforeMs||(newest===void 0||stamp>newest)&&(newest=stamp)}return newest}var TERMINAL_MANIFEST_VERSION=1,TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS=3e4;var InvalidTerminalManifestError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidTerminalManifestError"}},RUNTIME_KINDS=["command","file"],DURABILITY_CLASSES=["ephemeral","restartable-command","checkpointed-file"],FILE_EVENTS=["create","modify"],isStr=value2=>typeof value2=="string"&&value2.length>0,isNum=value2=>typeof value2=="number"&&Number.isFinite(value2),isBool=value2=>typeof value2=="boolean",isObj=value2=>typeof value2=="object"&&value2!==null&&!Array.isArray(value2);function invalid(message){throw new InvalidTerminalManifestError(`terminal manifest is invalid: ${message}`)}function str(raw,field2){return isStr(raw[field2])||invalid(`field ${field2} must be a non-empty string`),raw[field2]}function num(raw,field2){return isNum(raw[field2])||invalid(`field ${field2} must be a finite number`),raw[field2]}function digest2(raw,field2){return typeof raw[field2]!="string"&&invalid(`field ${field2} must be a string`),raw[field2]}function bool(raw,field2){return isBool(raw[field2])||invalid(`field ${field2} must be a boolean`),raw[field2]}function opt(raw,field2,required){return raw[field2]===void 0?void 0:required(raw,field2)}function oneOf(values,raw,field2){let value2=raw[field2];return(typeof value2!="string"||!values.includes(value2))&&invalid(`field ${field2} must be one of: ${values.join(", ")}`),value2}function checkpoint(raw){return isObj(raw)||invalid("field lastCheckpoint must be an object"),{dev:num(raw,"dev"),ino:num(raw,"ino"),size:num(raw,"size"),mtimeMs:num(raw,"mtimeMs"),digest:digest2(raw,"digest"),present:bool(raw,"present")}}function fireWindow(raw){return isObj(raw)||invalid("field fireWindow must be an object"),{startMs:num(raw,"startMs"),count:num(raw,"count")}}function runtimeIdentity(raw,field2){let value2=raw[field2];isObj(value2)||invalid(`field ${field2} must be an object`);let argv=value2.argv;(!Array.isArray(argv)||!argv.every(isStr))&&invalid(`field ${field2}.argv must be an array of strings`);let pid=value2.pid;isNum(pid)||invalid(`field ${field2}.pid must be a finite number`);let groupId=value2.processGroupId;return groupId!==void 0&&!isNum(groupId)&&invalid(`field ${field2}.processGroupId must be a finite number`),{pid,...groupId!==void 0?{processGroupId:groupId}:{},startedAtMs:num(value2,"startedAtMs"),bootAtMs:num(value2,"bootAtMs"),argv}}function parseMonitor(entry){return isObj(entry)||invalid("a monitor entry must be an object"),{monitorId:str(entry,"monitorId"),sessionId:str(entry,"sessionId"),description:str(entry,"description"),runtimeKind:oneOf(RUNTIME_KINDS,entry,"runtimeKind"),durabilityClass:oneOf(DURABILITY_CLASSES,entry,"durabilityClass"),command:opt(entry,"command",str),path:opt(entry,"path",str),event:opt(entry,"event",(raw,field2)=>oneOf(FILE_EVENTS,raw,field2)),filter:opt(entry,"filter",str),cwd:opt(entry,"cwd",str),approvedParent:opt(entry,"approvedParent",str),createdAt:num(entry,"createdAt"),expiresAt:entry.expiresAt===void 0||entry.expiresAt===null?null:num(entry,"expiresAt"),persistent:bool(entry,"persistent"),suspended:bool(entry,"suspended"),lastCheckpoint:entry.lastCheckpoint===null?null:checkpoint(entry.lastCheckpoint),deliveryPaused:bool(entry,"deliveryPaused"),fireWindow:fireWindow(entry.fireWindow),...entry.runtime===void 0?{}:{runtime:runtimeIdentity(entry,"runtime")},...entry.deadlineMs===void 0?{}:{deadlineMs:num(entry,"deadlineMs")}}}function parseBackgroundSession(entry){return isObj(entry)||invalid("a background session entry must be an object"),{id:str(entry,"id"),command:str(entry,"command"),startedAtMs:num(entry,"startedAtMs"),...entry.runtime===void 0?{}:{runtime:runtimeIdentity(entry,"runtime")}}}function parseTerminalManifest(raw,ref){return isObj(raw)||invalid("the payload must be an object"),Array.isArray(raw.monitors)||invalid("field monitors must be an array"),Array.isArray(raw.backgroundSessions)||invalid("field backgroundSessions must be an array"),{version:TERMINAL_MANIFEST_VERSION,sessionId:ref.sessionId,monitors:raw.monitors.map(parseMonitor),backgroundSessions:raw.backgroundSessions.map(parseBackgroundSession),updatedAt:num(raw,"updatedAt")}}function reapplyPersistedMute(registry,monitor,runtimeId){return monitor.deliveryPaused?(registry.pause([runtimeId]),"muted"):"restored"}var stubRestoreHandlers={"restartable-command":()=>({outcome:"lost",reason:"no restore handler"}),"checkpointed-file":()=>({outcome:"lost",reason:"no restore handler"})};function emptyDigest(){return{restored:0,lost:0,expired:0,muted:0,completed:0,attachedElsewhere:0,storeError:!1,results:[],backgroundSessions:[],downtimeMs:0}}async function defaultBackgroundAlive(session){return session.runtime===void 0?!1:await confirmOwner(session.runtime,void 0)==="confirmed"}function resultFor(monitor,outcome,handled){return{monitorId:monitor.monitorId,description:monitor.description,kind:monitor.runtimeKind,outcome,...monitor.command!==void 0?{command:monitor.command}:{},...monitor.path!==void 0?{path:monitor.path}:{},...handled?.reason!==void 0?{reason:handled.reason}:{},...handled?.orphan!==void 0?{orphan:handled.orphan}:{}}}async function restoreTerminalState(options){let state;try{state=await options.manifest.read()}catch{return{...emptyDigest(),storeError:!0}}if(state===null)return emptyDigest();let now2=(options.now??Date.now)(),lastSeen=Math.max(state.updatedAt,await sessionActivityBeforeMs(options.sessionFile,options.processStartedAtMs??now2)??0),downtimeMs=Math.max(0,now2-lastSeen),handlers={...stubRestoreHandlers,...options.handlers},results=await Promise.all(state.monitors.map(async monitor=>{if(monitor.expiresAt!==null&&monitor.expiresAt<=now2)return resultFor(monitor,"expired");if(monitor.durabilityClass==="ephemeral"){if(monitor.deadlineMs===void 0||monitor.deadlineMs<=now2)return resultFor(monitor,"lost",{outcome:"lost",reason:"deadline passed while detached"});let handled2=await(monitor.runtimeKind==="file"?handlers["checkpointed-file"]:handlers["restartable-command"])(monitor,{downtimeMs,remainingMs:monitor.deadlineMs-now2});return resultFor(monitor,handled2.outcome,handled2)}let handled=await handlers[monitor.durabilityClass](monitor,{downtimeMs});return resultFor(monitor,handled.outcome,handled)})),isAlive2=options.isBackgroundAlive??defaultBackgroundAlive,backgroundSessions=await Promise.all(state.backgroundSessions.map(async session=>session.runtime!==void 0&&await isAlive2(session)?{id:session.id,command:session.command,outcome:"running",pid:session.runtime.pid}:{id:session.id,command:session.command,outcome:"exited"})),digest3={...emptyDigest(),results,backgroundSessions,downtimeMs};for(let result3 of results)digest3[result3.outcome]+=1;return digest3.lost+=backgroundSessions.length,digest3}var MAX_REASON_OUTPUT_CHARS=200,lost=(reason,orphan)=>({outcome:"lost",reason,...orphan!==void 0?{orphan}:{}});async function defaultDirectoryExists(path15){try{return(await stat6(path15)).isDirectory()}catch{return!1}}function compileFilter(source2){if(source2!==void 0)try{return new RegExp(source2)}catch{return}}function dimension(value2,fallback){return value2!==void 0&&Number.isFinite(value2)&&value2>=1?Math.trunc(value2):fallback}function exitsWithin(runtime,ms){return runtime.exited?Promise.resolve(!0):new Promise(resolve46=>{let timer=setTimeout(()=>{unsubscribe(),resolve46(!1)},ms),unsubscribe=runtime.session.onExit(()=>{clearTimeout(timer),resolve46(!0)})})}function firstOutputLine(runtime){return(sanitizeTerminalOutput(runtime.fullOutput()).split(`
2182
+ `).map(text2=>text2.trim()).find(text2=>text2.length>0)??"").slice(0,MAX_REASON_OUTPUT_CHARS)}function orphanOf(runtime,reap){if(!(runtime===void 0||reap===void 0)){if(reap.action==="killed")return{pid:runtime.pid,action:"killed"};if(reap.reason!==void 0)return{pid:runtime.pid,action:"unverified"}}}async function restoreEnvironment(deps,monitor,context){let env={[MONITOR_ENV_ID]:monitor.monitorId,[MONITOR_ENV_RESTORED]:"1",[MONITOR_ENV_DOWNTIME_MS]:String(context.downtimeMs)},terminalDir=terminalStateDir(deps.ctx.getSessionContext?.());return monitor.persistent&&terminalDir!==void 0&&(env[MONITOR_ENV_STATE_DIR]=await ensureMonitorStateDir(terminalDir,monitor.monitorId)),env}function createRestartableCommandHandler(deps){let spawn13=deps.spawn??spawnCommandSession,directoryExists=deps.directoryExists??defaultDirectoryExists,reapOrphan=deps.reapOrphan??reapBeforeRespawn,graceMs=deps.graceMs??RESTORE_GRACE_MS;return async(monitor,context)=>{let ephemeralTimeLeft=monitor.persistent?void 0:context.remainingMs;if(monitor.runtimeKind!=="command"||!monitor.persistent&&ephemeralTimeLeft===void 0)return lost("not a restorable command watch");let{command,cwd}=monitor;if(command===void 0||command.length===0)return lost("no command was recorded");if(cwd===void 0||!isAbsolute18(cwd))return lost("no absolute cwd was recorded");if(!await directoryExists(cwd))return lost(`cwd no longer exists: ${cwd}`);let reap=monitor.runtime===void 0?void 0:await reapOrphan(monitor.runtime,monitor.monitorId),orphan=orphanOf(monitor.runtime,reap),spawned;try{spawned=await spawn13(deps.ctx,{command,cols:dimension(deps.ctx.defaultCols,DEFAULT_COLS),rows:dimension(deps.ctx.defaultRows,DEFAULT_ROWS),cwd,envOverrides:await restoreEnvironment(deps,monitor,context),...ephemeralTimeLeft!==void 0?{timeoutMs:ephemeralTimeLeft}:{}})}catch(error2){return lost(`spawn failed: ${error2 instanceof Error?error2.message:String(error2)}`,orphan)}deps.registry.register({id:spawned.id,monitorId:monitor.monitorId,description:monitor.description,command,persistent:monitor.persistent,deadlineMs:ephemeralTimeLeft!==void 0?Date.now()+ephemeralTimeLeft:null,runtime:spawned.runtime,filter:compileFilter(monitor.filter),...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}}),deps.ctx.manager.bindMonitorId(monitor.monitorId,spawned.id);let startedAt=Date.now();if(await exitsWithin(spawned.runtime,graceMs)){let code=spawned.runtime.exitResult?.exitCode??null;if(code===0)return{outcome:"completed",...orphan!==void 0?{orphan}:{}};let output=firstOutputLine(spawned.runtime),exit=code===null?"exited":`exited ${code}`;return lost(`${exit} in ${Date.now()-startedAt}ms${output.length>0?`: ${output}`:""}`,orphan)}deps.registry.emitLine(spawned.id,`restored after up to ${formatElapsedSeconds(context.downtimeMs/1e3)} offline; the command started fresh`),deps.onRestored?.(monitor.monitorId,spawned.id);let outcome=reapplyPersistedMute(deps.registry,monitor,spawned.id),runtime=spawned.runtime.identity();return{outcome,...orphan!==void 0?{orphan}:{},...runtime!==void 0?{runtime}:{}}}}import{stat as stat7}from"node:fs/promises";import{resolve as resolve30}from"node:path";function classifyDetachedChange(saved,live){return saved.present?live.present?live.dev!==saved.dev||live.ino!==saved.ino?"replaced":live.mtimeMs!==saved.mtimeMs||live.size!==saved.size||live.digest!==saved.digest?"modified":null:"gone":live.present?"created":null}function lost2(reason){return{outcome:"lost",reason}}function remainingMs(monitor,now2){return monitor.expiresAt===null?DEFAULT_RESTORED_WATCH_MS:Math.max(1,monitor.expiresAt-now2)}var DEFAULT_RESTORED_WATCH_MS=3e5;function createCheckpointedFileRestoreHandler(deps){let now2=deps.now??Date.now;return async(monitor,context)=>{if(monitor.runtimeKind!=="file"||monitor.path===void 0||monitor.cwd===void 0)return lost2(`monitor ${monitor.monitorId} is not a restorable file watch`);let ephemeral=monitor.durabilityClass==="ephemeral";if(ephemeral&&context.remainingMs===void 0)return lost2(`monitor ${monitor.monitorId} has no time left on its deadline`);let saved=monitor.lastCheckpoint;if(saved===null)return lost2(`monitor ${monitor.monitorId} has no checkpoint to compare against`);if(saved.present)try{if(!(await stat7(resolve30(monitor.cwd,monitor.path))).isFile())return lost2(`watched path is no longer a regular file: ${monitor.path}`)}catch(error2){return lost2(`watched path is gone: ${monitor.path} (${error2 instanceof Error?error2.message:error2})`)}let runtimeId;try{let startedAt=now2(),lifetime=ephemeral&&context.remainingMs!==void 0?{persistent:!1,deadlineMs:startedAt+context.remainingMs,timeoutMs:context.remainingMs}:{persistent:!0,deadlineMs:null,timeoutMs:remainingMs(monitor,startedAt)};runtimeId=(await deps.registry.registerFile({description:monitor.description,path:monitor.path,monitorId:monitor.monitorId,...lifetime,event:monitor.event??"create",cwd:monitor.cwd,...monitor.approvedParent!==void 0?{approvedParent:monitor.approvedParent}:{},...monitor.expiresAt!==null?{expiresAt:monitor.expiresAt}:{}})).id}catch(error2){return lost2(`cannot re-watch ${monitor.path}: ${error2 instanceof Error?error2.message:String(error2)}`)}let live=deps.registry.fileCheckpoint(runtimeId);if(live===void 0)return lost2(`monitor ${monitor.monitorId} settled before its checkpoint was compared`);let change=classifyDetachedChange(saved,live);return change==="gone"?(await deps.registry.stopFile(runtimeId),lost2(`watched path is gone: ${monitor.path}`)):(deps.bindMonitorId?.(monitor.monitorId,runtimeId),change!==null&&deps.registry.emitFileLine(runtimeId,`changed while detached: ${change} ${monitor.path}`),deps.writer?.scheduleCheckpoint(monitor.monitorId,live),{outcome:"restored"})}}import{stat as stat8}from"node:fs/promises";import{join as join55}from"node:path";var LEASE_KEEPER_INTERVAL_MS=1e4;function isAlive(pid,probe){try{return probe?probe(pid):(process.kill(pid,0),!0)}catch(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="EPERM"}}async function leaseFileExists(path15){try{return await stat8(path15),!0}catch{return!1}}function createLeaseKeeper(options){let intervalMs=options.intervalMs??LEASE_KEEPER_INTERVAL_MS,path15=join55(options.dir,`${options.encodedSessionId}.lease`),state="idle",holder=null,timer,inFlight=Promise.resolve(),arm=()=>{timer=setTimeout(()=>{timer=void 0,inFlight=tick().catch(error2=>{state==="waiting"&&arm(),options.onError?.(error2)})},intervalMs),timer.unref()},tryAcquire=async()=>{let result3=await acquireTerminalLease({dir:options.dir,encodedSessionId:options.encodedSessionId,now:options.now,self:options.self,isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs});if(state!=="waiting"){result3.acquired&&await releaseTerminalLease(result3);return}if(result3.acquired){state="owner",timer=void 0,await options.onTakeover(result3);return}holder=result3.holder,arm()},tick=async()=>{if(state!=="waiting")return;keeper.onTick?.();let current=holder,gone=current===null||!await leaseFileExists(path15)||!isAlive(current.pid,options.isProcessAlive);if(state==="waiting"){if(gone){await tryAcquire();return}arm()}},keeper={get state(){return state},start(initialHolder){state==="stopped"||state==="owner"||(holder=initialHolder,state="waiting",timer===void 0&&arm())},stop(){timer!==void 0&&clearTimeout(timer),timer=void 0,state!=="owner"&&(state="stopped")},settled:()=>inFlight};return keeper}import{unlink as unlink2}from"node:fs/promises";import{join as join56}from"node:path";function createTerminalManifestStore(session){return createSidecarStore({baseDir:join56(session.getSessionDir(),"extensions","terminal"),sessionId:session.getSessionId(),version:TERMINAL_MANIFEST_VERSION,tempPrefix:"terminal",parse:parseTerminalManifest})}var TerminalManifestWriter=class{#sessionId;#debounceMs;#now;#entries=new Map;#backgrounds=new Map;#pending=new Map;#timer;#tail=Promise.resolve();constructor(options){this.store=createTerminalManifestStore(options.session),this.#sessionId=options.session.getSessionId(),this.#debounceMs=options.debounceMs??TERMINAL_MANIFEST_CHECKPOINT_DEBOUNCE_MS,this.#now=options.now??Date.now}recordRegister(registration){return this.#entries.set(registration.monitorId,this.#entryFor(registration)),this.#persist()}adoptRestored(entry){this.#entries.set(entry.monitorId,{...entry,suspended:!1})}persistRestored(){return this.#persist()}async seedFromDisk(){let state;try{state=await this.store.read()}catch{return}if(state!==null){for(let entry of state.monitors)entry.suspended||this.#entries.set(entry.monitorId,entry);for(let background of state.backgroundSessions)this.#backgrounds.set(background.id,background)}}durableCount(){let count=0;for(let entry of this.#entries.values())entry.durabilityClass!=="ephemeral"&&(count+=1);return count}observeMonitorState(snapshot){let live=new Map;for(let entry of snapshot){if(typeof entry.monitorId!="string"||entry.monitorId.length===0)throw new Error(`terminal manifest writer saw a monitor snapshot entry without a stable monitorId (runtime id ${entry.id}); surfacing instead of silently skipping it`);live.set(entry.monitorId,{paused:entry.paused,fireWindow:entry.fireWindow})}let changed=!1;for(let[monitorId,known]of this.#entries){let current=live.get(monitorId);if(current===void 0){if(known.suspended)continue;this.#entries.delete(monitorId),changed=!0;continue}let fireWindow2=current.fireWindow??known.fireWindow;(known.deliveryPaused!==current.paused||known.fireWindow.count!==fireWindow2.count)&&(this.#entries.set(monitorId,{...known,deliveryPaused:current.paused,fireWindow:fireWindow2}),changed=!0)}return changed?this.#persist():Promise.resolve()}scheduleCheckpoint(monitorId,checkpoint2){this.#pending.set(monitorId,checkpoint2),this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=setTimeout(()=>{this.#timer=void 0,this.#absorbPending(),this.#persist()},this.#debounceMs)}async flush(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#pending.size===0?await this.#tail:(this.#absorbPending(),await this.#persist())}async recordShutdown(){this.#timer!==void 0&&(clearTimeout(this.#timer),this.#timer=void 0),this.#absorbPending();for(let[monitorId,entry]of this.#entries)this.#entries.set(monitorId,{...entry,suspended:!0});await this.#persist()}recordBackgroundStart(id,command,startedAtMs,runtime){return this.#backgrounds.set(id,{id,command,startedAtMs:startedAtMs??this.#now(),...runtime===void 0?{}:{runtime}}),this.#persist()}recordBackgroundExit(id){return this.#backgrounds.delete(id)?this.#persist():Promise.resolve()}#absorbPending(){for(let[monitorId,checkpoint2]of this.#pending){let entry=this.#entries.get(monitorId);entry&&this.#entries.set(monitorId,{...entry,lastCheckpoint:checkpoint2})}this.#pending.clear()}#entryFor({monitorId,spec:spec2,runtime,deadlineMs}){let createdAt=this.#now(),persistent=spec2.persistent===!0;return{monitorId,sessionId:this.#sessionId,description:spec2.description,runtimeKind:spec2.kind,durabilityClass:persistent?spec2.kind==="file"?"checkpointed-file":"restartable-command":"ephemeral",command:spec2.kind==="command"?spec2.command:void 0,path:spec2.kind==="file"?spec2.path:void 0,event:spec2.kind==="file"?spec2.event:void 0,filter:spec2.kind==="command"?spec2.filter:void 0,cwd:spec2.cwd,approvedParent:spec2.kind==="file"?spec2.approvedParent:void 0,createdAt,expiresAt:persistent?createdAt+DURABLE_MONITOR_EXPIRY_MS:null,persistent,suspended:!1,lastCheckpoint:null,deliveryPaused:!1,fireWindow:{startMs:createdAt,count:0},...runtime===void 0?{}:{runtime},...deadlineMs===void 0||persistent?{}:{deadlineMs}}}async#removeFile(){try{await unlink2(this.store.filePath)}catch(error2){if(!(typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"))throw error2}this.store.clear()}#persist(){let run2=this.#tail.then(()=>this.#entries.size===0&&this.#backgrounds.size===0?this.#removeFile():this.store.write({version:TERMINAL_MANIFEST_VERSION,sessionId:this.#sessionId,monitors:[...this.#entries.values()],backgroundSessions:[...this.#backgrounds.values()],updatedAt:this.#now()}));return this.#tail=run2.then(()=>{},error2=>{this.persistFailure=error2}),this.#tail}};import{readdir as defaultReaddir,readFile as readFile14,stat as stat9,unlink as unlink3}from"node:fs/promises";import{join as join57}from"node:path";function isEnoent(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}async function unlinkIfPresent2(path15){try{await unlink3(path15)}catch(error2){if(!isEnoent(error2))throw error2}}var ABANDONED_TEMP_MS=3e4;async function sweepTerminalStateDir(dir,options){let names=(options.readdir?await options.readdir(dir):await defaultReaddir(dir)).slice(0,options.limit??500),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},removedLeases=0,removedManifests=0;for(let name of names){if(options.keep.has(name))continue;let path15=join57(dir,name);try{if(name.endsWith(".lock")){let seen=await reclaimLockState(path15,probes);seen.state==="stale"&&await breakStaleLock(path15,seen.raw);continue}if(name.endsWith(".tmp")||name.endsWith(".reclaim")||name.endsWith(".broken")){let info=await stat9(path15).catch(()=>{});info!==void 0&&Date.now()-info.mtimeMs>ABANDONED_TEMP_MS&&await unlinkIfPresent2(path15);continue}if(name.endsWith(".lease")){let raw=await readFile14(path15,"utf8"),record7=readLeaseRecord(raw),verdict=record7==="unparseable"?"dead":await classifyLease(record7,options.self,probes);(verdict==="dead"||verdict==="reused")&&(await reclaimInspected(path15,raw,probes)).outcome==="removed"&&(removedLeases+=1)}else if(name.endsWith(".json")){let parsed=JSON.parse(await readFile14(path15,"utf8"));if(typeof parsed!="object"||parsed===null||!("monitors"in parsed)||!("backgroundSessions"in parsed))continue;let monitors=parsed.monitors,backgroundSessions=parsed.backgroundSessions;if(!Array.isArray(monitors)||!Array.isArray(backgroundSessions))continue;monitors.length===0&&backgroundSessions.length===0&&(await unlinkIfPresent2(path15),removedManifests+=1)}}catch{}}return{examined:names.length,removedLeases,removedManifests}}import{resolve as resolve31}from"node:path";function resolveTerminalId(manager,id){return manager.resolveId?.(id)??id}function textResult2(text2,extra){return{content:[{type:"text",text:text2}],details:extra?.details,isError:extra?.isError}}function errorResult(text2){return{content:[{type:"text",text:text2}],details:void 0,isError:!0}}function noticedResult(text2,notices,extra){return{content:splitModelOnlyNotices(text2,notices),details:extra?.details,isError:extra?.isError}}var manifestWriters=new Map,pendingSpecs=new Map,MAX_PENDING_MONITOR_SPECS=32;function bindTerminalManifestWriter(sessionId,writer){manifestWriters.set(sessionId,writer);let queued=pendingSpecs.get(sessionId);pendingSpecs.delete(sessionId);for(let registration of queued??[])writer.recordRegister(registration)}function unbindTerminalManifestWriter(sessionId){manifestWriters.delete(sessionId)}function pendingDurableSpecCount(sessionId){let count=0;for(let registration of pendingSpecs.get(sessionId)??[])registration.spec.persistent&&(count+=1);return count}function manifestSessionKey(ctx){return ctx.getSessionContext?.()?.sessionManager?.getSessionId?.()}async function handMonitorSpec(sessionKey,registration){if(sessionKey===void 0)return;let writer=manifestWriters.get(sessionKey);if(writer){await writer.recordRegister(registration);return}let queue=pendingSpecs.get(sessionKey)??[];queue.push(registration),queue.length>MAX_PENDING_MONITOR_SPECS&&queue.shift(),pendingSpecs.set(sessionKey,queue)}function handFileCheckpoint(sessionKey,monitorId,registry,runtimeId){let writer=sessionKey===void 0?void 0:manifestWriters.get(sessionKey),checkpoint2=registry.fileCheckpoint(runtimeId);writer&&checkpoint2&&writer.scheduleCheckpoint(monitorId,checkpoint2)}function durableAdmissionError(ctx){let limit=ctx.maxDurableMonitors??"unlimited";if(limit==="unlimited")return;let sessionKey=manifestSessionKey(ctx);if(!(sessionKey===void 0||(manifestWriters.get(sessionKey)?.durableCount()??0)+pendingDurableSpecCount(sessionKey)<limit))return errorResult(`Cannot start another persistent monitor: this session already holds ${limit} durable monitors, the limit set by terminal.maxDurableMonitors. Stop one with kill_bash first, or raise the setting.`)}var DEFAULT_MONITOR_TIMEOUT_MS=3e5,MAX_MONITOR_TIMEOUT_MS=36e5,monitorSchema=typebox_exports.Object({action:typebox_exports.Optional(StringEnum(["create","rearm"],{description:"Defaults to create. rearm resumes a monitor paused by the wake budget."})),description:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:200,description:"Create (required): specific label shown with every event, e.g. 'errors in deploy.log'."})),command:typebox_exports.Optional(typebox_exports.String({description:"Create, command branch (XOR path): shell command to run and watch in a PTY-backed monitor session."})),path:typebox_exports.Optional(typebox_exports.String({minLength:1,description:"Create, file branch (XOR command): one regular file to watch natively, whose parent directory must already exist; takes no filter."})),event:typebox_exports.Optional(StringEnum(["create","modify"],{description:"File branch only: which file event fires the watch (defaults to create)."})),filter:typebox_exports.Optional(typebox_exports.String({description:"Only PTY output lines matching this regex become monitor events."})),timeout_ms:typebox_exports.Optional(typebox_exports.Number({minimum:1,maximum:MAX_MONITOR_TIMEOUT_MS,description:"Watcher deadline in milliseconds (default 300000; ignored when persistent)."})),persistent:typebox_exports.Optional(typebox_exports.Boolean({description:"Standing watch: no deadline, and it survives a session restart (command re-run once, file rescanned and any detached change reported). Expires 7 days after creation; no per-session cap unless the terminal.maxDurableMonitors setting sets one; stop one with kill_bash."})),bash_id:typebox_exports.Optional(typebox_exports.String({description:"Rearm: paused monitor id (mon_ or bash_id) to resume; omit for all paused."}))});function isFileCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.path=="string"&&input.path.length>0}function isCreateInput(input){return typeof input.description=="string"&&input.description.length>0&&typeof input.command=="string"&&input.command.length>0}function resolveDimension(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function resolveTimeoutMs(value2){return Math.min(Math.max(Math.trunc(value2??DEFAULT_MONITOR_TIMEOUT_MS),1),MAX_MONITOR_TIMEOUT_MS)}function compileFilter2(filter){if(filter!==void 0)return new RegExp(filter)}function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0,keep="end"){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=keep==="start"?allVisualLines.slice(0,maxVisualLines):allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}var OUTPUT_PREVIEW_LINES=8,BashOutputResultComponent=class{#text="";#isPartial=!1;#expanded=!1;setResult(result3,options){this.#text=result3.content.filter(content=>content.type==="text"&&!isModelOnlyText(content)).map(content=>content.type==="text"?content.text:"").join(`
2183
2183
  `),this.#isPartial=options.isPartial,this.#expanded=options.expanded}render(width){return!this.#isPartial||this.#expanded?this.#text.split(`
2184
2184
  `):truncateToVisualLines(this.#text,OUTPUT_PREVIEW_LINES,Math.max(1,width)).visualLines.map(line=>line.trimEnd())}invalidate(){}};function renderBashOutputCall(args,theme2){return new Text(theme2.fg("toolTitle",theme2.bold(`bash_output ${args.bash_id}`)),0,0)}function renderMonitorCall(args,theme2){let label3=args.action==="rearm"?`monitor rearm ${args.bash_id??""}`.trimEnd():`monitor ${args.description??args.command??""}`.trimEnd();return new Text(theme2.fg("toolTitle",theme2.bold(label3)),0,0)}function renderBashOutputResult(result3,options,_theme,context){let component=context.lastComponent??new BashOutputResultComponent;return component.setResult(result3,options),component}async function createMonitor(ctx,registry,input,execCtx){let filter;try{filter=compileFilter2(input.filter)}catch{return errorResult(`Invalid monitor filter regex: ${input.filter}`)}let cwd=resolve31(execCtx?.cwd??ctx.cwd),timeoutMs=input.persistent?void 0:resolveTimeoutMs(input.timeout_ms),deadlineMs=timeoutMs===void 0?null:Date.now()+timeoutMs,monitorId=allocateMonitorId(),terminalDir=terminalStateDir(ctx.getSessionContext?.()),envOverrides={[MONITOR_ENV_ID]:monitorId};input.persistent===!0&&terminalDir!==void 0&&(envOverrides[MONITOR_ENV_STATE_DIR]=await ensureMonitorStateDir(terminalDir,monitorId));let{id,runtime}=await spawnCommandSession(ctx,{command:input.command,cols:resolveDimension(void 0,ctx.defaultCols||DEFAULT_COLS),rows:resolveDimension(void 0,ctx.defaultRows||DEFAULT_ROWS),cwd,envOverrides,...timeoutMs===void 0?{}:{timeoutMs}});ctx.onMonitorRearmed?.(id),registry.register({monitorId,id,description:input.description,runtime,filter,command:input.command,persistent:input.persistent===!0,deadlineMs,durabilityClass:input.persistent===!0?"restartable-command":"ephemeral",...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}}),ctx.manager.bindMonitorId(monitorId,id);let identity=runtime.identity();return await handMonitorSpec(manifestSessionKey(ctx),{monitorId,spec:{kind:"command",description:input.description,command:input.command,filter:input.filter,cwd,persistent:input.persistent===!0},...identity===void 0?{}:{runtime:identity},...deadlineMs===null?{}:{deadlineMs}}),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}function createMonitorTool(ctx){let fallbackRegistry,getRegistry=()=>{let sessionRegistry2=ctx.monitorRegistry;return sessionRegistry2||(fallbackRegistry??=new MonitorRegistry(event=>ctx.onMonitorEvent?.(event)),fallbackRegistry)};return{name:TERMINAL_MONITOR_TOOL,label:"monitor",description:"Subscribe to a change instead of polling. Pass command XOR path, never both: command watches a PTY session, injecting matching newline-terminated output lines (stderr merged) plus an exit summary; path natively watches one file and fires once, where create (the default) fires only when the file appears after registration, so use event modify for an existing file, and filter is rejected. Returns a bash_id immediately; peek with bash_output, stop with kill_bash.",promptSnippet:"Subscribe to a command's output or a file's create/modify event as injected events instead of polling",promptGuidelines:["Waiting on observable state (CI checks, builds, log patterns, deploys, a file landing) means a monitor, never a foreground sleep/poll loop.",'Waiting for one file to appear or change is the path branch: `monitor({ description, path, event? })` beats wrapping `test -f` in a shell poll loop; a file that already exists needs `event: "modify"`, since `create` only fires on appearance, and registration needs the parent directory to exist already \u2014 when the run creates that directory too, use the `command` branch instead.',"Shape the command for the events you need: one-shot gate = `until <cond>; do sleep 1; done; printf 'READY\\n'` with filter ^READY$; stream = `tail -n 0 -F <log> | grep --line-buffered <pat>` with persistent: true, then kill_bash.",'Persistent command watches are re-run after a restart with `SENPI_MONITOR_RESTORED=1`; keep any baseline in `$SENPI_MONITOR_STATE_DIR` so a move during downtime (at most `$SENPI_MONITOR_DOWNTIME_MS` ms) is still reported: `b="$SENPI_MONITOR_STATE_DIR/base"; p=$(cat "$b" 2>/dev/null || git rev-parse origin/main | tee "$b"); while sleep 30; do git fetch -q || true; n=$(git rev-parse origin/main); [ "$n" != "$p" ] && { echo "MOVED $p..$n"; p=$n; echo "$p" > "$b"; }; done`. A watch whose command exits is not restarted, so keep failures inside the loop non-fatal.',"Sleep loops belong INSIDE the monitor command, never in your turn: about to sleep, re-poll bash_output, or foreground-block on a long command means register a monitor and keep working."],parameters:monitorSchema,renderCall:renderMonitorCall,async execute(_toolCallId,input,_signal,_onUpdate,execCtx){let registry=getRegistry();if(input.action==="rearm"){if(input.bash_id===void 0||input.bash_id.length===0){let resumed=registry.resume();if(resumed.length===0)return textResult2("No paused monitors to re-arm.");ctx.onMonitorsResumed?.(resumed.map(monitor=>monitor.id));let total=resumed.reduce((sum,monitor)=>sum+monitor.mutedDropped,0);return textResult2(total>0?`Re-armed ${resumed.length} paused monitor(s) (${total} line(s) dropped while muted).`:`Re-armed ${resumed.length} paused monitor(s).`)}let bashId=resolveTerminalId(ctx.manager,input.bash_id),dropped=registry.mutedDropped(bashId),outcome=registry.rearm(bashId);return outcome==="not_found"?errorResult(`No active monitor found with id: ${bashId}`):outcome==="not_paused"?textResult2(`Monitor ${bashId} is not paused; no action taken.`):(ctx.onMonitorRearmed?.(bashId),textResult2(dropped>0?`Monitor ${bashId} re-armed (${dropped} line(s) dropped while muted).`:`Monitor ${bashId} re-armed.`))}let fileInput=isFileCreateInput(input),commandInput=isCreateInput(input);if(fileInput&&commandInput)return errorResult("monitor accepts either command or path, not both.");if((fileInput||commandInput)&&await ctx.ensurePersistence?.(),input.persistent===!0&&(fileInput||commandInput)){let refused=durableAdmissionError(ctx);if(refused)return refused}if(fileInput){if(input.filter!==void 0)return errorResult("Native file monitors do not support filter.");if(!ctx.monitorRegistry)return errorResult("Native file monitors require a lifecycle-owned monitor registry.");try{let approvedParent=input[APPROVED_MONITOR_PARENT],{id,monitorId}=await ctx.monitorRegistry.registerFile({description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.persistent===!0?void 0:input.timeout_ms),persistent:input.persistent===!0,deadlineMs:input.persistent===!0?null:Date.now()+resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,...approvedParent!==void 0?{approvedParent}:{},...input.persistent===!0?{expiresAt:Date.now()+DURABLE_MONITOR_EXPIRY_MS}:{}});ctx.manager.bindMonitorId(monitorId,id);let sessionKey=manifestSessionKey(ctx);return await handMonitorSpec(sessionKey,{monitorId,spec:{kind:"file",description:input.description,path:input.path,event:input.event??"create",timeoutMs:resolveTimeoutMs(input.timeout_ms),cwd:execCtx?.cwd??ctx.cwd,persistent:input.persistent===!0,...approvedParent!==void 0?{approvedParent}:{}}}),input.persistent===!0&&handFileCheckpoint(sessionKey,monitorId,ctx.monitorRegistry,id),textResult2(`Monitor started with ID: ${monitorId}`,{details:{monitor_id:monitorId,bash_id:id,monitor:!0}})}catch(error2){return errorResult(error2 instanceof Error?error2.message:String(error2))}}return commandInput?createMonitor(ctx,registry,input,execCtx):errorResult("monitor requires description and command or path to start a watcher.")}}}var RESTORE_STATUS_KEY="terminal-restore",errorText5=error2=>error2 instanceof Error?error2.message:String(error2),restoreSessionTestHooks={},decisions=new Map;function armDecision(sessionKey){let resolve46=()=>{},promise=new Promise(settle=>{resolve46=settle});return decisions.set(sessionKey,{promise,resolve:resolve46}),resolve46}function flushRestoreDigest(pi,state){state.digestSlot.flush(message=>state.settings.notify!=="off"?deliverRestoreDigest(pi,state.ctx,message):(state.ctx?.ui?.notify?.(message.content,"info"),!0))}function emptyDigest2(){return{restored:0,lost:0,expired:0,muted:0,completed:0,attachedElsewhere:0,storeError:!1,results:[],backgroundSessions:[],downtimeMs:0}}function restoreHandlers(state,toolCtx,bundle){let writer=state.manifestWriter;if(writer===null)throw new Error("restore handlers need the bound manifest writer");let registry=bundle.monitors,adopting=handler=>async(monitor,context)=>{let result3=await handler(monitor,context);return(result3.outcome==="restored"||result3.outcome==="muted")&&(writer.adoptRestored(result3.runtime===void 0?monitor:{...monitor,runtime:result3.runtime}),registry.adoptFireWindow(monitor.monitorId,monitor.fireWindow)),result3},freshFileRuntimeId,checkpointedFile=createCheckpointedFileRestoreHandler({registry,writer,bindMonitorId:(monitorId,runtimeId)=>{freshFileRuntimeId=runtimeId,bundle.manager.bindMonitorId(monitorId,runtimeId)}});return{"restartable-command":adopting(createRestartableCommandHandler({ctx:toolCtx,registry,...restoreSessionTestHooks.graceMs!==void 0?{graceMs:restoreSessionTestHooks.graceMs}:{}})),"checkpointed-file":adopting(async(monitor,context)=>{freshFileRuntimeId=void 0;let result3=await checkpointedFile(monitor,context);return result3.outcome!=="restored"||freshFileRuntimeId===void 0?result3:{...result3,outcome:reapplyPersistedMute(registry,monitor,freshFileRuntimeId)}})}}async function startPersistence({pi,state,toolCtx,sessionKey}){state.generation+=1,state.digestSlot=createDigestSlot();let decided=armDecision(sessionKey),ctx=state.ctx,dir=terminalStateDir(ctx),sessionManager=ctx?.sessionManager;if(dir===void 0||sessionManager===void 0)return decided();let encoded=encodedSessionId(sessionKey),generation2=state.generation,own=async lease=>{ctx?.ui?.setStatus?.(RESTORE_STATUS_KEY,void 0),state.lease={path:lease.path,pid:lease.pid,token:lease.token};let writer=new TerminalManifestWriter({session:sessionManager});state.manifestWriter=writer,state.recordedBackgroundIds.clear();let bundle=state.bundle,restoredFromReadableManifest=!1;if(bundle!==null&&existsSync28(writer.store.filePath)){let digest3;try{digest3=await restoreTerminalState({manifest:writer.store,handlers:restoreHandlers(state,toolCtx,bundle),sessionFile:sessionManager.getSessionFile?.(),processStartedAtMs:ownProcessStartedAtMs()})}catch(error2){ctx?.ui?.notify?.(`Terminal restore failed: ${errorText5(error2)}`,"warning"),digest3={...emptyDigest2(),storeError:!0}}if(await Promise.all(digest3.results.filter(result3=>result3.outcome==="lost"||result3.outcome==="expired"||result3.outcome==="completed").map(result3=>removeMonitorStateDir(dir,result3.monitorId))),generation2!==state.generation)return;restoredFromReadableManifest=!digest3.storeError,(digest3.storeError||digest3.results.length>0||digest3.backgroundSessions.length>0)&&state.digestSlot.set(buildRestoreDigest(digest3,{generation:generation2,outcome:"decided"}))}bindTerminalManifestWriter(sessionKey,writer),restoredFromReadableManifest&&await writer.persistRestored(),state.ensurePersistence=null;let self={pid:process.pid,bootAtMs:processBootAtMs(),processStartedAtMs:ownProcessStartedAtMs()};sweepTerminalStateDir(dir,{self,keep:new Set([`${encoded}.lease`,`${encoded}.json`])}).catch(()=>{}),flushRestoreDigest(pi,state),decided()},wait=holder=>{ctx?.ui?.setStatus?.(RESTORE_STATUS_KEY,holder===null?"monitors waiting for the session lease":`monitors held by pid ${holder.pid}`),state.digestSlot.set(buildRestoreDigest(emptyDigest2(),{generation:generation2,outcome:"deferred",...holder===null?{}:{holderPid:holder.pid}})),state.keeper?.stop(),state.keeper=createLeaseKeeper({dir,encodedSessionId:encoded,...restoreSessionTestHooks.keeperIntervalMs!==void 0?{intervalMs:restoreSessionTestHooks.keeperIntervalMs}:{},onTakeover:lease=>(state.restoreInFlight=own(lease),state.restoreInFlight),onError:error2=>{let waiting=state.keeper?.state==="waiting";ctx?.ui?.notify?.(`Terminal lease ${waiting?"check failed, still waiting":"takeover failed"}: ${errorText5(error2)}`,"warning")}}),state.keeper.start(holder)},acquire=async()=>{let lease=await acquireTerminalLease({dir,encodedSessionId:encoded}).catch(error2=>(ctx?.ui?.notify?.(`Terminal lease not acquired yet, retrying: ${errorText5(error2)}`,"warning"),null));if(lease===null)return wait(null);if(lease.acquired){state.restoreInFlight=own(lease);return}wait(lease.holder)};if(existsSync28(createTerminalManifestStore(sessionManager).filePath))return acquire();decided();let binding=null;state.ensurePersistence=()=>(binding??=acquire().then(()=>state.restoreInFlight),binding)}async function stopPersistence(state,sessionKey){let keeper=state.keeper;keeper?.stop(),state.keeper=null,await keeper?.settled();let lease=state.lease;state.lease=null,lease!==null&&retireLeaseToken(lease.token),await state.restoreInFlight;let writer=state.manifestWriter;writer&&state.bundle&&await writer.observeMonitorState(state.bundle.monitors.snapshot()),detachPersistence(state,sessionKey),writer&&await writer.recordShutdown(),lease!==null&&await releaseTerminalLease(lease),decisions.get(sessionKey)?.resolve()}function detachPersistence(state,sessionKey){state.manifestWriter=null,state.ensurePersistence=null,state.recordedBackgroundIds.clear(),sessionKey!==void 0&&unbindTerminalManifestWriter(sessionKey)}var TERMINAL_SETTINGS_DEFAULTS={defaultCols:DEFAULT_COLS,defaultRows:DEFAULT_ROWS,scrollback:DEFAULT_SCROLLBACK,maxSessions:DEFAULT_MAX_SESSIONS,timeoutAction:"background",notify:"wake",monitor:{coalesceWindowMs:2e3,rateLimitMs:5e3,maxLinesPerInjection:50,maxCharsPerInjection:4096,wakeBudget:5},maxDurableMonitors:"unlimited"};function positiveInt(value2,fallback,maximum=Number.MAX_SAFE_INTEGER){return typeof value2!="number"||!Number.isFinite(value2)||value2<1?fallback:Math.min(Math.trunc(value2),maximum)}function nonNegativeInt(value2,fallback){return typeof value2!="number"||!Number.isFinite(value2)||value2<0?fallback:Math.trunc(value2)}function oneOf2(value2,allowed,fallback){return typeof value2=="string"&&allowed.includes(value2)?value2:fallback}function durableMonitorCap(value2){return typeof value2!="number"||!Number.isFinite(value2)||value2<1?"unlimited":Math.trunc(value2)}function resolveTerminalSettings(raw){return raw?{defaultCols:positiveInt(raw.defaultCols,TERMINAL_SETTINGS_DEFAULTS.defaultCols),defaultRows:positiveInt(raw.defaultRows,TERMINAL_SETTINGS_DEFAULTS.defaultRows),scrollback:nonNegativeInt(raw.scrollback,TERMINAL_SETTINGS_DEFAULTS.scrollback),maxSessions:positiveInt(raw.maxSessions,TERMINAL_SETTINGS_DEFAULTS.maxSessions),timeoutAction:oneOf2(raw.timeoutAction,["background","kill"],TERMINAL_SETTINGS_DEFAULTS.timeoutAction),notify:oneOf2(raw.notify,["wake","next-turn","off"],TERMINAL_SETTINGS_DEFAULTS.notify),monitor:{coalesceWindowMs:positiveInt(raw.monitorCoalesceWindowMs,TERMINAL_SETTINGS_DEFAULTS.monitor.coalesceWindowMs,6e4),rateLimitMs:positiveInt(raw.monitorRateLimitMs,TERMINAL_SETTINGS_DEFAULTS.monitor.rateLimitMs,36e5),maxLinesPerInjection:positiveInt(raw.monitorMaxLinesPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxLinesPerInjection,200),maxCharsPerInjection:positiveInt(raw.monitorMaxCharsPerInjection,TERMINAL_SETTINGS_DEFAULTS.monitor.maxCharsPerInjection,16384),wakeBudget:positiveInt(raw.monitorWakeBudget,TERMINAL_SETTINGS_DEFAULTS.monitor.wakeBudget,100)},maxDurableMonitors:durableMonitorCap(raw.maxDurableMonitors)}:TERMINAL_SETTINGS_DEFAULTS}function loadTerminalSettings(settingsManager){let global=settingsManager.getGlobalSettings().terminal,project=settingsManager.getProjectSettings().terminal,merged={...global,...project};return resolveTerminalSettings(merged)}function createForegroundDetachGate(options){let cancelled2=!1,committed=!1,timer,resolveDetached,detached=new Promise(resolve46=>{resolveDetached=resolve46}),clearDeadline=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)},linearize=()=>{if(cancelled2||committed||options.runtime.exited||options.signal?.aborted)return;let exitedAtGate=!1,unsubscribeExit=options.runtime.session.onExit(()=>{committed||(exitedAtGate=!0)});if(cancelled2||options.runtime.exited||exitedAtGate||options.signal?.aborted){unsubscribeExit();return}committed=!0,options.removeAbortListener(),unsubscribeExit(),resolveDetached()};return timer=setTimeout(()=>queueMicrotask(linearize),options.delayMs),{detached,cancel(){cancelled2=!0,clearDeadline()}}}var SHELL_WRAPPER=/^(?:env\s+(?:[\w.]+=[^\s]*\s+)*)?(?:\/(?:usr\/)?bin\/)?(?:ba|z|da|k)?sh\s+-[a-z]*c\s+/i,POWER_MANAGEMENT=/\b(?:pmset|systemsetup|caffeinate|displaysleep|disksleep)\b/,SLEEP_CALL=/(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+(\d+(?:\.\d+)?)/g,PURE=/^sleep\s+\d+(?:\.\d+)?$/,LEADING=/^\(?\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*(?:[;&|]|$)/,LOOP=/\b(?:while|until|for)\b[\s\S]*?(?<![\w.\-/])(?:\/(?:usr\/)?bin\/)?sleep\s+\d/,TRAILING=/[;&|]\s*(?:\/(?:usr\/)?bin\/)?sleep\s+\d+(?:\.\d+)?\s*\)?\s*$/;function unwrap(command){let current=command.trim();for(let depth=0;depth<3;depth+=1){let stripped=current.replace(SHELL_WRAPPER,"");if(stripped===current)break;current=stripped.trim();let quote=current[0];(quote==="'"||quote==='"')&&current.endsWith(quote)&&current.length>1&&(current=current.slice(1,-1).trim())}return current}function longestSleepSeconds(command){SLEEP_CALL.lastIndex=0;let longest;for(let match of command.matchAll(SLEEP_CALL)){let seconds=Number.parseFloat(match[1]??"");Number.isFinite(seconds)&&(longest===void 0||seconds>longest)&&(longest=seconds)}return longest}function classifySleepWait(command){if(POWER_MANAGEMENT.test(command))return;let unwrapped=unwrap(command),seconds=longestSleepSeconds(unwrapped);if(seconds!==void 0){if(LOOP.test(unwrapped))return seconds>=2?{kind:"sleep-wait",rule:"R3",seconds}:void 0;if(!(seconds<10)){if(PURE.test(unwrapped))return{kind:"sleep-wait",rule:"R1",seconds};if(LEADING.test(unwrapped))return{kind:"sleep-wait",rule:"R2",seconds};if(TRAILING.test(unwrapped))return{kind:"sleep-wait",rule:"R4",seconds}}}}var ptyBashSchema=typebox_exports.Object({command:typebox_exports.String({description:"Shell command to execute in a PTY-backed session."}),timeout:typebox_exports.Optional(typebox_exports.Number({description:"Process kill deadline in seconds (default 1800). Foreground blocking stops at the ~60s window: a command still running then auto-detaches to a live background session instead of being killed. Ignored for run_in_background sessions (they live until exit or kill_bash)."})),description:typebox_exports.Optional(typebox_exports.String({description:"Short human-readable label for this command."})),run_in_background:typebox_exports.Optional(typebox_exports.Boolean({description:"Run as a persistent background session. Returns a bash_id immediately; query it with bash_output, steer with bash_input, tear down with kill_bash."})),cols:typebox_exports.Optional(typebox_exports.Number({description:"PTY width in columns (default 120)."})),rows:typebox_exports.Optional(typebox_exports.Number({description:"PTY height in rows (default 40)."}))});function resolveDimension2(value2,fallback){return value2===void 0||!Number.isFinite(value2)||value2<1?fallback:Math.trunc(value2)}function delay2(ms){return new Promise(resolve46=>setTimeout(resolve46,ms))}var MAX_TIMEOUT_MS=2147483647,BASH_UPDATE_THROTTLE_MS=100;function createThrottledEmitter(emit,throttleMs=BASH_UPDATE_THROTTLE_MS){let timer,dirty=!1,lastEmissionAt,emitIfDirty=()=>{dirty&&(dirty=!1,lastEmissionAt=Date.now(),emit())},clearTimer=()=>{timer!==void 0&&(clearTimeout(timer),timer=void 0)};return{schedule(){if(dirty=!0,timer!==void 0)return;let elapsed=lastEmissionAt===void 0?throttleMs:Date.now()-lastEmissionAt;if(elapsed>=throttleMs){emitIfDirty();return}timer=setTimeout(()=>{timer=void 0,emitIfDirty()},throttleMs-elapsed)},flush(){clearTimer(),emitIfDirty()},dispose(){clearTimer(),dirty=!1,lastEmissionAt=void 0}}}function sessionSpawnContext(ctx){return{...ctx,getEnv:()=>({...ctx.getEnv(),PI_SESSION_CWD:void 0,PI_GOAL_STORE_FILE:void 0,OMO_BROWSER_ENGINE:void 0})}}function sessionEnvOverrides(ctx,execCtx){let session=execCtx??ctx.getSessionContext?.();if(!session?.sessionManager)return{};let env={};env.PI_SESSION_ID=session.sessionManager.getSessionId(),session.cwd&&(env.PI_SESSION_CWD=session.cwd),session.goalStoreFile&&(env.PI_GOAL_STORE_FILE=session.goalStoreFile);let sessionFile=session.sessionManager.getSessionFile();return sessionFile&&(env.PI_SESSION_FILE=sessionFile),session.model&&(env.PI_PROVIDER=session.model.provider,env.PI_MODEL=session.model.id),session.thinkingLevel&&(env.PI_REASONING_LEVEL=session.thinkingLevel),session.browserEngine&&(env.OMO_BROWSER_ENGINE=session.browserEngine),env}function raceExitWithKillGrace(runtime,signal,timeoutMs){return new Promise((resolve46,reject)=>{let settled=!1,abortGraceTimer,timeoutGraceTimer,armAbortGrace,settle=finish=>{settled||(settled=!0,abortGraceTimer&&clearTimeout(abortGraceTimer),timeoutGraceTimer&&clearTimeout(timeoutGraceTimer),signal&&armAbortGrace&&signal.removeEventListener("abort",armAbortGrace),finish())};if(runtime.session.waitExit().then(()=>settle(()=>resolve46("exited")),error2=>settle(()=>reject(error2 instanceof Error?error2:new Error(String(error2))))),timeoutMs!==void 0){let timeoutGraceDeadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;timeoutGraceDeadlineMs<=MAX_TIMEOUT_MS&&(timeoutGraceTimer=setTimeout(()=>settle(()=>resolve46("timeout_grace")),timeoutGraceDeadlineMs))}signal&&(armAbortGrace=()=>{abortGraceTimer??=setTimeout(()=>settle(()=>resolve46("abort_grace")),KILLED_SESSION_EXIT_GRACE_MS)},signal.aborted?armAbortGrace():signal.addEventListener("abort",armAbortGrace,{once:!0}))})}function resolveAutoDetachDelayMs(ctx,input,sleepWait){if(ctx.timeoutAction==="kill")return;let windowSeconds=sleepWait?Math.min(5,resolveForegroundWindowSeconds(process.env)):resolveForegroundWindowSeconds(process.env);if(!((input.timeout!==void 0&&Number.isFinite(input.timeout)?input.timeout:1/0)<=windowSeconds))return Math.max(0,Math.trunc(windowSeconds*1e3))}function scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt){if(timeoutMs===void 0)return;let deadlineMs=timeoutMs+KILLED_SESSION_EXIT_GRACE_MS;if(!Number.isFinite(deadlineMs)||deadlineMs>MAX_TIMEOUT_MS||runtime.exited)return;let remainingMs2=Math.max(0,deadlineMs-(Date.now()-startedAt)),timer,unsubscribeExit,clearSweep=()=>{timer!==void 0&&clearTimeout(timer),timer=void 0,unsubscribeExit?.(),unsubscribeExit=void 0};if(unsubscribeExit=runtime.session.onExit(clearSweep),runtime.exited){clearSweep();return}timer=setTimeout(()=>{clearSweep(),runtime.exited||ctx.manager.stop(id).catch(()=>{})},remainingMs2)}async function runForeground(ctx,input,cols,rows,signal,cwd,onUpdate,execCtx){if(signal?.aborted)return errorResult("Command aborted");let timeoutMs=input.timeout!==void 0?Math.trunc(input.timeout*1e3):void 0,{id,runtime}=await spawnCommandSession(sessionSpawnContext(ctx),{command:input.command,cols,rows,timeoutMs,cwd,envOverrides:{...sessionEnvOverrides(ctx,execCtx),...FOREGROUND_ENV_OVERRIDES}}),startedAt=Date.now(),activity=`running ${input.command.slice(0,80)}`,updateEmitter=onUpdate?createThrottledEmitter(()=>{let text2=formatTerminalToolOutput(runtime.fullOutput()).body.slice(-2e3);onUpdate?.({content:[{type:"text",text:text2}],details:{progress:{activity,startedAt}}})}):void 0;onUpdate?.({content:[],details:void 0});let unsubscribeOutput=onUpdate?runtime.onOutput(()=>updateEmitter?.schedule()):void 0,sleepWait=classifySleepWait(input.command),detachDelayMs=resolveAutoDetachDelayMs(ctx,input,sleepWait),outcome;if(detachDelayMs===void 0){let onAbort=()=>runtime.session.kill("SIGKILL");signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));try{outcome=await raceExitWithKillGrace(runtime,signal,timeoutMs)}finally{signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}else{let abortGate=new AbortController,onAbort=()=>{runtime.session.kill("SIGKILL"),abortGate.abort()};signal&&(signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0}));let detachGate=createForegroundDetachGate({runtime,signal,delayMs:detachDelayMs,removeAbortListener:()=>signal?.removeEventListener("abort",onAbort)});try{outcome=await Promise.race([raceExitWithKillGrace(runtime,abortGate.signal,timeoutMs),detachGate.detached.then(()=>"detached")])}finally{detachGate.cancel(),signal?.removeEventListener("abort",onAbort),unsubscribeOutput?.(),updateEmitter?.flush(),updateEmitter?.dispose()}}if(outcome==="detached"){scheduleDetachedSweep(ctx,id,runtime,timeoutMs,startedAt),ctx.onBackgroundStart?.(id,input.description??input.command,startedAt),ctx.onBackgroundExit&&runtime.session.onExit(()=>ctx.onBackgroundExit?.(id,runtime));let delta=runtime.readDelta(),partialOutput=formatTerminalToolOutput(delta.text).text||"(no output yet)",timeoutNote=input.timeout!==void 0&&Number.isFinite(input.timeout)?`not killed; the original ${input.timeout}s timeout still applies`:"not killed; it will run until exit or kill_bash",guidance=sleepWait?`This command is a wait (${sleepWait.seconds}s sleep), so it detached immediately; the wait continues in the background. Do nothing and end your turn \u2014 completion will be reported automatically with exit status and output tail. Do NOT poll bash_output({ bash_id: "${id}" }) for it. When you are waiting for a pattern in a command's output, launch it with monitor({ command, filter }) instead so matching lines arrive as events. Use kill_bash({ bash_id: "${id}" }) to stop this session.`:`Continue other work; completion will be reported automatically with exit status and output tail. Use bash_output({ bash_id: "${id}" }) only to peek at new output. monitor cannot attach to this session; use it for future event-driven launches. Use kill_bash({ bash_id: "${id}" }) to stop this session.`;return textResult2(`Command is still running; auto-detached to background with ID: ${id} (${timeoutNote}).
2185
2185
 
@@ -2203,7 +2203,7 @@ ${early}`:"";return textResult2(`${header2}${backendNote}${earlyBlock}`,{details
2203
2203
  ${screenView(runtime)}`,extra);let delta=runtime.readDelta(),formatted=formatTerminalToolOutput(applyFilter(delta.text,input.filter)),droppedNotice=delta.droppedChars>0?`[${delta.droppedChars} earlier chars dropped]`:void 0,dropped=droppedNotice===void 0?"":`${droppedNotice}
2204
2204
  `;return noticedResult(`${prefix}${statusLine(runtime)}
2205
2205
  ${dropped}${formatted.text||"(no new output)"}`,[droppedNotice,formatted.marker],extra)},renderCall:renderBashOutputCall,renderResult:renderBashOutputResult}}var bashResizeSchema=typebox_exports.Object({bash_id:typebox_exports.String({description:"Session id returned by a run_in_background bash call."}),cols:typebox_exports.Number({description:"New PTY width in columns."}),rows:typebox_exports.Number({description:"New PTY height in rows."})});function valid(value2){return Number.isFinite(value2)&&value2>=1}function createBashResizeTool(ctx){return{name:TERMINAL_RESIZE_TOOL,label:"bash_resize",description:"Resize a live background bash session's PTY (cols x rows) so full-screen TUIs reflow. No-ops with a note under the pipe fallback.",promptSnippet:"Resize a background bash session's PTY so TUIs reflow",parameters:bashResizeSchema,async execute(_toolCallId,input,_signal){let sessionId=resolveTerminalId(ctx.manager,input.bash_id),runtime=ctx.manager.get(sessionId);if(!runtime)return errorResult(`No terminal session found with id: ${input.bash_id}`);if(runtime.exited)return errorResult(`Session ${input.bash_id} is not running; cannot resize.`);if(!valid(input.cols)||!valid(input.rows))return errorResult("cols and rows must be finite integers >= 1.");let cols=Math.trunc(input.cols),rows=Math.trunc(input.rows),result3=runtime.session.resize(cols,rows);return runtime.resizeScreen(cols,rows),result3.ok?textResult2(`Resized ${input.bash_id} to ${cols}x${rows}.`):textResult2(`Resize note for ${input.bash_id}: ${result3.note}`)}}}var killBashSchema=typebox_exports.Object({bash_id:typebox_exports.Optional(typebox_exports.String({description:"Session id to tree-kill."})),all:typebox_exports.Optional(typebox_exports.Boolean({description:"Tree-kill every live background session."}))});function createKillBashTool(ctx){return{name:TERMINAL_KILL_TOOL,label:"kill_bash",description:"Terminate a background bash session (or all of them) and its process tree cleanly.",promptSnippet:"Tree-kill a background bash session (or all) with no orphans",parameters:killBashSchema,async execute(_toolCallId,input,_signal){let terminalDir=terminalStateDir(ctx.getSessionContext?.()),dropStateDir=async monitorId2=>{terminalDir!==void 0&&monitorId2!==void 0&&await removeMonitorStateDir(terminalDir,monitorId2)};if(input.all){let terminalCount=ctx.manager.size,monitorIds=(ctx.monitorRegistry?.snapshot()??[]).map(entry=>entry.monitorId),fileCount=await ctx.monitorRegistry?.stopAllFiles()??0;await ctx.manager.teardown();for(let monitorId2 of monitorIds)await dropStateDir(monitorId2);return textResult2(`Killed ${terminalCount+fileCount} session(s).`)}if(!input.bash_id)return errorResult("Provide `bash_id` or set `all:true`.");let sessionId=resolveTerminalId(ctx.manager,input.bash_id),monitorId=input.bash_id.startsWith("mon_")?input.bash_id:ctx.manager.monitorIdOf?.(sessionId);return await ctx.monitorRegistry?.stopFile(sessionId)?(await dropStateDir(monitorId),textResult2(`Killed ${input.bash_id}.`)):ctx.manager.get(sessionId)?(await ctx.manager.stop(sessionId),await dropStateDir(monitorId),textResult2(`Killed ${input.bash_id}.`)):errorResult(`No terminal session found with id: ${input.bash_id}`)}}}function shouldStepAside(ctx){return isAnthropicBashEnabled()&&ctx?.model?.api==="anthropic-messages"}function syncToolset2(pi,state){let stepAside=shouldStepAside(state.ctx),active=new Set(pi.getActiveTools());if(stepAside){for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown||(state.ctx?.ui.notify("native Anthropic bash active \u2014 monitor sessions remain available","info"),state.noticeShown=!0)}else{active.add(TERMINAL_BASH_TOOL);for(let companion of TERMINAL_COMPANION_TOOLS)active.add(companion);state.noticeShown=!1}state.steppedAside=stepAside,pi.setActiveTools([...active])}function registerTerminalExtension(pi){let state={bundle:null,settings:TERMINAL_SETTINGS_DEFAULTS,notifier:null,monitorNotifier:null,statusTicker:new MonitorStatusTicker({render:status=>{let ctx=state.ctx;ctx?.ui.setStatus(MONITOR_STATUS_KEY,status===void 0||ctx.mode!=="tui"?status:ctx.ui.theme.bg("selectedBg",ctx.ui.theme.fg("text",status)))}}),ctx:void 0,shellPath:void 0,steppedAside:!1,noticeShown:!1,lease:null,manifestWriter:null,ensurePersistence:null,recordedBackgroundIds:new Set,keeper:null,digestSlot:createDigestSlot(),generation:0,restoreInFlight:Promise.resolve(),parked:!1},toolCtx=buildToolContext(pi,state);pi.registerTool(createPtyBashTool(toolCtx)),pi.registerTool(createBashOutputTool(toolCtx)),pi.registerTool(createBashInputTool(toolCtx)),pi.registerTool(createBashResizeTool(toolCtx)),pi.registerTool(createKillBashTool(toolCtx)),pi.registerTool(createMonitorTool(toolCtx)),registerRestoreDigestRenderer(pi),pi.on("session_start",async(event,ctx)=>{state.ctx=ctx;let settingsManager=SettingsManager.create(ctx.cwd);state.settings=loadTerminalSettings(settingsManager),state.shellPath=settingsManager.getShellPath(),state.notifier=new TerminalNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify}),state.monitorNotifier?.dispose(),state.monitorNotifier=new MonitorNotifier({sendMessage:(message,options)=>pi.sendMessage(message,options),getContext:()=>state.ctx,getMode:()=>state.settings.notify,getSettings:()=>state.settings.monitor,pauseMonitors:ids=>state.bundle?.monitors.pause(ids)??[]});let sessionKey=sessionKeyOf(ctx);if(event.reason==="reload"){let claimed=sessionKey===void 0?void 0:claimParkedBundle(sessionKey);claimed&&(await state.bundle?.teardown(),state.bundle=claimed)}else sessionKey!==void 0&&await teardownParkedBundle(sessionKey),await state.bundle?.teardown(),state.bundle=createBundle(state);state.bundle??=createBundle(state),state.bundle.bind(bundleSinks(pi,state));let holdsLease=sessionKey!==void 0&&currentLeaseToken(encodedSessionId(sessionKey))!==void 0;if(event.reason==="reload"&&holdsLease){if(sessionKey!==void 0&&terminalStateDir(ctx)!==void 0){let writer=new TerminalManifestWriter({session:ctx.sessionManager});await writer.seedFromDisk(),state.manifestWriter=writer,state.recordedBackgroundIds.clear(),bindTerminalManifestWriter(sessionKey,writer)}}else sessionKey!==void 0&&await startPersistence({pi,state,toolCtx,sessionKey});syncToolset2(pi,state)}),pi.on("session_parked",()=>{state.parked=!0,state.bundle?.monitors.setParked(!0),state.statusTicker.stop()}),pi.on("session_resumed",()=>{state.parked=!1,state.bundle?.monitors.setParked(!1),state.bundle&&state.statusTicker.sync(state.bundle.monitors.snapshot())}),pi.on("model_select",async(event,ctx)=>{state.ctx={...ctx,model:event.model},syncToolset2(pi,state),flushRestoreDigest(pi,state)}),pi.on("input",event=>{if(event.source==="extension")return;state.monitorNotifier?.noteActivity(),flushRestoreDigest(pi,state);let resumed=state.bundle?.monitors.resume()??[];resumed.length>0&&state.monitorNotifier?.resume(resumed.map(monitor=>monitor.id))}),pi.on("tool_call",()=>{state.monitorNotifier?.noteActivity()}),pi.on("before_agent_start",async event=>{if(!state.steppedAside)return{systemPrompt:`${event.systemPrompt}
2206
- ${buildTerminalPromptSection({evalOnly:isEvalOnlyRouting(pi)})}`}},{previewSafe:!0}),pi.on("session_shutdown",async(event,ctx)=>{state.monitorNotifier?.dispose(),state.monitorNotifier=null,state.notifier=null,state.statusTicker.stop();let sessionKey=sessionKeyOf(ctx)??sessionKeyOf(state.ctx);if(event.reason==="reload"&&state.bundle&&sessionKey!==void 0){state.keeper?.stop(),state.keeper=null,detachPersistence(state,sessionKey),state.bundle.park(),await parkBundle(sessionKey,state.bundle);return}let inheritedLease=state.lease===null;if(sessionKey!==void 0&&await stopPersistence(state,sessionKey),inheritedLease&&sessionKey!==void 0){let dir=terminalStateDir(ctx)??terminalStateDir(state.ctx);if(dir!==void 0){let token=currentLeaseToken(encodedSessionId(sessionKey));token!==void 0&&retireLeaseToken(token),await releaseTerminalLease({path:join58(dir,`${encodedSessionId(sessionKey)}.lease`),pid:process.pid,...token===void 0?{}:{token}})}}let bundle=state.bundle;state.bundle=null,await bundle?.teardown(),sessionKey!==void 0&&await teardownParkedBundle(sessionKey)})}var extension_default2=registerTerminalExtension;import{readFile as readFile15,writeFile as writeFile10}from"node:fs/promises";import{randomUUID as randomUUID10}from"node:crypto";import{unlinkSync as unlinkSync3,writeFileSync as writeFileSync16}from"node:fs";import{platform as platform3,tmpdir as tmpdir5}from"node:os";import{join as join59}from"node:path";import{spawn as spawn6}from"node:child_process";function runClipboardCommand(command,args,options){return new Promise(resolve46=>{let child=spawn6(command,args,{stdio:["pipe",options?.input===void 0?"pipe":"ignore","ignore"],windowsHide:!0}),chunks=[],length=0,settled=!1,finish=result3=>{settled||(settled=!0,clearTimeout(timer),resolve46(result3))},abort=()=>{child.kill("SIGKILL"),child.stdout?.destroy(),child.stdin?.destroy(),finish(void 0)},timer=setTimeout(abort,options?.timeoutMs??3e3);child.on("error",()=>finish(void 0)),child.on("close",code=>{settled||finish(code===0?Buffer.concat(chunks,length):void 0)}),child.stdout?.on("data",chunk=>{settled||(length+=chunk.length,length>(options?.maxBufferBytes??50*1024*1024)?abort():chunks.push(chunk))}),child.stdin?.on("error",()=>{}),child.stdin?.end(options?.input)})}import{readFileSync as readFileSync32}from"node:fs";function isWSL(env=process.env){if(env.WSL_DISTRO_NAME||env.WSLENV)return!0;try{let release4=readFileSync32("/proc/version","utf-8");return/microsoft|wsl/i.test(release4)}catch{return!1}}var MAX_OSC52_ENCODED_LENGTH=1e5;function isRemoteSession(env){return!!(env.SSH_CONNECTION||env.SSH_CLIENT||env.MOSH_CONNECTION)}function emitOsc52(text2){let encoded=Buffer.from(text2).toString("base64");return encoded.length>MAX_OSC52_ENCODED_LENGTH?!1:(process.stdout.write(`\x1B]52;c;${encoded}\x07`),!0)}async function copyViaWindowsClipboard(text2){let tmpFile=join59(tmpdir5(),`pi-wsl-clip-${randomUUID10()}.txt`);try{writeFileSync16(tmpFile,text2,{encoding:"utf8",mode:384});let winPath=(await runClipboardCommand("wslpath",["-w",tmpFile],{timeoutMs:1e3}))?.toString("utf8").trim();if(!winPath)return!1;let script=`Set-Clipboard -Value ([System.IO.File]::ReadAllText('${winPath.replaceAll("'","''")}', [System.Text.Encoding]::UTF8))`;return await runClipboardCommand("powershell.exe",["-NoProfile","-Command",script],{timeoutMs:5e3})!==void 0}catch{return!1}finally{try{unlinkSync3(tmpFile)}catch{}}}async function readClipboardText(){if(platform3()==="linux"){let commands=[];process.env.TERMUX_VERSION&&commands.push(["termux-clipboard-get",[]]),process.env.WAYLAND_DISPLAY&&commands.push(["wl-paste",["--no-newline","--type","text"]]),process.env.DISPLAY&&commands.push(["xclip",["-selection","clipboard","-out"]],["xsel",["--clipboard","--output"]]);for(let[command,args]of commands){let bytes=await runClipboardCommand(command,args,{timeoutMs:5e3});if(bytes!==void 0)return bytes.toString("utf8")||null}}try{return await getNativeClipboard()?.getText()||null}catch{return null}}async function readClipboardFilePaths(){let paths=await getNativeClipboard()?.getFilePaths?.();return paths?.length?paths:null}async function copyToClipboard(text2){let p=platform3(),env=process.env,copied=!1;if(p!=="linux")try{let clipboard=getNativeClipboard();clipboard?.setText&&(await clipboard.setText(text2),copied=!0)}catch{}if(!copied){let commands=[];p==="darwin"?commands.push(["pbcopy",[]]):p==="win32"?commands.push(["clip",[]]):(env.TERMUX_VERSION&&commands.push(["termux-clipboard-set",[]]),env.WAYLAND_DISPLAY&&commands.push(["wl-copy",[]]),env.DISPLAY&&commands.push(["xclip",["-selection","clipboard"]],["xsel",["--clipboard","--input"]]));for(let[command,args]of commands)if(await runClipboardCommand(command,args,{input:text2,timeoutMs:5e3})!==void 0){copied=!0;break}}let osc52Emitted=!1;!copied&&p==="linux"&&isWSL(env)&&(env.WT_SESSION&&(osc52Emitted=emitOsc52(text2)),copied=osc52Emitted||await copyViaWindowsClipboard(text2));let headless=p==="linux"&&!env.DISPLAY&&!env.WAYLAND_DISPLAY&&!env.TERMUX_VERSION,oversized=!1;if(!osc52Emitted&&(isRemoteSession(env)||!copied&&headless)&&(emitOsc52(text2)?copied=!0:oversized=!0),!copied){if(oversized)throw new Error("Clipboard unavailable: text exceeds the OSC 52 size limit");if(p==="linux"){if(env.TERMUX_VERSION)throw new Error("Clipboard unavailable: install the Termux:API app and `termux-api` package");if(env.WAYLAND_DISPLAY)throw new Error("Clipboard unavailable: install `wl-clipboard` (`wl-copy`) or check Wayland access");if(env.DISPLAY)throw new Error("Clipboard unavailable: install `xclip` or `xsel`, or check X11 access")}throw new Error("Clipboard unavailable")}}import{isAbsolute as isAbsolute18,resolve as resolve32}from"node:path";var STATUS_TO_MARKER={pending:" ",in_progress:"/",completed:"x",abandoned:"-"},MARKER_TO_STATUS={" ":"pending","":"pending",x:"completed",X:"completed","/":"in_progress",">":"in_progress","-":"abandoned","~":"abandoned"},DEFAULT_TODO_MARKDOWN_FILE="TODO.md";function resolveTodoMarkdownPath(input,cwd){let raw=input.trim().replace(/^["']|["']$/g,"")||DEFAULT_TODO_MARKDOWN_FILE;return isAbsolute18(raw)?raw:resolve32(cwd,raw)}function phasesToMarkdown(phases){if(phases.length===0)return`# ${DEFAULT_INIT_PHASE}
2206
+ ${buildTerminalPromptSection({evalOnly:isEvalOnlyRouting(pi)})}`}},{previewSafe:!0}),pi.on("session_shutdown",async(event,ctx)=>{state.monitorNotifier?.dispose(),state.monitorNotifier=null,state.notifier=null,state.statusTicker.stop();let sessionKey=sessionKeyOf(ctx)??sessionKeyOf(state.ctx);if(event.reason==="reload"&&state.bundle&&sessionKey!==void 0){state.keeper?.stop(),state.keeper=null,detachPersistence(state,sessionKey),state.bundle.park(),await parkBundle(sessionKey,state.bundle);return}let inheritedLease=state.lease===null;if(sessionKey!==void 0&&await stopPersistence(state,sessionKey),inheritedLease&&sessionKey!==void 0){let dir=terminalStateDir(ctx)??terminalStateDir(state.ctx);if(dir!==void 0){let token=currentLeaseToken(encodedSessionId(sessionKey));token!==void 0&&retireLeaseToken(token),await releaseTerminalLease({path:join58(dir,`${encodedSessionId(sessionKey)}.lease`),pid:process.pid,...token===void 0?{}:{token}})}}let bundle=state.bundle;state.bundle=null,await bundle?.teardown(),sessionKey!==void 0&&await teardownParkedBundle(sessionKey)})}var extension_default2=registerTerminalExtension;import{readFile as readFile15,writeFile as writeFile10}from"node:fs/promises";import{randomUUID as randomUUID10}from"node:crypto";import{unlinkSync as unlinkSync3,writeFileSync as writeFileSync16}from"node:fs";import{platform as platform3,tmpdir as tmpdir5}from"node:os";import{join as join59}from"node:path";import{spawn as spawn6}from"node:child_process";function runClipboardCommand(command,args,options){return new Promise(resolve46=>{let child=spawn6(command,args,{stdio:["pipe",options?.input===void 0?"pipe":"ignore","ignore"],windowsHide:!0}),chunks=[],length=0,settled=!1,finish=result3=>{settled||(settled=!0,clearTimeout(timer),resolve46(result3))},abort=()=>{child.kill("SIGKILL"),child.stdout?.destroy(),child.stdin?.destroy(),finish(void 0)},timer=setTimeout(abort,options?.timeoutMs??3e3);child.on("error",()=>finish(void 0)),child.on("close",code=>{settled||finish(code===0?Buffer.concat(chunks,length):void 0)}),child.stdout?.on("data",chunk=>{settled||(length+=chunk.length,length>(options?.maxBufferBytes??50*1024*1024)?abort():chunks.push(chunk))}),child.stdin?.on("error",()=>{}),child.stdin?.end(options?.input)})}import{readFileSync as readFileSync32}from"node:fs";function isWSL(env=process.env){if(env.WSL_DISTRO_NAME||env.WSLENV)return!0;try{let release4=readFileSync32("/proc/version","utf-8");return/microsoft|wsl/i.test(release4)}catch{return!1}}var MAX_OSC52_ENCODED_LENGTH=1e5;function isRemoteSession(env){return!!(env.SSH_CONNECTION||env.SSH_CLIENT||env.MOSH_CONNECTION)}function emitOsc52(text2){let encoded=Buffer.from(text2).toString("base64");return encoded.length>MAX_OSC52_ENCODED_LENGTH?!1:(process.stdout.write(`\x1B]52;c;${encoded}\x07`),!0)}async function copyViaWindowsClipboard(text2){let tmpFile=join59(tmpdir5(),`pi-wsl-clip-${randomUUID10()}.txt`);try{writeFileSync16(tmpFile,text2,{encoding:"utf8",mode:384});let winPath=(await runClipboardCommand("wslpath",["-w",tmpFile],{timeoutMs:1e3}))?.toString("utf8").trim();if(!winPath)return!1;let script=`Set-Clipboard -Value ([System.IO.File]::ReadAllText('${winPath.replaceAll("'","''")}', [System.Text.Encoding]::UTF8))`;return await runClipboardCommand("powershell.exe",["-NoProfile","-Command",script],{timeoutMs:5e3})!==void 0}catch{return!1}finally{try{unlinkSync3(tmpFile)}catch{}}}async function readClipboardText(){if(platform3()==="linux"){let commands=[];process.env.TERMUX_VERSION&&commands.push(["termux-clipboard-get",[]]),process.env.WAYLAND_DISPLAY&&commands.push(["wl-paste",["--no-newline","--type","text"]]),process.env.DISPLAY&&commands.push(["xclip",["-selection","clipboard","-out"]],["xsel",["--clipboard","--output"]]);for(let[command,args]of commands){let bytes=await runClipboardCommand(command,args,{timeoutMs:5e3});if(bytes!==void 0)return bytes.toString("utf8")||null}}try{return await getNativeClipboard()?.getText()||null}catch{return null}}async function readClipboardFilePaths(){let paths=await getNativeClipboard()?.getFilePaths?.();return paths?.length?paths:null}async function copyToClipboard(text2){let p=platform3(),env=process.env,copied=!1;if(p!=="linux")try{let clipboard=getNativeClipboard();clipboard?.setText&&(await clipboard.setText(text2),copied=!0)}catch{}if(!copied){let commands=[];p==="darwin"?commands.push(["pbcopy",[]]):p==="win32"?commands.push(["clip",[]]):(env.TERMUX_VERSION&&commands.push(["termux-clipboard-set",[]]),env.WAYLAND_DISPLAY&&commands.push(["wl-copy",[]]),env.DISPLAY&&commands.push(["xclip",["-selection","clipboard"]],["xsel",["--clipboard","--input"]]));for(let[command,args]of commands)if(await runClipboardCommand(command,args,{input:text2,timeoutMs:5e3})!==void 0){copied=!0;break}}let osc52Emitted=!1;!copied&&p==="linux"&&isWSL(env)&&(env.WT_SESSION&&(osc52Emitted=emitOsc52(text2)),copied=osc52Emitted||await copyViaWindowsClipboard(text2));let headless=p==="linux"&&!env.DISPLAY&&!env.WAYLAND_DISPLAY&&!env.TERMUX_VERSION,oversized=!1;if(!osc52Emitted&&(isRemoteSession(env)||!copied&&headless)&&(emitOsc52(text2)?copied=!0:oversized=!0),!copied){if(oversized)throw new Error("Clipboard unavailable: text exceeds the OSC 52 size limit");if(p==="linux"){if(env.TERMUX_VERSION)throw new Error("Clipboard unavailable: install the Termux:API app and `termux-api` package");if(env.WAYLAND_DISPLAY)throw new Error("Clipboard unavailable: install `wl-clipboard` (`wl-copy`) or check Wayland access");if(env.DISPLAY)throw new Error("Clipboard unavailable: install `xclip` or `xsel`, or check X11 access")}throw new Error("Clipboard unavailable")}}import{isAbsolute as isAbsolute19,resolve as resolve32}from"node:path";var STATUS_TO_MARKER={pending:" ",in_progress:"/",completed:"x",abandoned:"-"},MARKER_TO_STATUS={" ":"pending","":"pending",x:"completed",X:"completed","/":"in_progress",">":"in_progress","-":"abandoned","~":"abandoned"},DEFAULT_TODO_MARKDOWN_FILE="TODO.md";function resolveTodoMarkdownPath(input,cwd){let raw=input.trim().replace(/^["']|["']$/g,"")||DEFAULT_TODO_MARKDOWN_FILE;return isAbsolute19(raw)?raw:resolve32(cwd,raw)}function phasesToMarkdown(phases){if(phases.length===0)return`# ${DEFAULT_INIT_PHASE}
2207
2207
  `;let out=[];for(let index=0;index<phases.length;index+=1){index>0&&out.push(""),out.push(`# ${phases[index].name}`);for(let task of phases[index].tasks)out.push(`- [${STATUS_TO_MARKER[task.status]}] ${task.content}`)}return`${out.join(`
2208
2208
  `)}
2209
2209
  `}function markdownToPhases(markdown){let errors=[],phases=[],currentPhase,lines=markdown.split(/\r?\n/);for(let lineNumber=0;lineNumber<lines.length;lineNumber+=1){let trimmed=lines[lineNumber].trim();if(!trimmed)continue;let headingMatch=/^#{1,6}\s+(.+?)\s*$/.exec(trimmed);if(headingMatch){currentPhase={name:headingMatch[1].trim(),tasks:[]},phases.push(currentPhase);continue}let taskMatch=/^[-*+]\s*\[(.?)\]\s+(.+?)\s*$/.exec(trimmed);if(taskMatch){currentPhase||(currentPhase={name:DEFAULT_INIT_PHASE,tasks:[]},phases.push(currentPhase));let status=MARKER_TO_STATUS[taskMatch[1]];if(!status){errors.push(`Line ${lineNumber+1}: unknown status marker "[${taskMatch[1]}]" (use [ ], [x], [/], [-])`);continue}currentPhase.tasks.push({content:taskMatch[2].trim(),status});continue}errors.push(`Line ${lineNumber+1}: unrecognized syntax "${trimmed}"`)}return normalizeInProgressTask(phases),{phases,errors}}var USAGE4=["Usage: /todo <verb> [args]"," /todo Show current todos"," /todo edit Edit todos as Markdown in an overlay"," /todo copy Copy todos as Markdown to clipboard"," /todo export [<path>] Write todos to file (default: TODO.md)"," /todo import [<path>] Replace todos from file (default: TODO.md)"," /todo append [<phase>] <task...> Append a task; phase fuzzy-matched or created"," /todo start <task> Mark task in_progress (fuzzy match)"," /todo done [<task|phase>] Mark task/phase/all completed"," /todo drop [<task|phase>] Mark task/phase/all abandoned"," /todo rm [<task|phase>] Remove task/phase/all"].join(`
@@ -2288,7 +2288,7 @@ ${TASK_MANAGEMENT_SECTION}`;if(event.preview)return{systemPrompt};let branchEntr
2288
2288
  `);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(join60(current,SENPI_DIR_NAME)))return current;let parent=dirname36(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=join60(dir,fileName),name=fileName.slice(0,fileName.length-MARKDOWN_EXTENSION.length),markdown;try{markdown=readFileSync33(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??homedir9(),globalDir=join60(resolvedHome,SENPI_DIR_NAME,TTSR_DIR_NAME),projectRoot2=findProjectRootSync(cwd,resolvedHome),projectDir=join60(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 matches=[];for(let[name,entry]of this.#rules)this.#canTrigger(name)&&this.#matchesScope(entry,context)&&this.#matchesGlobalPaths(entry,context)&&this.#matchesCondition(entry,buffer)&&matches.push(entry.rule);return matches}markInjected(rulesToMark){this.markInjectedByNames(rulesToMark.map(rule=>rule.name))}markInjectedByNames(ruleNames){for(let rawName of ruleNames){let ruleName=rawName.trim();ruleName.length!==0&&this.#injectionRecords.set(ruleName,{lastInjectedAt:this.#messageCount})}}getInjectedRuleNames(){return Array.from(this.#injectionRecords.keys())}restoreInjected(ruleNames){for(let name of ruleNames)this.#injectionRecords.set(name,{lastInjectedAt:0})}resetBuffers(){this.#buffers.clear()}hasRules(){return this.#settings.enabled?this.#rules.size>0:!1}getRules(){return Array.from(this.#rules.values(),entry=>entry.rule)}incrementMessageCount(){this.#messageCount+=1}getMessageCount(){return this.#messageCount}getSettings(){return this.#settings}};function assertNever2(value2){throw new Error(`unexpected assistant message event: ${String(value2)}`)}function getTtsrStreamDelta(event){let deltaEvent=event.assistantMessageEvent;switch(deltaEvent.type){case"text_delta":return{source:"text",streamKey:`text:${String(deltaEvent.contentIndex)}`,delta:deltaEvent.delta};case"thinking_delta":return{source:"thinking",streamKey:`thinking:${String(deltaEvent.contentIndex)}`,delta:deltaEvent.delta};case"toolcall_delta":{let block=deltaEvent.partial.content[deltaEvent.contentIndex];return{source:"tool",streamKey:`tool:${String(deltaEvent.contentIndex)}`,delta:deltaEvent.delta,toolName:block?.type==="toolCall"?block.name:void 0}}case"start":case"text_start":case"text_end":case"thinking_start":case"thinking_end":case"toolcall_start":case"toolcall_end":case"done":case"error":return null;default:return assertNever2(deltaEvent)}}var TRUNCATION_MARKER="[output interrupted by stream rule]",TRANSPORT_TIMEOUT_ERROR_PATTERN=/^Request timed out\.?$/i;function streamBlockText(block,kind){if(kind==="tool"||typeof block!="object"||block===null||!("type"in block)||block.type!==kind)return;let value2=Reflect.get(block,kind);return typeof value2=="string"?value2:void 0}function replaceStreamBlockText(block,kind,text2){return kind==="text"&&block.type==="text"?{...block,text:text2}:kind==="thinking"&&block.type==="thinking"?{...block,thinking:text2}:block}function buildTruncateReplacement(message,garbageStartOffset,streamKind){if(streamKind==="tool"){let content2=message.content.filter(block=>typeof block!="object"||block===null||!("type"in block)?!0:block.type!=="toolCall");return{...message,content:[...content2,{type:"text",text:TRUNCATION_MARKER}],stopReason:message.stopReason==="toolUse"?"aborted":message.stopReason}}let remaining=Math.max(0,garbageStartOffset),truncated=!1,content=[];for(let block of message.content){let text2=streamBlockText(block,streamKind);if(!(truncated&&text2!==void 0)){if(text2===void 0||remaining>text2.length){content.push(block),text2!==void 0&&(remaining-=text2.length);continue}content.push(replaceStreamBlockText(block,streamKind,text2.slice(0,remaining))),truncated=!0}}content.push({type:"text",text:TRUNCATION_MARKER});let result3={...message,content};return result3.errorMessage!==void 0&&TRANSPORT_TIMEOUT_ERROR_PATTERN.test(result3.errorMessage)&&delete result3.errorMessage,result3}function buildErrorShellReplacement(){return{role:"assistant",content:[],stopReason:"error",errorMessage:LEAK_ERROR_MESSAGE}}function buildNudgeMessage(ruleName,ruleContent){return{customType:TTSR_INJECTION_CUSTOM_TYPE,content:renderSystemInterrupt(ruleName,ruleContent),display:!1,details:{rules:[ruleName]}}}function collectAssistantText(message){if(!Array.isArray(message.content))return null;let combined="";for(let block of message.content){if(typeof block!="object"||block===null||!("type"in block)||block.type!=="text")continue;let value2=Reflect.get(block,"text");typeof value2=="string"&&(combined+=value2)}return combined.length>0?combined:null}var RESTORED_TURN_LIMIT=8;function readPersistedAssistantTexts(ctx){let texts=[];for(let entry of ctx.sessionManager.getEntries()){if(typeof entry!="object"||entry===null||!("type"in entry)||entry.type!=="message")continue;let message=Reflect.get(entry,"message");if(typeof message!="object"||message===null||Reflect.get(message,"role")!=="assistant")continue;let text2=collectAssistantText({content:Reflect.get(message,"content")});text2!==null&&texts.push(text2)}return texts.slice(-RESTORED_TURN_LIMIT)}var RepetitiveTurnsLane=class{#state=createRepetitiveTurnsState();#armed=!1;#recovering=!1;#currentTurnText="";#lastCompletedTurnText=null;#enabled=!0;configure(disabledRules){this.#enabled=!disabledRules.has(REPETITIVE_TURNS_RULE_NAME)}resetSession(){this.#state=createRepetitiveTurnsState(),this.#armed=!1,this.#recovering=!1,this.#currentTurnText="",this.#lastCompletedTurnText=null}restoreFromHistory(assistantTexts){for(let text2 of assistantTexts)this.recordCompletedTurn(text2);this.#armed=!1}resetTurn(){this.#armed=!1,this.#currentTurnText=""}disarm(){this.#armed=!1}get armed(){return this.#armed}observeTextDelta(delta,canArm){if(this.#enabled&&!this.#armed&&!this.#recovering&&canArm&&this.#lastCompletedTurnText!==null){let candidate=normalizeTurnText(this.#currentTurnText+delta);candidate.length>=40&&isNearDuplicateOfPreviousTurn(candidate,this.#lastCompletedTurnText)&&(this.#armed=!0)}return this.#currentTurnText+=delta,this.#armed}commitArmedTurn(turnText){this.#armed=!1,this.#recovering=!0,turnText!==null&&(this.#lastCompletedTurnText=normalizeTurnText(turnText))}recordCompletedTurn(turnText){let normalized2=normalizeTurnText(turnText);if(this.#lastCompletedTurnText=normalized2,!this.#enabled)return;if(recordTurnText(this.#state,turnText)===null){this.#recovering&&(this.#recovering=!1);return}this.#armed=!0}};function buildStreamRemediation(pending,message){return pending.resolution.remediation.corruptionScope==="generation"?{replacement:buildErrorShellReplacement(),nudge:null,owner:pending.resolution.owner,observedRules:pending.resolution.observedRules,retryMode:"provider-error"}:{replacement:buildTruncateReplacement(message,pending.resolution.match.garbageStartOffset,pending.streamKind),nudge:buildNudgeMessage(pending.resolution.owner,COLLAPSE_RULE_CONTENT),owner:pending.resolution.owner,observedRules:pending.resolution.observedRules,retryMode:"nudge"}}function isHighSurrogate(code){return code>=55296&&code<=56319}function isLowSurrogate(code){return code>=56320&&code<=57343}var ScalarScanner=class{#offset=0;#pendingHigh;push(delta){let entries=[],input=delta;this.#pendingHigh!==void 0&&(input=this.#pendingHigh+delta,this.#offset-=1,this.#pendingHigh=void 0);let i=0;for(;i<input.length;){let code=input.charCodeAt(i);if(isHighSurrogate(code)){if(i+1>=input.length){this.#pendingHigh=input[i],this.#offset+=1;break}let next=input.charCodeAt(i+1);if(isLowSurrogate(next)){entries.push({value:input.slice(i,i+2),startOffset:this.#offset,width:2}),this.#offset+=2,i+=2;continue}}entries.push({value:input.slice(i,i+1),startOffset:this.#offset,width:1}),this.#offset+=1,i+=1}return entries}hasPendingSurrogate(){return this.#pendingHigh!==void 0}get offset(){return this.#offset}},FixedRing=class{#capacity;#entries=[];constructor(capacity){this.#capacity=capacity}push(entry){this.#entries.push(entry),this.#entries.length>this.#capacity&&this.#entries.shift()}getBack(offset){return this.#entries[this.#entries.length-1-offset]}get size(){return this.#entries.length}toArray(){return[...this.#entries]}clear(){this.#entries=[]}};function isAsciiWhitespace(code){return code===32||code>=9&&code<=13}var CharCode={Tab:9,LineFeed:10,VerticalTab:11,FormFeed:12,CarriageReturn:13,Space:32,LessThan:60,LeftBracket:91,Backslash:92,RightBracket:93,Underscore:95,Pipe:124};var CJK_SCALAR_RUN_THRESHOLD=224,PUNCTUATION_RUN_THRESHOLD=256,RUN_WHITESPACE_MAX_CHARS=32,RUN_WHITESPACE_TARGET_RATIO=8,NEWLINE_FLOOD_MIN_CHARS=320,NEWLINE_FLOOD_MIN_NEWLINES=8,GENERIC_FLOOD_MIN_CHARS=480,ASCII_PRINTABLE_MAX=126,ASCII_END=127,BOX_DRAWING_START=9472,BLOCK_ELEMENT_END=9631,NON_DECORATIVE_ASCII_PUNCT=new Set([33,36,37,38,63,64]);function codePointOf(entry){return entry.value.codePointAt(0)??0}function isAsciiAlphanumeric(code){return code>=48&&code<=57||code>=65&&code<=90||code>=97&&code<=122}function isBoxDrawing(code){return code>=BOX_DRAWING_START&&code<=BLOCK_ELEMENT_END}function isDecorativeScalar(code){return code<=ASCII_END?code>CharCode.Space&&code<=ASCII_PRINTABLE_MAX&&!isAsciiAlphanumeric(code)&&!NON_DECORATIVE_ASCII_PUNCT.has(code):isBoxDrawing(code)}function runThresholdFor(entry){let code=codePointOf(entry);return code>ASCII_END?isBoxDrawing(code)?0:CJK_SCALAR_RUN_THRESHOLD:NON_DECORATIVE_ASCII_PUNCT.has(code)?PUNCTUATION_RUN_THRESHOLD:0}function createDominantRunState(){return{active:!1,target:"",targetWidth:0,threshold:0,count:0,whitespaceUsed:0,startOffset:0}}function updateDominantRun(state,entry){let code=codePointOf(entry);if(isAsciiWhitespace(code)){if(!state.active)return null;let nextWhitespace=state.whitespaceUsed+1;return nextWhitespace>RUN_WHITESPACE_MAX_CHARS||nextWhitespace*RUN_WHITESPACE_TARGET_RATIO>state.count?(state.active=!1,null):(state.whitespaceUsed=nextWhitespace,null)}let threshold=runThresholdFor(entry);return threshold===0?(state.active=!1,null):!state.active||state.target!==entry.value?(state.active=!0,state.target=entry.value,state.targetWidth=entry.width,state.threshold=threshold,state.count=1,state.whitespaceUsed=0,state.startOffset=entry.startOffset,null):(state.count+=1,state.count<state.threshold?null:{rule:"collapse-repetition",reason:`dominant scalar run U+${code.toString(16)} repeated ${state.count} times`,anomalyStartOffset:state.startOffset,garbageStartOffset:state.startOffset+state.targetWidth,detail:{mechanism:"dominant-scalar-run",codePoint:code,count:state.count,threshold:state.threshold}})}function createWhitespaceFloodState(){return{count:0,newlines:0,startOffset:0}}function updateWhitespaceFlood(state,entry){let code=codePointOf(entry);if(!isAsciiWhitespace(code))return state.count=0,state.newlines=0,null;state.count===0&&(state.startOffset=entry.startOffset),state.count+=1,code===CharCode.LineFeed&&(state.newlines+=1);let newlineFlood=state.count>=NEWLINE_FLOOD_MIN_CHARS&&state.newlines>=NEWLINE_FLOOD_MIN_NEWLINES,genericFlood=state.count>=GENERIC_FLOOD_MIN_CHARS;return!newlineFlood&&!genericFlood?null:{rule:"collapse-repetition",reason:`whitespace flood of ${state.count} characters with ${state.newlines} newlines`,anomalyStartOffset:state.startOffset,garbageStartOffset:state.startOffset+1,detail:{mechanism:"whitespace-flood",whitespaceChars:state.count,newlines:state.newlines}}}var LINE_RING_CAPACITY=16,LINE_PERIOD_MAX=4,LINE_CYCLE_MIN_CYCLES=6,LINE_MIN_REPEATED_CHARS=384,LINE_TEXT_RETENTION_MAX=512,SAMPLE_LENGTH=80,HASH_A_OFFSET=2166136261,HASH_A_PRIME=16777619,HASH_B_OFFSET=5381,HASH_B_MULTIPLIER=31;function createLineCycleState(){return{ring:new FixedRing(LINE_RING_CAPACITY),matched:new Array(LINE_PERIOD_MAX+1).fill(0),repeatedChars:new Array(LINE_PERIOD_MAX+1).fill(0),blockStart:new Array(LINE_PERIOD_MAX+1).fill(0),cycleWidth:new Array(LINE_PERIOD_MAX+1).fill(0),hashA:HASH_A_OFFSET,hashB:HASH_B_OFFSET,length:0,startOffset:0,hasContent:!1,retained:"",retaining:!0}}function measureCycleWidth(ring,period){let width=0;for(let back=1;back<=period;back++){let line=ring.getBack(back);if(line===void 0)break;width+=line.utf16Length+1}return width}function measureBlockChars(ring,period){let chars=0;for(let back=0;back<=period;back++){let line=ring.getBack(back);if(line===void 0)break;chars+=line.utf16Length}return chars}function updateLineCycles(state,entry){if(entry.value.charCodeAt(0)===CharCode.LineFeed)return completeLine(state,entry);for(let i=0;i<entry.value.length;i++){let code=entry.value.charCodeAt(i);state.hashA=Math.imul(state.hashA^code,HASH_A_PRIME),state.hashB=Math.imul(state.hashB,HASH_B_MULTIPLIER)+code|0}let codePoint=entry.value.codePointAt(0)??0;return!state.hasContent&&!isAsciiWhitespace(codePoint)&&!isDecorativeScalar(codePoint)&&(state.hasContent=!0),state.length+=entry.width,state.retaining&&(state.retained+=entry.value,state.retained.length>LINE_TEXT_RETENTION_MAX&&(state.retaining=!1,state.retained="")),null}function completeLine(state,entry){let line={hashA:state.hashA,hashB:state.hashB,utf16Length:state.length,startOffset:state.startOffset,eligible:state.hasContent,text:state.retaining?state.retained:void 0};state.ring.push(line),state.hashA=HASH_A_OFFSET,state.hashB=HASH_B_OFFSET,state.length=0,state.startOffset=entry.startOffset+1,state.hasContent=!1,state.retained="",state.retaining=!0;for(let period=1;period<=LINE_PERIOD_MAX;period++){let back=state.ring.getBack(period);if(back===void 0||!back.eligible||!line.eligible||back.utf16Length!==line.utf16Length||back.hashA!==line.hashA||back.hashB!==line.hashB){state.matched[period]=0,state.repeatedChars[period]=0;continue}if(state.matched[period]===0?(state.blockStart[period]=back.startOffset,state.cycleWidth[period]=measureCycleWidth(state.ring,period),state.repeatedChars[period]=measureBlockChars(state.ring,period),state.matched[period]=1):(state.matched[period]+=1,state.repeatedChars[period]+=line.utf16Length),state.matched[period]<(LINE_CYCLE_MIN_CYCLES-1)*period||state.repeatedChars[period]<LINE_MIN_REPEATED_CHARS)continue;let cycles=Math.floor(state.matched[period]/period)+1;return{rule:"collapse-repetition",reason:`line cycle with period ${period} over ${cycles} cycles (${state.repeatedChars[period]} repeated chars)`,anomalyStartOffset:state.blockStart[period],garbageStartOffset:state.blockStart[period]+state.cycleWidth[period],detail:{mechanism:"line-cycle",period,cycles,repeatedChars:state.repeatedChars[period],sample:(line.text??"").slice(0,SAMPLE_LENGTH)}}}return null}var NEAR_DUPLICATE_MIN_CHARS=64,NEAR_DUPLICATE_MIN_WORD_CHARS=24,NEAR_DUPLICATE_SIMILARITY=.5,NEAR_DUPLICATE_LOOKBACK=32,NEAR_DUPLICATE_WINDOW=12,NEAR_DUPLICATE_ECHO_THRESHOLD=8,NEAR_DUPLICATE_TEXT_RETENTION_MAX=512,SAMPLE_LENGTH2=80,WORD_PATTERN2=/[\p{L}\p{N}#]+/gu,FENCE_PATTERN=/^(?:```|~~~)/;function createNearDuplicateState(){return{history:new FixedRing(NEAR_DUPLICATE_LOOKBACK),window:new FixedRing(NEAR_DUPLICATE_WINDOW),lineLength:0,lineWordChars:0,lineHasContent:!1,lineStartOffset:0,lineText:"",length:0,wordChars:0,startOffset:0,retained:"",fenced:!1,insideFence:!1}}function tokenize3(text2){return new Set(normalizeTurnText(text2).match(WORD_PATTERN2)??[])}function jaccard(a,b){if(a.size===0||b.size===0)return 0;let intersection=0;for(let token of a)b.has(token)&&(intersection+=1);return intersection/(a.size+b.size-intersection)}function resetParagraph(state){state.length=0,state.wordChars=0,state.startOffset=0,state.retained="",state.fenced=!1}function countEchoes(state){let echoes=0;for(let back=state.window.size-1;back>=0;back--)state.window.getBack(back)?.echoed===!0&&(echoes+=1);return echoes}function oldestEcho(state){for(let back=state.window.size-1;back>=0;back--){let entry=state.window.getBack(back);if(entry?.echoed===!0)return entry}}function completeParagraph(state){let eligible=!state.fenced&&state.length>=NEAR_DUPLICATE_MIN_CHARS&&state.wordChars>=NEAR_DUPLICATE_MIN_WORD_CHARS,text2=state.retained,startOffset=state.startOffset;if(resetParagraph(state),!eligible)return null;let tokens=tokenize3(text2);if(tokens.size===0)return null;let best=0,anchor;for(let back=0;back<state.history.size;back++){let previous=state.history.getBack(back);if(previous===void 0)continue;let similarity=jaccard(tokens,previous.tokens);similarity>best&&(best=similarity,anchor=previous)}let echoed=best>=NEAR_DUPLICATE_SIMILARITY&&anchor!==void 0;state.history.push({tokens,startOffset,sample:text2.slice(0,SAMPLE_LENGTH2)}),state.window.push({echoed,startOffset,anchorStartOffset:echoed&&anchor!==void 0?anchor.startOffset:startOffset});let echoes=countEchoes(state);if(echoes<NEAR_DUPLICATE_ECHO_THRESHOLD)return null;let first=oldestEcho(state);return first===void 0?null:{rule:"collapse-repetition",reason:`${echoes} of the last ${state.window.size} paragraphs restate an earlier paragraph of the same message`,anomalyStartOffset:first.anchorStartOffset,garbageStartOffset:first.startOffset,detail:{mechanism:"near-duplicate-paragraphs",echoes,window:state.window.size,similarity:Number(best.toFixed(3)),sample:anchor?.sample??""}}}function foldLine(state){state.length===0&&(state.startOffset=state.lineStartOffset),state.length+=state.lineLength+1,state.wordChars+=state.lineWordChars,(state.insideFence||FENCE_PATTERN.test(state.lineText.trimStart()))&&(state.fenced=!0),state.retained.length<NEAR_DUPLICATE_TEXT_RETENTION_MAX&&(state.retained+=`${state.lineText}
2289
2289
  `),FENCE_PATTERN.test(state.lineText.trimStart())&&(state.insideFence=!state.insideFence)}function resetLine(state,startOffset){state.lineLength=0,state.lineWordChars=0,state.lineHasContent=!1,state.lineStartOffset=startOffset,state.lineText=""}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),(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}
2290
2290
  `)):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=`
2291
- `,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 basename17,extname as extname3,isAbsolute as isAbsolute19,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=isAbsolute19(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 "${basename17(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(`
2291
+ `,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 basename17,extname as extname3,isAbsolute as isAbsolute20,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=isAbsolute20(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 "${basename17(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(`
2292
2292
  `),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(`
2293
2293
  `),0,0)}function collectLines(text2,limit){let lines=[],start=0;for(;lines.length<limit&&start<=text2.length;){let newlineIndex=text2.indexOf(`
2294
2294
  `,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(`
@@ -2384,7 +2384,7 @@ ${displayLines.map(line=>theme2.fg("toolOutput",line)).join(`
2384
2384
  ${theme2.fg("warning",`[Truncated: ${warnings.join(", ")}]`)}`}return text2}var lsRenderers={renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatLsCall(args,theme2,context.cwd)),text2},renderResult(result3,options,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(formatLsResult(result3,options,theme2,context.showImages)),text2}};var lsSchema=typebox_exports.Object({path:typebox_exports.Optional(typebox_exports.String({description:"Directory to list (default: current directory)"})),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of entries to return (default: 500)"}))}),lsToolSystemPromptContribution={snippet:"List directory contents",guidelines:[]},DEFAULT_LIMIT3=500,defaultLsOperations={exists:pathExists,stat:fsStat2,readdir:fsReaddir};function createLsToolDefinition(cwd,options){let ops=options?.operations??defaultLsOperations,filesystemPolicy=options?.filesystemPolicy;return{name:"ls",label:"ls",description:`List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT3} entries or ${51200/1024}KB (whichever is hit first).`,promptSnippet:lsToolSystemPromptContribution.snippet,parameters:lsSchema,async execute(_toolCallId,{path:path15,limit},signal,_onUpdate,ctx){return new Promise((resolve46,reject)=>{if(signal?.aborted){reject(new Error("Operation aborted"));return}let onAbort=()=>reject(new Error("Operation aborted"));signal?.addEventListener("abort",onAbort,{once:!0}),(async()=>{try{let dirPath=resolveToCwd(path15||".",ctx?.cwd||cwd),effectiveLimit=limit??DEFAULT_LIMIT3;if(filesystemPolicy){let decision=await filesystemPolicy({operation:"enumerate",canonicalPath:await canonicalizeFilesystemPath(dirPath),toolName:"ls"});if(!decision.allow)throw new Error(decision.reason)}if(!await ops.exists(dirPath)){reject(new Error(`Path not found: ${dirPath}`));return}if(!(await ops.stat(dirPath)).isDirectory()){reject(new Error(`Not a directory: ${dirPath}`));return}let entries;try{entries=await ops.readdir(dirPath)}catch(e){reject(new Error(`Cannot read directory: ${e.message}`));return}entries.sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase()));let results=[],entryLimitReached=!1;for(let entry of entries){if(results.length>=effectiveLimit){entryLimitReached=!0;break}let fullPath=nodePath.join(dirPath,entry),suffix="";try{(await ops.stat(fullPath)).isDirectory()&&(suffix="/")}catch{continue}results.push(entry+suffix)}if(signal?.removeEventListener("abort",onAbort),results.length===0){resolve46({content:[{type:"text",text:"(empty directory)"}],details:void 0});return}let rawOutput=results.join(`
2385
2385
  `),truncation=truncateHead2(rawOutput,{maxLines:Number.MAX_SAFE_INTEGER}),details={},notices=[];entryLimitReached&&(notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit*2} for more`),details.entryLimitReached=effectiveLimit),truncation.truncated&&(notices.push(`${formatSize2(51200)} limit reached`),details.truncation=truncation);let content=[{type:"text",text:truncation.content}];notices.length>0&&(content[0].text+=`
2386
2386
  `,content.push(modelOnlyText(`[${notices.join(". ")}]`))),resolve46({content,details:Object.keys(details).length>0?details:void 0})}catch(e){signal?.removeEventListener("abort",onAbort),reject(e)}})()})},...lsRenderers}}function createLsTool(cwd,options){return wrapToolDefinition(createLsToolDefinition(cwd,options))}var UTF8_OUTPUT_PREFIX=`try { [Console]::OutputEncoding=[System.Text.Encoding]::UTF8 } catch {}
2387
- `,powershellToolSystemPromptContribution={snippet:"Execute PowerShell commands",guidelines:["You can inspect PI_* environment variables for current model and session details."]};function createLocalPowerShellOperations(){let operations=createLocalShellOperations("PowerShell",getPowerShellConfig);return{exec:(command,cwd,options)=>operations.exec(`${UTF8_OUTPUT_PREFIX}${command}`,cwd,options)}}var powershellToolConfig={name:"powershell",label:"powershell",shellName:"PowerShell",prompt:"PS>",promptSnippet:powershellToolSystemPromptContribution.snippet,promptGuidelines:powershellToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-powershell"};function createPowerShellToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,powershellToolConfig,{...options,operations:options?.operations??createLocalPowerShellOperations()}),exposure:"eval"}}function createPowerShellTool(cwd,options){let definition=createPowerShellToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants8}from"fs";import{access as fsAccess3,readFile as fsReadFile3}from"fs/promises";import{open as open7}from"node:fs/promises";var IMAGE_TYPE_SNIFF_BYTES=4100,PNG_SIGNATURE3=[137,80,78,71,13,10,26,10];function detectSupportedImageMimeType2(buffer){return startsWith3(buffer,[255,216,255])?buffer[3]===247?null:"image/jpeg":startsWith3(buffer,PNG_SIGNATURE3)?isPng2(buffer)&&!isAnimatedPng2(buffer)?"image/png":null:startsWithAscii3(buffer,0,"GIF87a")||startsWithAscii3(buffer,0,"GIF89a")?"image/gif":startsWithAscii3(buffer,0,"RIFF")&&startsWithAscii3(buffer,8,"WEBP")?"image/webp":startsWithAscii3(buffer,0,"BM")&&isBmp2(buffer)?"image/bmp":null}async function detectSupportedImageMimeTypeFromFile(filePath){let fileHandle=await open7(filePath,"r");try{let buffer=Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES),{bytesRead}=await fileHandle.read(buffer,0,IMAGE_TYPE_SNIFF_BYTES,0);return detectSupportedImageMimeType2(buffer.subarray(0,bytesRead))}finally{await fileHandle.close()}}function isPng2(buffer){return buffer.length>=16&&readUint32BE2(buffer,PNG_SIGNATURE3.length)===13&&startsWithAscii3(buffer,12,"IHDR")}function isAnimatedPng2(buffer){let offset=PNG_SIGNATURE3.length;for(;offset+8<=buffer.length;){let chunkLength=readUint32BE2(buffer,offset),chunkTypeOffset=offset+4;if(startsWithAscii3(buffer,chunkTypeOffset,"acTL"))return!0;if(startsWithAscii3(buffer,chunkTypeOffset,"IDAT"))return!1;let nextOffset=offset+8+chunkLength+4;if(nextOffset<=offset||nextOffset>buffer.length)return!1;offset=nextOffset}return!1}function isBmp2(buffer){if(buffer.length<26)return!1;let declaredFileSize=readUint32LE2(buffer,2),pixelDataOffset=readUint32LE2(buffer,10),dibHeaderSize=readUint32LE2(buffer,14);if(declaredFileSize!==0&&declaredFileSize<26||pixelDataOffset<14+dibHeaderSize||declaredFileSize!==0&&pixelDataOffset>=declaredFileSize)return!1;let colorPlanes,bitsPerPixel;if(dibHeaderSize===12)colorPlanes=readUint16LE2(buffer,22),bitsPerPixel=readUint16LE2(buffer,24);else if(dibHeaderSize>=40&&dibHeaderSize<=124){if(buffer.length<30)return!1;colorPlanes=readUint16LE2(buffer,26),bitsPerPixel=readUint16LE2(buffer,28)}else return!1;return colorPlanes===1&&[1,4,8,16,24,32].includes(bitsPerPixel)}function readUint16LE2(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)}function readUint32BE2(buffer,offset){return(buffer[offset]??0)*16777216+((buffer[offset+1]??0)<<16)+((buffer[offset+2]??0)<<8)+(buffer[offset+3]??0)}function readUint32LE2(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)+((buffer[offset+2]??0)<<16)+(buffer[offset+3]??0)*16777216}function startsWith3(buffer,bytes){return buffer.length<bytes.length?!1:bytes.every((byte,index)=>buffer[index]===byte)}function startsWithAscii3(buffer,offset,text2){if(buffer.length<offset+text2.length)return!1;for(let index=0;index<text2.length;index++)if(buffer[offset+index]!==text2.charCodeAt(index))return!1;return!0}import{basename as basename22,dirname as dirname42,isAbsolute as isAbsolute21,relative as relative18,resolve as resolvePath4,sep as sep16}from"node:path";var classifiers=[];function registerReadClassifier(classifier){let entry={classifier};return classifiers.push(entry),()=>{let index=classifiers.indexOf(entry);index!==-1&&classifiers.splice(index,1)}}function classifyRead(input){for(let{classifier}of classifiers)try{let classification=classifier(input);if(classification!==void 0)return classification}catch(error2){console.warn("Read classifier failed:",error2)}}import{existsSync as existsSync33}from"node:fs";import{homedir as homedir12}from"node:os";import{basename as basename21,dirname as dirname41,isAbsolute as isAbsolute20,join as join67,relative as relative17,resolve as resolvePath3,sep as sep15}from"node:path";var skillRootByDirectory=new Map,SKILL_ROOT_CACHE_LIMIT=2048;function isSameOrInside(parent,child){let path15=relative17(parent,child);return path15===""||path15!==".."&&!path15.startsWith(`..${sep15}`)&&!isAbsolute20(path15)}function findSkillRoot(absolutePath,cwd){let home=homedir12(),visited=[],skillRoot=null;for(let directory=dirname41(absolutePath);;directory=dirname41(directory)){let key=`${cwd}\0${directory}`,cached=skillRootByDirectory.get(key);if(cached!==void 0){skillRoot=cached;break}if(directory===dirname41(directory)||directory===home||isSameOrInside(directory,cwd))break;if(visited.push(key),existsSync33(join67(directory,"SKILL.md"))){skillRoot=directory;break}}skillRootByDirectory.size+visited.length>SKILL_ROOT_CACHE_LIMIT&&skillRootByDirectory.clear();for(let key of visited)skillRootByDirectory.set(key,skillRoot);return skillRoot??void 0}function getSkillReadPath(absolutePath,cwd){let skillRoot=findSkillRoot(resolvePath3(absolutePath),resolvePath3(cwd));if(skillRoot!==void 0)return[basename21(skillRoot),...relative17(skillRoot,absolutePath).split(sep15)].join("/")}var COMPACT_RESOURCE_FILE_NAMES=new Set(["AGENTS.override.md","AGENTS.md","AGENTS.MD","CLAUDE.md","CLAUDE.MD"]);function formatReadLineRange(args,theme2){if(args?.offset==null&&args?.limit==null)return"";let startLine=args.offset??1,endLine=args.limit!=null?startLine+args.limit-1:"";return theme2.fg("warning",`:${startLine}${endLine?`-${endLine}`:""}`)}function formatReadCall(args,theme2,cwd){let rawPath=str2(args?.file_path??args?.path),skillPath=rawPath?getSkillReadPath(resolveToCwd(rawPath,cwd),cwd):void 0,pathDisplay=rawPath&&skillPath?linkPath(theme2.fg("accent",skillPath),rawPath,cwd):renderToolPath(rawPath,theme2,cwd);return`${theme2.fg("toolTitle",theme2.bold("read"))} ${pathDisplay}${formatReadLineRange(args,theme2)}`}function trimTrailingEmptyLines(lines){let end=lines.length;for(;end>0&&lines[end-1]==="";)end--;return lines.slice(0,end)}function toPosixPath3(filePath){return filePath.split(sep16).join("/")}function getPiDocsClassification(absolutePath){let packageRoot=dirname42(getReadmePath()),relativePath=relative18(resolvePath4(packageRoot),resolvePath4(absolutePath));if(relativePath===""||relativePath===".."||relativePath.startsWith(`..${sep16}`)||isAbsolute21(relativePath))return;let label3=toPosixPath3(relativePath);if(label3==="README.md"||label3.startsWith("docs/")||label3.startsWith("examples/"))return{kind:"docs",label:label3}}function getCompactReadClassification(args,cwd){let rawPath=str2(args?.file_path??args?.path);if(!rawPath)return;let absolutePath=resolveToCwd(rawPath,cwd),fileName=basename22(absolutePath);if(fileName==="SKILL.md")return{kind:"skill",label:basename22(dirname42(absolutePath))||fileName};let registeredClassification=classifyRead({absolutePath,cwd});if(registeredClassification)return registeredClassification;let docsClassification=getPiDocsClassification(absolutePath);if(docsClassification)return docsClassification;if(COMPACT_RESOURCE_FILE_NAMES.has(fileName))return{kind:"resource",label:formatPathRelativeToCwdOrAbsolute(absolutePath,cwd)}}function formatCompactReadCall(classification,args,theme2){let expandHint=theme2.fg("dim",` (${keyText("app.tools.expand")} to expand)`);return classification.kind==="skill"?theme2.fg("customMessageLabel","\x1B[1m[skill]\x1B[22m ")+theme2.fg("customMessageText",classification.label)+formatReadLineRange(args,theme2)+expandHint:classification.kind==="memory"?theme2.fg("accent",`\x1B[1m\u2726 ${classification.headline??"Recalled"}\x1B[22m`)+" "+theme2.fg("customMessageText",classification.label)+formatReadLineRange(args,theme2)+expandHint:theme2.fg("toolTitle",theme2.bold(`read ${classification.kind}`))+" "+theme2.fg("accent",classification.label)+formatReadLineRange(args,theme2)+expandHint}function formatReadResult(args,result3,options,theme2,showImages,_cwd,isError){if(!options.expanded&&!isError)return"";let rawPath=str2(args?.file_path??args?.path),output=getTextOutput(result3,showImages),lang=!isError&&rawPath?getLanguageFromPath(rawPath):void 0,renderedLines=lang?highlightCode(replaceTabs2(output),lang):output.split(`
2387
+ `,powershellToolSystemPromptContribution={snippet:"Execute PowerShell commands",guidelines:["You can inspect PI_* environment variables for current model and session details."]};function createLocalPowerShellOperations(){let operations=createLocalShellOperations("PowerShell",getPowerShellConfig);return{exec:(command,cwd,options)=>operations.exec(`${UTF8_OUTPUT_PREFIX}${command}`,cwd,options)}}var powershellToolConfig={name:"powershell",label:"powershell",shellName:"PowerShell",prompt:"PS>",promptSnippet:powershellToolSystemPromptContribution.snippet,promptGuidelines:powershellToolSystemPromptContribution.guidelines,tempFilePrefix:"pi-powershell"};function createPowerShellToolDefinition(cwd,options){return{...createShellToolDefinition(cwd,powershellToolConfig,{...options,operations:options?.operations??createLocalPowerShellOperations()}),exposure:"eval"}}function createPowerShellTool(cwd,options){let definition=createPowerShellToolDefinition(cwd,options),tool=wrapToolDefinition(definition);return Object.assign(tool,{promptSnippet:definition.promptSnippet,promptGuidelines:definition.promptGuidelines}),tool}import{constants as constants8}from"fs";import{access as fsAccess3,readFile as fsReadFile3}from"fs/promises";import{open as open7}from"node:fs/promises";var IMAGE_TYPE_SNIFF_BYTES=4100,PNG_SIGNATURE3=[137,80,78,71,13,10,26,10];function detectSupportedImageMimeType2(buffer){return startsWith3(buffer,[255,216,255])?buffer[3]===247?null:"image/jpeg":startsWith3(buffer,PNG_SIGNATURE3)?isPng2(buffer)&&!isAnimatedPng2(buffer)?"image/png":null:startsWithAscii3(buffer,0,"GIF87a")||startsWithAscii3(buffer,0,"GIF89a")?"image/gif":startsWithAscii3(buffer,0,"RIFF")&&startsWithAscii3(buffer,8,"WEBP")?"image/webp":startsWithAscii3(buffer,0,"BM")&&isBmp2(buffer)?"image/bmp":null}async function detectSupportedImageMimeTypeFromFile(filePath){let fileHandle=await open7(filePath,"r");try{let buffer=Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES),{bytesRead}=await fileHandle.read(buffer,0,IMAGE_TYPE_SNIFF_BYTES,0);return detectSupportedImageMimeType2(buffer.subarray(0,bytesRead))}finally{await fileHandle.close()}}function isPng2(buffer){return buffer.length>=16&&readUint32BE2(buffer,PNG_SIGNATURE3.length)===13&&startsWithAscii3(buffer,12,"IHDR")}function isAnimatedPng2(buffer){let offset=PNG_SIGNATURE3.length;for(;offset+8<=buffer.length;){let chunkLength=readUint32BE2(buffer,offset),chunkTypeOffset=offset+4;if(startsWithAscii3(buffer,chunkTypeOffset,"acTL"))return!0;if(startsWithAscii3(buffer,chunkTypeOffset,"IDAT"))return!1;let nextOffset=offset+8+chunkLength+4;if(nextOffset<=offset||nextOffset>buffer.length)return!1;offset=nextOffset}return!1}function isBmp2(buffer){if(buffer.length<26)return!1;let declaredFileSize=readUint32LE2(buffer,2),pixelDataOffset=readUint32LE2(buffer,10),dibHeaderSize=readUint32LE2(buffer,14);if(declaredFileSize!==0&&declaredFileSize<26||pixelDataOffset<14+dibHeaderSize||declaredFileSize!==0&&pixelDataOffset>=declaredFileSize)return!1;let colorPlanes,bitsPerPixel;if(dibHeaderSize===12)colorPlanes=readUint16LE2(buffer,22),bitsPerPixel=readUint16LE2(buffer,24);else if(dibHeaderSize>=40&&dibHeaderSize<=124){if(buffer.length<30)return!1;colorPlanes=readUint16LE2(buffer,26),bitsPerPixel=readUint16LE2(buffer,28)}else return!1;return colorPlanes===1&&[1,4,8,16,24,32].includes(bitsPerPixel)}function readUint16LE2(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)}function readUint32BE2(buffer,offset){return(buffer[offset]??0)*16777216+((buffer[offset+1]??0)<<16)+((buffer[offset+2]??0)<<8)+(buffer[offset+3]??0)}function readUint32LE2(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)+((buffer[offset+2]??0)<<16)+(buffer[offset+3]??0)*16777216}function startsWith3(buffer,bytes){return buffer.length<bytes.length?!1:bytes.every((byte,index)=>buffer[index]===byte)}function startsWithAscii3(buffer,offset,text2){if(buffer.length<offset+text2.length)return!1;for(let index=0;index<text2.length;index++)if(buffer[offset+index]!==text2.charCodeAt(index))return!1;return!0}import{basename as basename22,dirname as dirname42,isAbsolute as isAbsolute22,relative as relative18,resolve as resolvePath4,sep as sep16}from"node:path";var classifiers=[];function registerReadClassifier(classifier){let entry={classifier};return classifiers.push(entry),()=>{let index=classifiers.indexOf(entry);index!==-1&&classifiers.splice(index,1)}}function classifyRead(input){for(let{classifier}of classifiers)try{let classification=classifier(input);if(classification!==void 0)return classification}catch(error2){console.warn("Read classifier failed:",error2)}}import{existsSync as existsSync33}from"node:fs";import{homedir as homedir12}from"node:os";import{basename as basename21,dirname as dirname41,isAbsolute as isAbsolute21,join as join67,relative as relative17,resolve as resolvePath3,sep as sep15}from"node:path";var skillRootByDirectory=new Map,SKILL_ROOT_CACHE_LIMIT=2048;function isSameOrInside(parent,child){let path15=relative17(parent,child);return path15===""||path15!==".."&&!path15.startsWith(`..${sep15}`)&&!isAbsolute21(path15)}function findSkillRoot(absolutePath,cwd){let home=homedir12(),visited=[],skillRoot=null;for(let directory=dirname41(absolutePath);;directory=dirname41(directory)){let key=`${cwd}\0${directory}`,cached=skillRootByDirectory.get(key);if(cached!==void 0){skillRoot=cached;break}if(directory===dirname41(directory)||directory===home||isSameOrInside(directory,cwd))break;if(visited.push(key),existsSync33(join67(directory,"SKILL.md"))){skillRoot=directory;break}}skillRootByDirectory.size+visited.length>SKILL_ROOT_CACHE_LIMIT&&skillRootByDirectory.clear();for(let key of visited)skillRootByDirectory.set(key,skillRoot);return skillRoot??void 0}function getSkillReadPath(absolutePath,cwd){let skillRoot=findSkillRoot(resolvePath3(absolutePath),resolvePath3(cwd));if(skillRoot!==void 0)return[basename21(skillRoot),...relative17(skillRoot,absolutePath).split(sep15)].join("/")}var COMPACT_RESOURCE_FILE_NAMES=new Set(["AGENTS.override.md","AGENTS.md","AGENTS.MD","CLAUDE.md","CLAUDE.MD"]);function formatReadLineRange(args,theme2){if(args?.offset==null&&args?.limit==null)return"";let startLine=args.offset??1,endLine=args.limit!=null?startLine+args.limit-1:"";return theme2.fg("warning",`:${startLine}${endLine?`-${endLine}`:""}`)}function formatReadCall(args,theme2,cwd){let rawPath=str2(args?.file_path??args?.path),skillPath=rawPath?getSkillReadPath(resolveToCwd(rawPath,cwd),cwd):void 0,pathDisplay=rawPath&&skillPath?linkPath(theme2.fg("accent",skillPath),rawPath,cwd):renderToolPath(rawPath,theme2,cwd);return`${theme2.fg("toolTitle",theme2.bold("read"))} ${pathDisplay}${formatReadLineRange(args,theme2)}`}function trimTrailingEmptyLines(lines){let end=lines.length;for(;end>0&&lines[end-1]==="";)end--;return lines.slice(0,end)}function toPosixPath3(filePath){return filePath.split(sep16).join("/")}function getPiDocsClassification(absolutePath){let packageRoot=dirname42(getReadmePath()),relativePath=relative18(resolvePath4(packageRoot),resolvePath4(absolutePath));if(relativePath===""||relativePath===".."||relativePath.startsWith(`..${sep16}`)||isAbsolute22(relativePath))return;let label3=toPosixPath3(relativePath);if(label3==="README.md"||label3.startsWith("docs/")||label3.startsWith("examples/"))return{kind:"docs",label:label3}}function getCompactReadClassification(args,cwd){let rawPath=str2(args?.file_path??args?.path);if(!rawPath)return;let absolutePath=resolveToCwd(rawPath,cwd),fileName=basename22(absolutePath);if(fileName==="SKILL.md")return{kind:"skill",label:basename22(dirname42(absolutePath))||fileName};let registeredClassification=classifyRead({absolutePath,cwd});if(registeredClassification)return registeredClassification;let docsClassification=getPiDocsClassification(absolutePath);if(docsClassification)return docsClassification;if(COMPACT_RESOURCE_FILE_NAMES.has(fileName))return{kind:"resource",label:formatPathRelativeToCwdOrAbsolute(absolutePath,cwd)}}function formatCompactReadCall(classification,args,theme2){let expandHint=theme2.fg("dim",` (${keyText("app.tools.expand")} to expand)`);return classification.kind==="skill"?theme2.fg("customMessageLabel","\x1B[1m[skill]\x1B[22m ")+theme2.fg("customMessageText",classification.label)+formatReadLineRange(args,theme2)+expandHint:classification.kind==="memory"?theme2.fg("accent",`\x1B[1m\u2726 ${classification.headline??"Recalled"}\x1B[22m`)+" "+theme2.fg("customMessageText",classification.label)+formatReadLineRange(args,theme2)+expandHint:theme2.fg("toolTitle",theme2.bold(`read ${classification.kind}`))+" "+theme2.fg("accent",classification.label)+formatReadLineRange(args,theme2)+expandHint}function formatReadResult(args,result3,options,theme2,showImages,_cwd,isError){if(!options.expanded&&!isError)return"";let rawPath=str2(args?.file_path??args?.path),output=getTextOutput(result3,showImages),lang=!isError&&rawPath?getLanguageFromPath(rawPath):void 0,renderedLines=lang?highlightCode(replaceTabs2(output),lang):output.split(`
2388
2388
  `),lines=trimTrailingEmptyLines(renderedLines),maxLines=options.expanded?lines.length:10,displayLines=lines.slice(0,maxLines),remaining=lines.length-maxLines,text2=`
2389
2389
  ${displayLines.map(line=>lang?replaceTabs2(line):theme2.fg("toolOutput",replaceTabs2(line))).join(`
2390
2390
  `)}`;return remaining>0&&(text2+=`${theme2.fg("muted",`
@@ -2419,7 +2419,7 @@ Current working directory: ${issue.fallbackCwd}`}function formatMissingSessionCw
2419
2419
  ${issue.sessionCwd}
2420
2420
 
2421
2421
  continue in current cwd
2422
- ${issue.fallbackCwd}`}var MissingSessionCwdError=class extends Error{constructor(issue){super(formatMissingSessionCwdError(issue)),this.name="MissingSessionCwdError",this.issue=issue}};function assertSessionCwdExists(sessionManager,fallbackCwd){let issue=getMissingSessionCwdIssue(sessionManager,fallbackCwd);if(issue)throw new MissingSessionCwdError(issue)}import{join as join68}from"node:path";async function joinStartupBranches(primary,secondary){let[primaryResult,secondaryResult]=await Promise.allSettled([primary,secondary]);if(primaryResult.status==="rejected")throw primaryResult.reason;if(secondaryResult.status==="rejected")throw secondaryResult.reason;return{primary:primaryResult.value,secondary:secondaryResult.value}}function applyExtensionFlagValues(resourceLoader,extensionFlagValues){if(!extensionFlagValues)return[];let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredFlags=new Map;for(let extension of extensionsResult.extensions)for(let[name,flag]of extension.flags)registeredFlags.has(name)||registeredFlags.set(name,{type:flag.type});let unknownFlags=[];for(let[name,value2]of extensionFlagValues){let flag=registeredFlags.get(name);if(!flag){unknownFlags.push(name);continue}if(flag.type==="boolean"){extensionsResult.runtime.flagValues.set(name,!0);continue}if(typeof value2=="string"){extensionsResult.runtime.flagValues.set(name,value2);continue}diagnostics.push({type:"error",message:`Extension flag "--${name}" requires a value`})}return unknownFlags.length>0&&diagnostics.push({type:"error",message:`Unknown option${unknownFlags.length===1?"":"s"}: ${unknownFlags.map(name=>`--${name}`).join(", ")}`}),diagnostics}async function createAgentSessionServices(options){let cwd=resolvePath(options.cwd),agentDir=options.agentDir?resolvePath(options.agentDir):getAgentDir(),authStorage=AuthStorage.create(join68(agentDir,"auth.json")),runtimePromise=options.modelRuntime!==void 0?Promise.resolve(options.modelRuntime):ModelRuntime.create({credentials:authStorage,authPath:join68(agentDir,"auth.json"),agentDir,modelsPath:join68(agentDir,"models.json"),signal:options.modelRuntimeSignal}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),resourceLoader=new DefaultResourceLoader({...options.resourceLoaderOptions??{},cwd,agentDir,settingsManager,mcpRegistry:options.mcpRegistry}),{primary:modelRuntime}=await joinStartupBranches(runtimePromise,resourceLoader.reload(options.resourceLoaderReloadOptions)),modelRegistry=new ModelRegistry(modelRuntime,authStorage);modelRuntime.setSettingsManager(settingsManager);let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredProviders=new Set;for(let registration of drainPendingProviderRegistrations(extensionsResult.runtime))try{registration.kind==="config"?(modelRuntime.registerProvider(registration.name,registration.config,{refresh:!1}),registeredProviders.add(registration.name)):(modelRuntime.registerNativeProvider(registration.provider,{refresh:!1}),registeredProviders.add(registration.provider.id))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${registration.extensionPath}" error: ${message}`})}options.modelRuntime===void 0?await modelRuntime.refresh({allowNetwork:!1}):registeredProviders.size>0&&await modelRuntime.refresh({allowNetwork:!1,providers:[...registeredProviders]});for(let{definition,extensionPath}of extensionsResult.runtime.pendingVirtualModelRegistrations)try{modelRuntime.registerVirtualModel(definition)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${extensionPath}" error: ${message}`})}return extensionsResult.runtime.pendingVirtualModelRegistrations=[],diagnostics.push(...applyExtensionFlagValues(resourceLoader,options.extensionFlagValues)),{cwd,agentDir,authStorage,modelRegistry,modelRuntime,settingsManager,resourceLoader,diagnostics}}async function createAgentSessionFromServices(options){return createAgentSession({cwd:options.services.cwd,agentDir:options.services.agentDir,modelRuntime:options.services.modelRuntime,modelRegistry:options.services.modelRegistry,authStorage:options.services.authStorage,settingsManager:options.services.settingsManager,resourceLoader:options.services.resourceLoader,sessionManager:options.sessionManager,model:options.model,initialModelProvenance:options.initialModelProvenance,thinkingLevel:options.thinkingLevel,thinkingSelection:options.thinkingSelection,serviceTier:options.serviceTier,scopedModels:options.scopedModels,favoriteModels:options.favoriteModels,tools:options.tools,excludeTools:options.excludeTools,noTools:options.noTools,customTools:options.customTools,sessionStartEvent:options.sessionStartEvent,autoTitleSessions:options.autoTitleSessions,promptSurface:options.promptSurface,browserEngine:options.browserEngine})}var SessionImportFileNotFoundError=class extends Error{constructor(filePath){super(`File not found: ${filePath}`),this.name="SessionImportFileNotFoundError",this.filePath=filePath}};function extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text"&&typeof part.text=="string").map(part=>part.text).join("")}var AgentSessionRuntime=class{constructor(_session,_services,createRuntime,_diagnostics=[],_modelFallbackMessage,launchProfile){this._session=_session,this._services=_services,this.createRuntime=createRuntime,this._diagnostics=_diagnostics,this._modelFallbackMessage=_modelFallbackMessage,this._launchProfile=launchProfile,this._sessionHold=holdActiveSession(_session.sessionManager,wasFlushed(_session.sessionManager))}releaseSessionHold(){this._sessionHold?.release(),this._sessionHold=void 0}get services(){return this._services}get session(){return this._session}get cwd(){return this._services.cwd}get diagnostics(){return this._diagnostics}get modelFallbackMessage(){return this._modelFallbackMessage}get launchProfile(){return this._launchProfile}setPromptSurface(surface){this._launchProfile=Object.freeze({...this._launchProfile??{cwd:this.cwd},promptSurface:surface}),this._session.setPromptSurface(surface)}setBrowserEngine(engine){this._launchProfile=Object.freeze({...this._launchProfile??{cwd:this.cwd},browserEngine:engine}),this._session.setBrowserEngine(engine)}setRebindSession(rebindSession){this.rebindSession=rebindSession}setBeforeSessionInvalidate(beforeSessionInvalidate){this.beforeSessionInvalidate=beforeSessionInvalidate}async emitAttachmentEvent(type2){let runner=this.session.extensionRunner;runner.hasHandlers(type2)&&await runner.emit({type:type2})}async emitBeforeSwitch(reason,targetSessionFile){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_switch")?{cancelled:(await runner.emit({type:"session_before_switch",reason,targetSessionFile}))?.cancel===!0}:{cancelled:!1}}async emitBeforeFork(entryId,options){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_fork")?{cancelled:(await runner.emit({type:"session_before_fork",entryId,...options}))?.cancel===!0}:{cancelled:!1}}async teardownCurrent(reason,targetSessionFile){let mark=label3=>{reason==="resume"&&time(label3,"switch")};await this.session.abort(),mark("abort");let oldRunner=this.session.extensionRunner;typeof oldRunner.getExtensionIdentities=="function"&&(this._removedOnReplacement={oldRunner,oldIdentities:oldRunner.getExtensionIdentities(),reason}),await emitSessionShutdownEvent(oldRunner,{type:"session_shutdown",reason,targetSessionFile}),mark("shutdown"),this.beforeSessionInvalidate?.();let replaced=this.session.sessionManager;this.session.dispose(),unregisterSessionWriter(replaced),this.releaseSessionHold(),mark("dispose")}async reportRemovedExtensions(){let pending=this._removedOnReplacement;if(this._removedOnReplacement=void 0,!pending)return;let newRunner=this.session.extensionRunner;if(typeof newRunner.getExtensionIdentities!="function")return;let newResolvedPaths=new Set(newRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=pending.oldIdentities.filter(extension=>!newResolvedPaths.has(extension.resolvedPath));removed.length!==0&&await pending.oldRunner.emit({type:"session_extensions_removed",reason:pending.reason,removed})}async apply(result3,hold){this._sessionHold=hold??holdActiveSession(result3.session.sessionManager,!1),this._session=result3.session,this._services=result3.services,this._diagnostics=result3.diagnostics,this._modelFallbackMessage=result3.modelFallbackMessage,await this.reportRemovedExtensions()}async finishSessionReplacement(withSession){this.rebindSession&&await this.rebindSession(this.session),withSession&&await withSession(this.session.createReplacedSessionContext())}async switchSession(sessionPath,options){resetTimings("switch");let beforeResult=await this.emitBeforeSwitch("resume",sessionPath);if(beforeResult.cancelled)return beforeResult;time("beforeSwitch","switch");let previousSessionFile=this.session.sessionFile,sessionManager=SessionManager.open(sessionPath,void 0,options?.cwdOverride);assertSessionCwdExists(sessionManager,this.cwd);let hold=holdActiveSession(sessionManager,wasFlushed(sessionManager));time("open","switch");try{await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},projectTrustContext:options?.projectTrustContextFactory?.(sessionManager.getCwd()),launchProfile:this._launchProfile}),hold)}catch(error2){throw this._sessionHold!==hold&&hold?.release(),error2}return time("apply","switch"),await this.finishSessionReplacement(options?.withSession),time("rebind","switch"),{cancelled:!1}}async newSession(options){let beforeResult=await this.emitBeforeSwitch("new");if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile,sessionDir=this.session.sessionManager.getSessionDir(),sessionManager=this.session.sessionManager.isPersisted()?SessionManager.create(this.cwd,sessionDir):SessionManager.inMemory(this.cwd);return options?.parentSession&&sessionManager.newSession({parentSession:options.parentSession}),await this.teardownCurrent("new",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"new",previousSessionFile},launchProfile:this._launchProfile})),options?.setup&&(await options.setup(this.session.sessionManager),this.session.refreshContext()),await this.finishSessionReplacement(options?.withSession),{cancelled:!1}}async fork(entryId,options){let position=options?.position??"before";if((await this.emitBeforeFork(entryId,{position})).cancelled)return{cancelled:!0};let targetLeafId,selectedText,selectedEntry=this.session.sessionManager.getEntry(entryId);if(!selectedEntry)throw new Error("Invalid entry ID for forking");if(position==="at")targetLeafId=selectedEntry.id;else{if(selectedEntry.type!=="message"||selectedEntry.message.role!=="user")throw new Error("Invalid entry ID for forking");targetLeafId=selectedEntry.parentId,selectedText=extractUserMessageText(selectedEntry.message.content)}let previousSessionFile=this.session.sessionFile;if(this.session.sessionManager.isPersisted()){let currentSessionFile=this.session.sessionFile;if(!currentSessionFile)throw new Error("Persisted session is missing a session file");let sessionDir=this.session.sessionManager.getSessionDir();if(!targetLeafId){let sessionManager3=SessionManager.create(this.cwd,sessionDir);return sessionManager3.newSession({parentSession:currentSessionFile}),await this.teardownCurrent("fork",sessionManager3.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager:sessionManager3,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}if(!existsSync35(currentSessionFile))throw new Error("This session has not been saved yet. Send a message before cloning or forking it.");let sessionManager2=SessionManager.open(currentSessionFile,sessionDir);if(!sessionManager2.createBranchedSession(targetLeafId))throw new Error("Failed to create forked session");return await this.teardownCurrent("fork",sessionManager2.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager2.getCwd(),agentDir:this.services.agentDir,sessionManager:sessionManager2,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}let sessionManager=this.session.sessionManager;return await this.teardownCurrent("fork",sessionManager.getSessionFile()),targetLeafId?sessionManager.createBranchedSession(targetLeafId):sessionManager.newSession({parentSession:previousSessionFile}),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}async importFromJsonl(inputPath,cwdOverride){let resolvedPath=resolvePath(inputPath);if(!existsSync35(resolvedPath))throw new SessionImportFileNotFoundError(resolvedPath);let sessionDir=this.session.sessionManager.getSessionDir();existsSync35(sessionDir)||mkdirSync16(sessionDir,{recursive:!0});let destinationPath=join69(sessionDir,basename24(resolvedPath)),sourceAlreadyStored=resolve39(destinationPath)===resolvedPath;if(!sourceAlreadyStored){let{name,ext}=parse6(destinationPath),suffix=1;for(;existsSync35(destinationPath);)destinationPath=join69(sessionDir,`${name}-${suffix++}${ext}`)}let beforeResult=await this.emitBeforeSwitch("resume",destinationPath);if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile;reserveSessionWrite(destinationPath),sourceAlreadyStored||copyFileSync(resolvedPath,destinationPath,constants9.COPYFILE_EXCL);let sessionManager=SessionManager.open(destinationPath,sessionDir,cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(),{cancelled:!1}}async dispose(){await emitSessionShutdownEvent(this.session.extensionRunner,{type:"session_shutdown",reason:"quit"}),this.beforeSessionInvalidate?.(),this.session.dispose(),this.releaseSessionHold()}};function wasFlushed(sessionManager){return sessionManager.getEntries().some(entry=>entry.type==="message"&&entry.message.role==="assistant")}function holdActiveSession(sessionManager,expectExisting){let sessionFile=sessionManager.getSessionFile();if(!(!sessionManager.isPersisted()||sessionFile===void 0))return holdSessionFile(sessionFile,sessionManager.getSessionId(),{cwd:sessionManager.getCwd(),expectExisting})}async function createAgentSessionRuntime(createRuntime,options){assertSessionCwdExists(options.sessionManager,options.cwd);let result3=await createRuntime(options);return new AgentSessionRuntime(result3.session,result3.services,createRuntime,result3.diagnostics,result3.modelFallbackMessage,options.launchProfile)}setDefaultStreamFn(streamSimple);function clampThinkingLevelToModel(level,model){if(!model?.reasoning)return"off";let requested=level??"off",available=getSupportedThinkingLevels2(model);if(available.includes(requested))return requested;let ordered=["off","minimal","low","medium","high","xhigh","max"],requestedIndex=ordered.indexOf(requested);for(let index=requestedIndex-1;index>=0;index--){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}for(let index=requestedIndex+1;index<ordered.length;index++){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}return available[0]??"off"}function getDefaultAgentDir(){return getAgentDir()}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join70(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join70(agentDir,"models.json"):void 0,authStorage=options.authStorage??options.modelRegistry?.authStorage??AuthStorage.create(authPath),modelRuntime=options.modelRuntime??options.modelRegistry?.modelRuntime??await ModelRuntime.create({credentials:authStorage,modelsPath,agentDir}),modelRegistry=options.modelRegistry??new ModelRegistry(modelRuntime,authStorage),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir);modelRuntime.setSettingsManager(settingsManager);let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),scopedModels=options.scopedModels??await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:settingsManager.getEnabledModels()}),modelRuntime),favoriteModels2=options.favoriteModels??await resolveModelScope(settingsManager.getFavoriteModels()??[],modelRuntime);resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,initialModelProvenance=options.initialModelProvenance,initialResolvedThinkingLevel,initialThinkingSelection=options.thinkingSelection,modelFallbackMessage;if(model){let resolved=resolveStoredModelReference(model.provider,model.id,modelRuntime);resolved?.thinkingSelection&&(model=resolved.model,initialResolvedThinkingLevel=resolved.thinkingLevel,initialThinkingSelection??=resolved.thinkingSelection)}let branchSelection=getBranchSelection(sessionManager.getBranch(),(provider,modelId)=>modelRuntime.getModel(provider,modelId)),branchSelectionModel=branchSelection&&modelRuntime.getModel(branchSelection.provider,branchSelection.modelId),sessionModel=branchSelectionModel&&isVirtualModel(branchSelectionModel)?branchSelection:existingSession.model;if(!model&&hasExistingSession&&sessionModel){let restored=resolveStoredModelReference(sessionModel.provider,sessionModel.modelId,modelRuntime);restored&&modelRuntime.hasConfiguredAuth(restored.model.provider)&&(model=restored.model,initialResolvedThinkingLevel=restored.thinkingLevel,initialThinkingSelection=restored.thinkingSelection),model||(modelFallbackMessage=`Could not restore model ${sessionModel.provider}/${sessionModel.modelId}`)}if(!model){let result3=await findInitialModel({scopedModels,isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime});model=result3.model,initialModelProvenance=result3.provenance;let selectedModel=model,scopedSelection=selectedModel?scopedModels.find(entry=>entry.model.provider===selectedModel.provider&&entry.model.id===selectedModel.id):void 0;initialResolvedThinkingLevel=scopedSelection?.thinkingLevel??result3.thinkingLevel,initialThinkingSelection=scopedSelection?.thinkingSelection??result3.thinkingSelection,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage()}let thinkingLevel=options.thinkingLevel??initialResolvedThinkingLevel,thinkingSelection=options.thinkingSelection??(options.thinkingLevel!==void 0?{level:options.thinkingLevel,source:"explicit"}:void 0)??initialThinkingSelection;if(thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel,thinkingSelection=existingSession.thinkingSelection),thinkingLevel===void 0&&model){let remembered=settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(thinkingLevel=remembered,thinkingSelection={level:remembered,source:"explicit"})}if(thinkingLevel===void 0&&model?.defaultThinkingLevel!==void 0&&(thinkingLevel=model.defaultThinkingLevel),thinkingLevel===void 0){let configuredDefault=settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0?(thinkingLevel=configuredDefault,thinkingSelection={level:configuredDefault,source:"explicit"}):thinkingLevel=DEFAULT_THINKING_LEVEL}model?thinkingLevel=clampThinkingLevelToModel(thinkingLevel,model):thinkingLevel="off",thinkingSelection&&(thinkingSelection={...thinkingSelection,level:thinkingLevel});let configuredDefaultToolNames=settingsManager.getDefaultTools(),sessionDefaultToolNames=options.tools===void 0&&options.noTools===void 0?configuredDefaultToolNames:void 0,allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=(options.tools??(options.noTools?[]:configuredDefaultToolNames??DEFAULT_TOOL_NAMES)).filter(name=>!excludedToolNameSet?.has(name)),agent,reasoningBaseline=existingSession.configurationUpdate?sessionManager.getBranch().find(entry=>entry.type==="thinking_level_change")?.thinkingLevel??thinkingLevel:void 0,convertToLlmWithBlockImages=messages=>convertToLlmForTransport(messages,{blockImages:settingsManager.getBlockImages(),budgetBytes:TRANSPORT_IMAGE_BUDGET_BYTES,alwaysKeepNewest:1,maxHistoricalImages:settingsManager.getMaxHistoricalImages()}),extensionRunnerRef={},sessionRef={},resolveRequestServiceTier=requestModel=>{if(!supportsServiceTier(requestModel.api))return;let session2=sessionRef.current,activeModel=session2?.model;return session2&&activeModel&&modelsAreEqual(activeModel,requestModel)?session2.effectiveServiceTier:modelRuntime.getCompatibilityRequestConfig(requestModel).serviceTier},handleProviderStreamEvent=async(data,model2)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("provider_stream_event")||await runner.emit({data,type:"provider_stream_event",provider:model2.provider,api:model2.api,model:model2.id})};agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,thinkingSelection,reasoningBaseline,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs(),headerRunner=extensionRunnerRef.current,declaredPolicy=model2.provider?modelRuntime.getProvider(model2.provider)?.retryPolicy:void 0,profileMaxRetries=declaredPolicy===void 0?providerRetrySettings.maxRetries:declaredPolicy.providerRequest.enabled?declaredPolicy.providerRequest.maxRetries:0,serviceTier=serviceTierForProvider(model2.provider,options2?.serviceTier??resolveRequestServiceTier(model2));return modelRuntime.streamSimple(model2,context,{...options2,serviceTier,timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??profileMaxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders2=>{let headers=mergeProviderAttributionHeaders(model2,settingsManager,options2?.sessionId,requestHeaders2);return headerRunner?.isActive&&headerRunner.hasHandlers("before_provider_headers")?headerRunner.emitBeforeProviderHeaders(headers??{}):headers??{}}})},onPayload:async(payload,_model,request2)=>{let runner=extensionRunnerRef.current;return!runner?.isActive||!runner.hasHandlers("before_provider_request")?payload:runner.emitBeforeProviderRequest(payload,void 0,request2)},onResponse:async(response,_model)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("after_provider_response")||await runner.emit({type:"after_provider_response",status:response.status,headers:response.headers})},onProviderStreamEvent:handleProviderStreamEvent,sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let runner=extensionRunnerRef.current;return runner?.isActive?runner.emitContext(messages):messages},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),timeoutMs:settingsManager.getAgentStreamIdleTimeoutMs(),streamStartTimeoutMs:settingsManager.getAgentStreamStartTimeoutMs(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs,cursorExecHandlers:runSignal=>createSessionCursorExecBridge(sessionRef,()=>agent,runSignal)}),agent.state.thinkingSelection=thinkingSelection,hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection));let sessionStartEvent=initialModelProvenance?{...options.sessionStartEvent??{type:"session_start",reason:"startup"},initialModelProvenance}:options.sessionStartEvent,session=new AgentSession({agent,serviceTier:options.serviceTier,sessionManager,settingsManager,cwd,agentDir,scopedModels,favoriteModels:favoriteModels2,resourceLoader,customTools:options.customTools,modelRuntime,modelRegistry,initialActiveToolNames,defaultToolNames:sessionDefaultToolNames,usesDefaultTools:options.tools===void 0&&options.noTools===void 0,allowedToolNames,excludedToolNames,extensionRunnerRef,sessionStartEvent,autoTitleSessions:options.autoTitleSessions,promptSurface:options.promptSurface,browserEngine:options.browserEngine}),liveContextTokens=hasExistingSession?existingSession.messages.reduce((total,message)=>total+estimateTokens2(message),0):0;try{try{session.assertModelUsable(void 0,liveContextTokens,hasExistingSession?{includeSpeculationLead:!1,admission:"resume"}:{admission:"start"})}catch(error2){if(!hasExistingSession||!(error2 instanceof ModelUsabilityBudgetError)||!session.settingsManager.getCompactionEnabled())throw error2;if(error2.projection.liveContextTokens>error2.projection.contextWindow){let plan=planResumeSlice({entries:session.sessionManager.getBranch(),projection:error2.projection});if(!plan)throw error2;session.applyResumeSlice(plan)}else session.admitResumeCompactionRequired(error2.projection)}}catch(error2){throw session.dispose(),error2}sessionRef.current=session;let extensionsResult=resourceLoader.getExtensions();return{session,extensionsResult,modelFallbackMessage}}import{isMainThread as isMainThread2,MessageChannel as MessageChannel3}from"node:worker_threads";import{randomUUID as randomUUID11}from"node:crypto";import{MessageChannel as MessageChannel2}from"node:worker_threads";import{execFile as execFile5}from"node:child_process";var BUN_CHROME_FLAGS="--remote-debugging-pipe --headless --no-first-run --no-default-browser-check",EXIT_DEADLINE_MS=5e3,EXIT_POLL_MS=25;function run(file,args){return new Promise(resolve46=>{execFile5(file,[...args],{maxBuffer:16*1024*1024,windowsHide:!0},(_error,stdout)=>resolve46(String(stdout??"")))})}function positivePids(texts){return texts.map(Number).filter(pid=>Number.isInteger(pid)&&pid>0)}var WINDOWS_CHROME_TREE=`$all = Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, CommandLine
2422
+ ${issue.fallbackCwd}`}var MissingSessionCwdError=class extends Error{constructor(issue){super(formatMissingSessionCwdError(issue)),this.name="MissingSessionCwdError",this.issue=issue}};function assertSessionCwdExists(sessionManager,fallbackCwd){let issue=getMissingSessionCwdIssue(sessionManager,fallbackCwd);if(issue)throw new MissingSessionCwdError(issue)}import{join as join68}from"node:path";async function joinStartupBranches(primary,secondary){let[primaryResult,secondaryResult]=await Promise.allSettled([primary,secondary]);if(primaryResult.status==="rejected")throw primaryResult.reason;if(secondaryResult.status==="rejected")throw secondaryResult.reason;return{primary:primaryResult.value,secondary:secondaryResult.value}}function applyExtensionFlagValues(resourceLoader,extensionFlagValues){if(!extensionFlagValues)return[];let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredFlags=new Map;for(let extension of extensionsResult.extensions)for(let[name,flag]of extension.flags)registeredFlags.has(name)||registeredFlags.set(name,{type:flag.type});let unknownFlags=[];for(let[name,value2]of extensionFlagValues){let flag=registeredFlags.get(name);if(!flag){unknownFlags.push(name);continue}if(flag.type==="boolean"){extensionsResult.runtime.flagValues.set(name,!0);continue}if(typeof value2=="string"){extensionsResult.runtime.flagValues.set(name,value2);continue}diagnostics.push({type:"error",message:`Extension flag "--${name}" requires a value`})}return unknownFlags.length>0&&diagnostics.push({type:"error",message:`Unknown option${unknownFlags.length===1?"":"s"}: ${unknownFlags.map(name=>`--${name}`).join(", ")}`}),diagnostics}async function createAgentSessionServices(options){let cwd=resolvePath(options.cwd),agentDir=options.agentDir?resolvePath(options.agentDir):getAgentDir(),authStorage=AuthStorage.create(join68(agentDir,"auth.json")),runtimePromise=options.modelRuntime!==void 0?Promise.resolve(options.modelRuntime):ModelRuntime.create({credentials:authStorage,authPath:join68(agentDir,"auth.json"),agentDir,modelsPath:join68(agentDir,"models.json"),signal:options.modelRuntimeSignal}),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir),resourceLoader=new DefaultResourceLoader({...options.resourceLoaderOptions??{},cwd,agentDir,settingsManager,mcpRegistry:options.mcpRegistry}),{primary:modelRuntime}=await joinStartupBranches(runtimePromise,resourceLoader.reload(options.resourceLoaderReloadOptions)),modelRegistry=new ModelRegistry(modelRuntime,authStorage);modelRuntime.setSettingsManager(settingsManager);let diagnostics=[],extensionsResult=resourceLoader.getExtensions(),registeredProviders=new Set;for(let registration of drainPendingProviderRegistrations(extensionsResult.runtime))try{registration.kind==="config"?(modelRuntime.registerProvider(registration.name,registration.config,{refresh:!1}),registeredProviders.add(registration.name)):(modelRuntime.registerNativeProvider(registration.provider,{refresh:!1}),registeredProviders.add(registration.provider.id))}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${registration.extensionPath}" error: ${message}`})}options.modelRuntime===void 0?await modelRuntime.refresh({allowNetwork:!1}):registeredProviders.size>0&&await modelRuntime.refresh({allowNetwork:!1,providers:[...registeredProviders]});for(let{definition,extensionPath}of extensionsResult.runtime.pendingVirtualModelRegistrations)try{modelRuntime.registerVirtualModel(definition)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);diagnostics.push({type:"error",message:`Extension "${extensionPath}" error: ${message}`})}return extensionsResult.runtime.pendingVirtualModelRegistrations=[],diagnostics.push(...applyExtensionFlagValues(resourceLoader,options.extensionFlagValues)),{cwd,agentDir,authStorage,modelRegistry,modelRuntime,settingsManager,resourceLoader,diagnostics}}async function createAgentSessionFromServices(options){return createAgentSession({cwd:options.services.cwd,agentDir:options.services.agentDir,modelRuntime:options.services.modelRuntime,modelRegistry:options.services.modelRegistry,authStorage:options.services.authStorage,settingsManager:options.services.settingsManager,resourceLoader:options.services.resourceLoader,sessionManager:options.sessionManager,model:options.model,initialModelProvenance:options.initialModelProvenance,thinkingLevel:options.thinkingLevel,thinkingSelection:options.thinkingSelection,serviceTier:options.serviceTier,scopedModels:options.scopedModels,favoriteModels:options.favoriteModels,tools:options.tools,excludeTools:options.excludeTools,noTools:options.noTools,customTools:options.customTools,sessionStartEvent:options.sessionStartEvent,autoTitleSessions:options.autoTitleSessions,promptSurface:options.promptSurface,browserEngine:options.browserEngine})}function applyRetryFallbackProfile(settingsManager,profile){settingsManager.applyOverrides({retry:{modelFallback:profile.modelFallback,fallbackChains:Object.fromEntries(Object.entries(profile.fallbackChains).map(([key,entries])=>[key,[...entries]]))}})}var SessionImportFileNotFoundError=class extends Error{constructor(filePath){super(`File not found: ${filePath}`),this.name="SessionImportFileNotFoundError",this.filePath=filePath}};function extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text"&&typeof part.text=="string").map(part=>part.text).join("")}var AgentSessionRuntime=class{constructor(_session,_services,createRuntime,_diagnostics=[],_modelFallbackMessage,launchProfile){this._session=_session,this._services=_services,this.createRuntime=createRuntime,this._diagnostics=_diagnostics,this._modelFallbackMessage=_modelFallbackMessage,this._launchProfile=launchProfile,this._sessionHold=holdActiveSession(_session.sessionManager,wasFlushed(_session.sessionManager))}releaseSessionHold(){this._sessionHold?.release(),this._sessionHold=void 0}get services(){return this._services}get session(){return this._session}get cwd(){return this._services.cwd}get diagnostics(){return this._diagnostics}get modelFallbackMessage(){return this._modelFallbackMessage}get launchProfile(){return this._launchProfile}setPromptSurface(surface){this._launchProfile=Object.freeze({...this._launchProfile??{cwd:this.cwd},promptSurface:surface}),this._session.setPromptSurface(surface)}setBrowserEngine(engine){this._launchProfile=Object.freeze({...this._launchProfile??{cwd:this.cwd},browserEngine:engine}),this._session.setBrowserEngine(engine)}setRetryFallback(profile){let retryFallback=Object.freeze({modelFallback:profile.modelFallback,fallbackChains:Object.freeze(Object.fromEntries(Object.entries(profile.fallbackChains).map(([key,entries])=>[key,Object.freeze([...entries])])))});this._launchProfile=Object.freeze({...this._launchProfile??{cwd:this.cwd},retryFallback}),applyRetryFallbackProfile(this._session.settingsManager,retryFallback)}setRebindSession(rebindSession){this.rebindSession=rebindSession}setBeforeSessionInvalidate(beforeSessionInvalidate){this.beforeSessionInvalidate=beforeSessionInvalidate}async emitAttachmentEvent(type2){let runner=this.session.extensionRunner;runner.hasHandlers(type2)&&await runner.emit({type:type2})}async emitBeforeSwitch(reason,targetSessionFile){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_switch")?{cancelled:(await runner.emit({type:"session_before_switch",reason,targetSessionFile}))?.cancel===!0}:{cancelled:!1}}async emitBeforeFork(entryId,options){let runner=this.session.extensionRunner;return runner.hasHandlers("session_before_fork")?{cancelled:(await runner.emit({type:"session_before_fork",entryId,...options}))?.cancel===!0}:{cancelled:!1}}async teardownCurrent(reason,targetSessionFile){let mark=label3=>{reason==="resume"&&time(label3,"switch")};await this.session.abort(),mark("abort");let oldRunner=this.session.extensionRunner;typeof oldRunner.getExtensionIdentities=="function"&&(this._removedOnReplacement={oldRunner,oldIdentities:oldRunner.getExtensionIdentities(),reason}),await emitSessionShutdownEvent(oldRunner,{type:"session_shutdown",reason,targetSessionFile}),mark("shutdown"),this.beforeSessionInvalidate?.();let replaced=this.session.sessionManager;this.session.dispose(),unregisterSessionWriter(replaced),this.releaseSessionHold(),mark("dispose")}async reportRemovedExtensions(){let pending=this._removedOnReplacement;if(this._removedOnReplacement=void 0,!pending)return;let newRunner=this.session.extensionRunner;if(typeof newRunner.getExtensionIdentities!="function")return;let newResolvedPaths=new Set(newRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=pending.oldIdentities.filter(extension=>!newResolvedPaths.has(extension.resolvedPath));removed.length!==0&&await pending.oldRunner.emit({type:"session_extensions_removed",reason:pending.reason,removed})}async apply(result3,hold){this._sessionHold=hold??holdActiveSession(result3.session.sessionManager,!1),this._session=result3.session,this._services=result3.services,this._diagnostics=result3.diagnostics,this._modelFallbackMessage=result3.modelFallbackMessage,await this.reportRemovedExtensions()}async finishSessionReplacement(withSession){this.rebindSession&&await this.rebindSession(this.session),withSession&&await withSession(this.session.createReplacedSessionContext())}async switchSession(sessionPath,options){resetTimings("switch");let beforeResult=await this.emitBeforeSwitch("resume",sessionPath);if(beforeResult.cancelled)return beforeResult;time("beforeSwitch","switch");let previousSessionFile=this.session.sessionFile,sessionManager=SessionManager.open(sessionPath,void 0,options?.cwdOverride);assertSessionCwdExists(sessionManager,this.cwd);let hold=holdActiveSession(sessionManager,wasFlushed(sessionManager));time("open","switch");try{await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},projectTrustContext:options?.projectTrustContextFactory?.(sessionManager.getCwd()),launchProfile:this._launchProfile}),hold)}catch(error2){throw this._sessionHold!==hold&&hold?.release(),error2}return time("apply","switch"),await this.finishSessionReplacement(options?.withSession),time("rebind","switch"),{cancelled:!1}}async newSession(options){let beforeResult=await this.emitBeforeSwitch("new");if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile,sessionDir=this.session.sessionManager.getSessionDir(),sessionManager=this.session.sessionManager.isPersisted()?SessionManager.create(this.cwd,sessionDir):SessionManager.inMemory(this.cwd);return options?.parentSession&&sessionManager.newSession({parentSession:options.parentSession}),await this.teardownCurrent("new",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"new",previousSessionFile},launchProfile:this._launchProfile})),options?.setup&&(await options.setup(this.session.sessionManager),this.session.refreshContext()),await this.finishSessionReplacement(options?.withSession),{cancelled:!1}}async fork(entryId,options){let position=options?.position??"before";if((await this.emitBeforeFork(entryId,{position})).cancelled)return{cancelled:!0};let targetLeafId,selectedText,selectedEntry=this.session.sessionManager.getEntry(entryId);if(!selectedEntry)throw new Error("Invalid entry ID for forking");if(position==="at")targetLeafId=selectedEntry.id;else{if(selectedEntry.type!=="message"||selectedEntry.message.role!=="user")throw new Error("Invalid entry ID for forking");targetLeafId=selectedEntry.parentId,selectedText=extractUserMessageText(selectedEntry.message.content)}let previousSessionFile=this.session.sessionFile;if(this.session.sessionManager.isPersisted()){let currentSessionFile=this.session.sessionFile;if(!currentSessionFile)throw new Error("Persisted session is missing a session file");let sessionDir=this.session.sessionManager.getSessionDir();if(!targetLeafId){let sessionManager3=SessionManager.create(this.cwd,sessionDir);return sessionManager3.newSession({parentSession:currentSessionFile}),await this.teardownCurrent("fork",sessionManager3.getSessionFile()),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager:sessionManager3,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}if(!existsSync35(currentSessionFile))throw new Error("This session has not been saved yet. Send a message before cloning or forking it.");let sessionManager2=SessionManager.open(currentSessionFile,sessionDir);if(!sessionManager2.createBranchedSession(targetLeafId))throw new Error("Failed to create forked session");return await this.teardownCurrent("fork",sessionManager2.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager2.getCwd(),agentDir:this.services.agentDir,sessionManager:sessionManager2,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}let sessionManager=this.session.sessionManager;return await this.teardownCurrent("fork",sessionManager.getSessionFile()),targetLeafId?sessionManager.createBranchedSession(targetLeafId):sessionManager.newSession({parentSession:previousSessionFile}),await this.apply(await this.createRuntime({cwd:this.cwd,agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"fork",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(options?.withSession),{cancelled:!1,selectedText}}async importFromJsonl(inputPath,cwdOverride){let resolvedPath=resolvePath(inputPath);if(!existsSync35(resolvedPath))throw new SessionImportFileNotFoundError(resolvedPath);let sessionDir=this.session.sessionManager.getSessionDir();existsSync35(sessionDir)||mkdirSync16(sessionDir,{recursive:!0});let destinationPath=join69(sessionDir,basename24(resolvedPath)),sourceAlreadyStored=resolve39(destinationPath)===resolvedPath;if(!sourceAlreadyStored){let{name,ext}=parse6(destinationPath),suffix=1;for(;existsSync35(destinationPath);)destinationPath=join69(sessionDir,`${name}-${suffix++}${ext}`)}let beforeResult=await this.emitBeforeSwitch("resume",destinationPath);if(beforeResult.cancelled)return beforeResult;let previousSessionFile=this.session.sessionFile;reserveSessionWrite(destinationPath),sourceAlreadyStored||copyFileSync(resolvedPath,destinationPath,constants9.COPYFILE_EXCL);let sessionManager=SessionManager.open(destinationPath,sessionDir,cwdOverride);return assertSessionCwdExists(sessionManager,this.cwd),await this.teardownCurrent("resume",sessionManager.getSessionFile()),await this.apply(await this.createRuntime({cwd:sessionManager.getCwd(),agentDir:this.services.agentDir,sessionManager,sessionStartEvent:{type:"session_start",reason:"resume",previousSessionFile},launchProfile:this._launchProfile})),await this.finishSessionReplacement(),{cancelled:!1}}async dispose(){await emitSessionShutdownEvent(this.session.extensionRunner,{type:"session_shutdown",reason:"quit"}),this.beforeSessionInvalidate?.(),this.session.dispose(),this.releaseSessionHold()}};function wasFlushed(sessionManager){return sessionManager.getEntries().some(entry=>entry.type==="message"&&entry.message.role==="assistant")}function holdActiveSession(sessionManager,expectExisting){let sessionFile=sessionManager.getSessionFile();if(!(!sessionManager.isPersisted()||sessionFile===void 0))return holdSessionFile(sessionFile,sessionManager.getSessionId(),{cwd:sessionManager.getCwd(),expectExisting})}async function createAgentSessionRuntime(createRuntime,options){assertSessionCwdExists(options.sessionManager,options.cwd);let result3=await createRuntime(options);return new AgentSessionRuntime(result3.session,result3.services,createRuntime,result3.diagnostics,result3.modelFallbackMessage,options.launchProfile)}setDefaultStreamFn(streamSimple);function clampThinkingLevelToModel(level,model){if(!model?.reasoning)return"off";let requested=level??"off",available=getSupportedThinkingLevels2(model);if(available.includes(requested))return requested;let ordered=["off","minimal","low","medium","high","xhigh","max"],requestedIndex=ordered.indexOf(requested);for(let index=requestedIndex-1;index>=0;index--){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}for(let index=requestedIndex+1;index<ordered.length;index++){let candidate=ordered[index];if(candidate!==void 0&&available.includes(candidate))return candidate}return available[0]??"off"}function getDefaultAgentDir(){return getAgentDir()}async function createAgentSession(options={}){let cwd=resolvePath(options.cwd??options.sessionManager?.getCwd()??process.cwd()),agentDir=options.agentDir?resolvePath(options.agentDir):getDefaultAgentDir(),resourceLoader=options.resourceLoader,authPath=options.agentDir?join70(agentDir,"auth.json"):void 0,modelsPath=options.agentDir?join70(agentDir,"models.json"):void 0,authStorage=options.authStorage??options.modelRegistry?.authStorage??AuthStorage.create(authPath),modelRuntime=options.modelRuntime??options.modelRegistry?.modelRuntime??await ModelRuntime.create({credentials:authStorage,modelsPath,agentDir}),modelRegistry=options.modelRegistry??new ModelRegistry(modelRuntime,authStorage),settingsManager=options.settingsManager??SettingsManager.create(cwd,agentDir);modelRuntime.setSettingsManager(settingsManager);let sessionManager=options.sessionManager??SessionManager.create(cwd,getDefaultSessionDir(cwd,agentDir)),scopedModels=options.scopedModels??await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:settingsManager.getEnabledModels()}),modelRuntime),favoriteModels2=options.favoriteModels??await resolveModelScope(settingsManager.getFavoriteModels()??[],modelRuntime);resourceLoader||(resourceLoader=new DefaultResourceLoader({cwd,agentDir,settingsManager}),await resourceLoader.reload(),time("resourceLoader.reload"));let existingSession=sessionManager.buildSessionContext(),hasExistingSession=existingSession.messages.length>0,hasThinkingEntry=sessionManager.getBranch().some(entry=>entry.type==="thinking_level_change"),model=options.model,initialModelProvenance=options.initialModelProvenance,initialResolvedThinkingLevel,initialThinkingSelection=options.thinkingSelection,modelFallbackMessage;if(model){let resolved=resolveStoredModelReference(model.provider,model.id,modelRuntime);resolved?.thinkingSelection&&(model=resolved.model,initialResolvedThinkingLevel=resolved.thinkingLevel,initialThinkingSelection??=resolved.thinkingSelection)}let branchSelection=getBranchSelection(sessionManager.getBranch(),(provider,modelId)=>modelRuntime.getModel(provider,modelId)),branchSelectionModel=branchSelection&&modelRuntime.getModel(branchSelection.provider,branchSelection.modelId),sessionModel=branchSelectionModel&&isVirtualModel(branchSelectionModel)?branchSelection:existingSession.model;if(!model&&hasExistingSession&&sessionModel){let restored=resolveStoredModelReference(sessionModel.provider,sessionModel.modelId,modelRuntime);restored&&modelRuntime.hasConfiguredAuth(restored.model.provider)&&(model=restored.model,initialResolvedThinkingLevel=restored.thinkingLevel,initialThinkingSelection=restored.thinkingSelection),model||(modelFallbackMessage=`Could not restore model ${sessionModel.provider}/${sessionModel.modelId}`)}if(!model){let result3=await findInitialModel({scopedModels,isContinuing:hasExistingSession,defaultProvider:settingsManager.getDefaultProvider(),defaultModelId:settingsManager.getDefaultModel(),defaultThinkingLevel:settingsManager.getDefaultThinkingLevel(),modelThinkingLevels:settingsManager.getAllModelThinkingLevels(),modelRuntime});model=result3.model,initialModelProvenance=result3.provenance;let selectedModel=model,scopedSelection=selectedModel?scopedModels.find(entry=>entry.model.provider===selectedModel.provider&&entry.model.id===selectedModel.id):void 0;initialResolvedThinkingLevel=scopedSelection?.thinkingLevel??result3.thinkingLevel,initialThinkingSelection=scopedSelection?.thinkingSelection??result3.thinkingSelection,model?modelFallbackMessage&&(modelFallbackMessage+=`. Using ${model.provider}/${model.id}`):modelFallbackMessage=formatNoModelsAvailableMessage()}let thinkingLevel=options.thinkingLevel??initialResolvedThinkingLevel,thinkingSelection=options.thinkingSelection??(options.thinkingLevel!==void 0?{level:options.thinkingLevel,source:"explicit"}:void 0)??initialThinkingSelection;if(thinkingLevel===void 0&&hasExistingSession&&hasThinkingEntry&&(thinkingLevel=existingSession.thinkingLevel,thinkingSelection=existingSession.thinkingSelection),thinkingLevel===void 0&&model){let remembered=settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(thinkingLevel=remembered,thinkingSelection={level:remembered,source:"explicit"})}thinkingLevel===void 0&&model?.defaultThinkingLevel!==void 0&&(thinkingLevel=model.defaultThinkingLevel);let thinkingFromGlobalDefault=!1;if(thinkingLevel===void 0){let configuredDefault=settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0?(thinkingLevel=configuredDefault,thinkingSelection={level:configuredDefault,source:"explicit"},thinkingFromGlobalDefault=!0):thinkingLevel=DEFAULT_THINKING_LEVEL}let requestedThinkingLevel=thinkingLevel;model?thinkingLevel=clampThinkingLevelToModel(thinkingLevel,model):thinkingLevel="off",thinkingSelection=clampThinkingSelection(thinkingSelection,thinkingFromGlobalDefault?thinkingLevel:requestedThinkingLevel,thinkingLevel,model);let configuredDefaultToolNames=settingsManager.getDefaultTools(),sessionDefaultToolNames=options.tools===void 0&&options.noTools===void 0?configuredDefaultToolNames:void 0,allowedToolNames=options.tools??(options.noTools==="all"?[]:void 0),excludedToolNames=options.excludeTools,excludedToolNameSet=excludedToolNames?new Set(excludedToolNames):void 0,initialActiveToolNames=(options.tools??(options.noTools?[]:configuredDefaultToolNames??DEFAULT_TOOL_NAMES)).filter(name=>!excludedToolNameSet?.has(name)),agent,reasoningBaseline=existingSession.configurationUpdate?sessionManager.getBranch().find(entry=>entry.type==="thinking_level_change")?.thinkingLevel??thinkingLevel:void 0,convertToLlmWithBlockImages=messages=>convertToLlmForTransport(messages,{blockImages:settingsManager.getBlockImages(),budgetBytes:TRANSPORT_IMAGE_BUDGET_BYTES,alwaysKeepNewest:1,maxHistoricalImages:settingsManager.getMaxHistoricalImages()}),extensionRunnerRef={},sessionRef={},resolveRequestServiceTier=requestModel=>{if(!supportsServiceTier(requestModel.api))return;let session2=sessionRef.current,activeModel=session2?.model;return session2&&activeModel&&modelsAreEqual(activeModel,requestModel)?session2.effectiveServiceTier:modelRuntime.getCompatibilityRequestConfig(requestModel).serviceTier},handleProviderStreamEvent=async(data,model2)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("provider_stream_event")||await runner.emit({data,type:"provider_stream_event",provider:model2.provider,api:model2.api,model:model2.id})};agent=new Agent({initialState:{systemPrompt:"",model,thinkingLevel,thinkingSelection,reasoningBaseline,tools:[]},convertToLlm:convertToLlmWithBlockImages,streamFn:async(model2,context,options2)=>{let providerRetrySettings=settingsManager.getProviderRetrySettings(),httpIdleTimeoutMs=settingsManager.getHttpIdleTimeoutMs(),effectiveTimeoutMs=httpIdleTimeoutMs===0?2147483647:httpIdleTimeoutMs,timeoutMs=options2?.timeoutMs??providerRetrySettings.timeoutMs??effectiveTimeoutMs,websocketConnectTimeoutMs=options2?.websocketConnectTimeoutMs??settingsManager.getWebSocketConnectTimeoutMs(),headerRunner=extensionRunnerRef.current,declaredPolicy=model2.provider?modelRuntime.getProvider(model2.provider)?.retryPolicy:void 0,profileMaxRetries=declaredPolicy===void 0?providerRetrySettings.maxRetries:declaredPolicy.providerRequest.enabled?declaredPolicy.providerRequest.maxRetries:0,serviceTier=serviceTierForProvider(model2.provider,options2?.serviceTier??resolveRequestServiceTier(model2));return modelRuntime.streamSimple(model2,context,{...options2,serviceTier,timeoutMs,websocketConnectTimeoutMs,maxRetries:options2?.maxRetries??profileMaxRetries,maxRetryDelayMs:options2?.maxRetryDelayMs??providerRetrySettings.maxRetryDelayMs,transformHeaders:async requestHeaders2=>{let headers=mergeProviderAttributionHeaders(model2,settingsManager,options2?.sessionId,requestHeaders2);return headerRunner?.isActive&&headerRunner.hasHandlers("before_provider_headers")?headerRunner.emitBeforeProviderHeaders(headers??{}):headers??{}}})},onPayload:async(payload,_model,request2)=>{let runner=extensionRunnerRef.current;return!runner?.isActive||!runner.hasHandlers("before_provider_request")?payload:runner.emitBeforeProviderRequest(payload,void 0,request2)},onResponse:async(response,_model)=>{let runner=extensionRunnerRef.current;!runner?.isActive||!runner.hasHandlers("after_provider_response")||await runner.emit({type:"after_provider_response",status:response.status,headers:response.headers})},onProviderStreamEvent:handleProviderStreamEvent,sessionId:sessionManager.getSessionId(),transformContext:async messages=>{let runner=extensionRunnerRef.current;return runner?.isActive?runner.emitContext(messages):messages},steeringMode:settingsManager.getSteeringMode(),followUpMode:settingsManager.getFollowUpMode(),transport:settingsManager.getTransport(),thinkingBudgets:settingsManager.getThinkingBudgets(),timeoutMs:settingsManager.getAgentStreamIdleTimeoutMs(),streamStartTimeoutMs:settingsManager.getAgentStreamStartTimeoutMs(),maxRetryDelayMs:settingsManager.getProviderRetrySettings().maxRetryDelayMs,cursorExecHandlers:runSignal=>createSessionCursorExecBridge(sessionRef,()=>agent,runSignal)}),agent.state.thinkingSelection=thinkingSelection,hasExistingSession?(agent.state.messages=existingSession.messages,hasThinkingEntry||sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection)):(model&&sessionManager.appendModelChange(model.provider,model.id),sessionManager.appendThinkingLevelChange(thinkingLevel,thinkingSelection));let sessionStartEvent=initialModelProvenance?{...options.sessionStartEvent??{type:"session_start",reason:"startup"},initialModelProvenance}:options.sessionStartEvent,session=new AgentSession({agent,serviceTier:options.serviceTier,sessionManager,settingsManager,cwd,agentDir,scopedModels,favoriteModels:favoriteModels2,resourceLoader,customTools:options.customTools,modelRuntime,modelRegistry,initialActiveToolNames,defaultToolNames:sessionDefaultToolNames,usesDefaultTools:options.tools===void 0&&options.noTools===void 0,allowedToolNames,excludedToolNames,extensionRunnerRef,sessionStartEvent,autoTitleSessions:options.autoTitleSessions,promptSurface:options.promptSurface,browserEngine:options.browserEngine}),liveContextTokens=hasExistingSession?existingSession.messages.reduce((total,message)=>total+estimateTokens2(message),0):0;try{try{session.assertModelUsable(void 0,liveContextTokens,hasExistingSession?{includeSpeculationLead:!1,admission:"resume"}:{admission:"start"})}catch(error2){if(!hasExistingSession||!(error2 instanceof ModelUsabilityBudgetError)||!session.settingsManager.getCompactionEnabled())throw error2;if(error2.projection.liveContextTokens>error2.projection.contextWindow){let plan=planResumeSlice({entries:session.sessionManager.getBranch(),projection:error2.projection});if(!plan)throw error2;session.applyResumeSlice(plan)}else session.admitResumeCompactionRequired(error2.projection)}}catch(error2){throw session.dispose(),error2}sessionRef.current=session;let extensionsResult=resourceLoader.getExtensions();return{session,extensionsResult,modelFallbackMessage}}import{isMainThread as isMainThread2,MessageChannel as MessageChannel3}from"node:worker_threads";import{randomUUID as randomUUID11}from"node:crypto";import{MessageChannel as MessageChannel2}from"node:worker_threads";import{execFile as execFile5}from"node:child_process";var BUN_CHROME_FLAGS="--remote-debugging-pipe --headless --no-first-run --no-default-browser-check",EXIT_DEADLINE_MS=5e3,EXIT_POLL_MS=25;function run(file,args){return new Promise(resolve46=>{execFile5(file,[...args],{maxBuffer:16*1024*1024,windowsHide:!0},(_error,stdout)=>resolve46(String(stdout??"")))})}function positivePids(texts){return texts.map(Number).filter(pid=>Number.isInteger(pid)&&pid>0)}var WINDOWS_CHROME_TREE=`$all = Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, CommandLine
2423
2423
  $tree = [System.Collections.Generic.HashSet[int]]::new()
2424
2424
  foreach ($p in $all) { if ($p.ParentProcessId -eq ${process.pid} -and $p.ProcessId -ne $PID -and $p.CommandLine -like '*--remote-debugging-pipe*') { [void]$tree.Add([int]$p.ProcessId) } }
2425
2425
  do { $grew = $false; foreach ($p in $all) { if ($tree.Contains([int]$p.ParentProcessId) -and $tree.Add([int]$p.ProcessId)) { $grew = $true } } } while ($grew)
@@ -2431,7 +2431,7 @@ $tree`;async function windowsBunChromeTree(){let stdout=await run("powershell.ex
2431
2431
  pi auth print-bearer-token [--provider <provider>] [--model <model>] [--min-expiry <duration>]
2432
2432
  pi auth check [--provider <provider>] [--model <model>] [--json] [--credentials] [--no-refresh]
2433
2433
 
2434
- 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 existsSync36}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join71}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync36(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(join71(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(!existsSync36(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join71(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync36(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-2FXWPM2U.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-2FXWPM2U.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-2HNDZGTR.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-HTYYQBSG.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-CVAPK2WQ.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat11}from"node:fs/promises";import{resolve as resolve40}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve40(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
2434
+ 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 existsSync36}from"node:fs";import{readdir as readdir3}from"node:fs/promises";import{join as join71}from"node:path";function isMoved(session,cwd,current){return!session.cwd||resolvePath(session.cwd)===cwd||existsSync36(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(join71(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(!existsSync36(root))return[];let own=normalizePath(getDefaultSessionDir(cwd)),sessions2=[];for(let entry of await readdir3(root,{withFileTypes:!0})){if(!entry.isDirectory())continue;let dir=join71(root,entry.name);if(normalizePath(dir)===own)continue;let recorded=await recordedCwd(dir);recorded===void 0||existsSync36(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-MGFHGI5O.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-MGFHGI5O.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-SZWKEC36.js");return await handleAppServerCommand(args)}async function dispatchHostCommand(args){if(args[0]!==HOST_COMMAND_ARGV)return;let{runHostCommand:runHostCommand2}=await import("./host-command-X64D7PT3.js");return await runHostCommand2(args.slice(1))}async function dispatchScheduleCommand(args){if(args[0]!==SCHEDULE_COMMAND_ARGV)return;let{runScheduleCommand}=await import("./schedule-command-EQ4PQCRP.js");return await runScheduleCommand(args.slice(1))}import{access as access5,readFile as readFile19,stat as stat11}from"node:fs/promises";import{resolve as resolve40}from"path";async function processFileArguments(fileArgs,options){let autoResizeImages=options?.autoResizeImages??!0,text2="",images=[];for(let fileArg of fileArgs){let absolutePath=resolve40(resolveReadPath(fileArg,process.cwd()));try{await access5(absolutePath)}catch{console.error(source_default.red(`Error: File not found: ${absolutePath}`)),process.exit(1)}if((await stat11(absolutePath)).size===0)continue;let mimeType=await detectSupportedImageMimeTypeFromFile(absolutePath);if(mimeType){let content=await readFile19(absolutePath),processed=await processImage(content,mimeType,{autoResizeImages});if(!processed.ok){text2+=`<file name="${absolutePath}">${processed.message}</file>
2435
2435
  `;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(`
2436
2436
  `)}</file>
2437
2437
  `:text2+=`<file name="${absolutePath}"></file>
@@ -2473,7 +2473,7 @@ ${approval} at:
2473
2473
  https://huggingface.co/${details.id}
2474
2474
 
2475
2475
  The llama.cpp server needs HF_TOKEN with access.`,["Continue","Back"])!=="Continue")return}let quantization=parsed.quantization;if(!quantization&&details.quantizations.length>0){let options=details.quantizations.map(entry=>{let detail=[entry.size===void 0?void 0:formatBytes2(entry.size),entry.name==="Q4_K_M"?"recommended":void 0].filter(value2=>!!value2).join(" \xB7 ");return detail?`${entry.name} \xB7 ${detail}`:entry.name}),choice=await ui.select(`Select quantization
2476
- ${details.id}`,options);if(!choice||(quantization=details.quantizations[options.indexOf(choice)]?.name,!quantization))return}let model=quantization?`${details.id}:${quantization}`:details.id,result3=await runWithProgress(ui,{title:"Downloading model",model,initialMessage:"Starting\u2026",cancelTitle:"Stop download?",cancelMessage:model,run:(signal,update)=>client.downloadAndWait(model,update,signal),cancel:()=>client.unload(model)});result3.cancelled||(await syncCatalog(ctx,client,result3.value),ctx.ui.notify(`Downloaded ${model}`))};pi.registerCommand("llama",{description:"Manage llama.cpp router models",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify("/llama is available in interactive mode","warning");return}let client=await configuredClient(ctx);client&&await showLlamaUi(ctx,async ui=>{let readCatalog=async()=>{for(;;)try{return await syncCatalog(ctx,client)}catch(error2){if(await ui.connectionError(client.serverUrl,connectionErrorMessage(error2))==="close")return}},catalog=await readCatalog();if(catalog)for(;;){let action=await ui.showModels(client.serverUrl,catalog);if(action.type==="close")return;let actionError;try{action.type==="download"?await downloadModel(ctx,ui,client):modelIsLoaded(action.model)?await unloadModel(ctx,ui,client,action.model):action.model.status.value==="unloaded"?await loadModel(ctx,ui,client,catalog,action.model):ctx.ui.notify(`${action.model.id} is ${action.model.status.value}`,"warning")}catch(error2){actionError=error2}let refreshed=await readCatalog();if(!refreshed)return;catalog=refreshed,actionError&&!isConnectionError(actionError)&&ctx.ui.notify(actionError instanceof Error?actionError.message:String(actionError),"error")}})}})}var builtInExtensions=[{name:"llama.cpp",factory:llamaExtension,builtin:!0}];import{homedir as homedir14}from"os";import{join as join74}from"path";var SOURCE_MODULE_PATTERN=/\.(ts|mts|cts|tsx)$/;function isFromSourceRun(moduleUrl=import.meta.url,bunBinary=isBunBinary){return!bunBinary&&SOURCE_MODULE_PATTERN.test(moduleUrl)}function targetsRealUserAgentDir(agentDir,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir14()){return!envAgentDir&&agentDir===join74(homeDir,CONFIG_DIR_NAME,"agent")}function getFromSourceRealConfigWarning(agentDir,moduleUrl=import.meta.url,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir14(),bunBinary=isBunBinary){if(!(!isFromSourceRun(moduleUrl,bunBinary)||!targetsRealUserAgentDir(agentDir,envAgentDir,homeDir)))return`Warning: running from source against the real user config (${agentDir}). Set ${ENV_AGENT_DIR} to an isolated directory for dev and QA runs.`}import{copyFileSync as copyFileSync2,existsSync as existsSync39,mkdirSync as mkdirSync20,readFileSync as readFileSync41,statSync as statSync21}from"node:fs";import{homedir as homedir15}from"node:os";import{join as join77}from"node:path";import{constants as constants10,cpSync as cpSync3,existsSync as existsSync38,mkdirSync as mkdirSync18,readdirSync as readdirSync10,realpathSync as realpathSync9}from"node:fs";import{basename as basename26,dirname as dirname45,isAbsolute as isAbsolute22,join as join75,relative as relative19,resolve as resolve41}from"node:path";var REGENERABLE_ENTRIES=new Set(["cache","logs","tmp","migrations-state.json"]);function isRegenerableEntry(entry){return REGENERABLE_ENTRIES.has(entry)||entry.endsWith(".log")}function pathsPointToSameLocation(leftPath,rightPath){try{return realpathSync9(leftPath)===realpathSync9(rightPath)}catch(error2){if(isMissingPathError2(error2))return!1;throw error2}}function canonicalPath(path15){let absolute=resolve41(path15);if(existsSync38(absolute))return realpathSync9(absolute);let parent=dirname45(absolute);return parent===absolute?absolute:join75(canonicalPath(parent),basename26(absolute))}function isWithinOrSamePath(childPath,parentPath){let relativePath=relative19(canonicalPath(parentPath),canonicalPath(childPath));return relativePath===""||!relativePath.startsWith("..")&&!isAbsolute22(relativePath)}function isMissingPathError2(error2){return error2 instanceof Error&&"code"in error2&&(error2.code==="ENOENT"||error2.code==="ENOTDIR")}function copyMissingEntries(source2,target,include){let entries;try{entries=readdirSync10(source2)}catch(error2){if(isMissingPathError2(error2))return[];throw error2}let copied=[];for(let entry of entries)if(!(!include(entry)||existsSync38(join75(target,entry))))try{mkdirSync18(target,{recursive:!0}),cpSync3(join75(source2,entry),join75(target,entry),{recursive:!0,force:!1,errorOnExist:!1,preserveTimestamps:!0,mode:constants10.COPYFILE_FICLONE}),copied.push(entry)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Could not copy ${join75(source2,entry)} \u2192 ${join75(target,entry)}: ${reason}`))}return copied}import{mkdirSync as mkdirSync19,readFileSync as readFileSync40,renameSync as renameSync14,rmSync as rmSync11,writeFileSync as writeFileSync20}from"node:fs";import{join as join76}from"node:path";var MIGRATIONS_STATE_SCHEMA_VERSION=1,MIGRATIONS_STATE_FILENAME="migrations-state.json",SCAN_MIGRATIONS=["migrateLegacySenpiDirs","migrateSessionsFromAgentRoot","restoreDrainedPiDirs"],SCAN_MIGRATION_NAMES=new Set(SCAN_MIGRATIONS);function isScanMigrationName(value2){return SCAN_MIGRATION_NAMES.has(value2)}function isRecord52(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isStringArray3(value2){return Array.isArray(value2)&&value2.every(entry=>typeof entry=="string")}function readState(agentDir){let parsed;try{parsed=JSON.parse(readFileSync40(join76(agentDir,MIGRATIONS_STATE_FILENAME),"utf-8"))}catch{return}if(!(!isRecord52(parsed)||parsed.schemaVersion!==MIGRATIONS_STATE_SCHEMA_VERSION))return parsed}function completedOf(state){let completed=state?.completed;return isStringArray3(completed)?completed.filter(name=>isScanMigrationName(name)):[]}function readCompletedScanMigrations(agentDir=getAgentDir()){return new Set(completedOf(readState(agentDir)))}function writeCompletedScanMigrations(completed,agentDir=getAgentDir()){writeState(agentDir,{...readState(agentDir),completed:[...completed]})}function isMtimeEntry(entry){return typeof entry[1]=="number"&&Number.isFinite(entry[1])}function readLegacyPiAgentDirRecord(agentDir=getAgentDir()){let raw=readState(agentDir)?.legacyPiAgentDir;if(!isRecord52(raw))return{noticedMtimes:{}};let noticedMtimes=isRecord52(raw.noticedMtimes)?Object.fromEntries(Object.entries(raw.noticedMtimes).filter(isMtimeEntry)):{},copiedAt=raw.copiedAt;return typeof copiedAt=="number"&&Number.isFinite(copiedAt)?{copiedAt,noticedMtimes}:{noticedMtimes}}function writeLegacyPiAgentDirRecord(record7,agentDir=getAgentDir()){let state=readState(agentDir);writeState(agentDir,{...state,completed:completedOf(state),legacyPiAgentDir:record7})}function recordLegacyPiAgentDirCopy(agentDir=getAgentDir(),copiedAt=Date.now()){writeLegacyPiAgentDirRecord({copiedAt,noticedMtimes:{}},agentDir)}function writeState(agentDir,fields){mkdirSync19(agentDir,{recursive:!0});let target=join76(agentDir,MIGRATIONS_STATE_FILENAME),temporary=`${target}.${process.pid}.tmp`,payload={schemaVersion:MIGRATIONS_STATE_SCHEMA_VERSION,...fields};try{writeFileSync20(temporary,`${JSON.stringify(payload,null,2)}
2476
+ ${details.id}`,options);if(!choice||(quantization=details.quantizations[options.indexOf(choice)]?.name,!quantization))return}let model=quantization?`${details.id}:${quantization}`:details.id,result3=await runWithProgress(ui,{title:"Downloading model",model,initialMessage:"Starting\u2026",cancelTitle:"Stop download?",cancelMessage:model,run:(signal,update)=>client.downloadAndWait(model,update,signal),cancel:()=>client.unload(model)});result3.cancelled||(await syncCatalog(ctx,client,result3.value),ctx.ui.notify(`Downloaded ${model}`))};pi.registerCommand("llama",{description:"Manage llama.cpp router models",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify("/llama is available in interactive mode","warning");return}let client=await configuredClient(ctx);client&&await showLlamaUi(ctx,async ui=>{let readCatalog=async()=>{for(;;)try{return await syncCatalog(ctx,client)}catch(error2){if(await ui.connectionError(client.serverUrl,connectionErrorMessage(error2))==="close")return}},catalog=await readCatalog();if(catalog)for(;;){let action=await ui.showModels(client.serverUrl,catalog);if(action.type==="close")return;let actionError;try{action.type==="download"?await downloadModel(ctx,ui,client):modelIsLoaded(action.model)?await unloadModel(ctx,ui,client,action.model):action.model.status.value==="unloaded"?await loadModel(ctx,ui,client,catalog,action.model):ctx.ui.notify(`${action.model.id} is ${action.model.status.value}`,"warning")}catch(error2){actionError=error2}let refreshed=await readCatalog();if(!refreshed)return;catalog=refreshed,actionError&&!isConnectionError(actionError)&&ctx.ui.notify(actionError instanceof Error?actionError.message:String(actionError),"error")}})}})}var builtInExtensions=[{name:"llama.cpp",factory:llamaExtension,builtin:!0}];import{homedir as homedir14}from"os";import{join as join74}from"path";var SOURCE_MODULE_PATTERN=/\.(ts|mts|cts|tsx)$/;function isFromSourceRun(moduleUrl=import.meta.url,bunBinary=isBunBinary){return!bunBinary&&SOURCE_MODULE_PATTERN.test(moduleUrl)}function targetsRealUserAgentDir(agentDir,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir14()){return!envAgentDir&&agentDir===join74(homeDir,CONFIG_DIR_NAME,"agent")}function getFromSourceRealConfigWarning(agentDir,moduleUrl=import.meta.url,envAgentDir=process.env[ENV_AGENT_DIR],homeDir=homedir14(),bunBinary=isBunBinary){if(!(!isFromSourceRun(moduleUrl,bunBinary)||!targetsRealUserAgentDir(agentDir,envAgentDir,homeDir)))return`Warning: running from source against the real user config (${agentDir}). Set ${ENV_AGENT_DIR} to an isolated directory for dev and QA runs.`}import{copyFileSync as copyFileSync2,existsSync as existsSync39,mkdirSync as mkdirSync20,readFileSync as readFileSync41,statSync as statSync21}from"node:fs";import{homedir as homedir15}from"node:os";import{join as join77}from"node:path";import{constants as constants10,cpSync as cpSync3,existsSync as existsSync38,mkdirSync as mkdirSync18,readdirSync as readdirSync10,realpathSync as realpathSync9}from"node:fs";import{basename as basename26,dirname as dirname45,isAbsolute as isAbsolute23,join as join75,relative as relative19,resolve as resolve41}from"node:path";var REGENERABLE_ENTRIES=new Set(["cache","logs","tmp","migrations-state.json"]);function isRegenerableEntry(entry){return REGENERABLE_ENTRIES.has(entry)||entry.endsWith(".log")}function pathsPointToSameLocation(leftPath,rightPath){try{return realpathSync9(leftPath)===realpathSync9(rightPath)}catch(error2){if(isMissingPathError2(error2))return!1;throw error2}}function canonicalPath(path15){let absolute=resolve41(path15);if(existsSync38(absolute))return realpathSync9(absolute);let parent=dirname45(absolute);return parent===absolute?absolute:join75(canonicalPath(parent),basename26(absolute))}function isWithinOrSamePath(childPath,parentPath){let relativePath=relative19(canonicalPath(parentPath),canonicalPath(childPath));return relativePath===""||!relativePath.startsWith("..")&&!isAbsolute23(relativePath)}function isMissingPathError2(error2){return error2 instanceof Error&&"code"in error2&&(error2.code==="ENOENT"||error2.code==="ENOTDIR")}function copyMissingEntries(source2,target,include){let entries;try{entries=readdirSync10(source2)}catch(error2){if(isMissingPathError2(error2))return[];throw error2}let copied=[];for(let entry of entries)if(!(!include(entry)||existsSync38(join75(target,entry))))try{mkdirSync18(target,{recursive:!0}),cpSync3(join75(source2,entry),join75(target,entry),{recursive:!0,force:!1,errorOnExist:!1,preserveTimestamps:!0,mode:constants10.COPYFILE_FICLONE}),copied.push(entry)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Could not copy ${join75(source2,entry)} \u2192 ${join75(target,entry)}: ${reason}`))}return copied}import{mkdirSync as mkdirSync19,readFileSync as readFileSync40,renameSync as renameSync14,rmSync as rmSync11,writeFileSync as writeFileSync20}from"node:fs";import{join as join76}from"node:path";var MIGRATIONS_STATE_SCHEMA_VERSION=1,MIGRATIONS_STATE_FILENAME="migrations-state.json",SCAN_MIGRATIONS=["migrateLegacySenpiDirs","migrateSessionsFromAgentRoot","restoreDrainedPiDirs"],SCAN_MIGRATION_NAMES=new Set(SCAN_MIGRATIONS);function isScanMigrationName(value2){return SCAN_MIGRATION_NAMES.has(value2)}function isRecord52(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isStringArray3(value2){return Array.isArray(value2)&&value2.every(entry=>typeof entry=="string")}function readState(agentDir){let parsed;try{parsed=JSON.parse(readFileSync40(join76(agentDir,MIGRATIONS_STATE_FILENAME),"utf-8"))}catch{return}if(!(!isRecord52(parsed)||parsed.schemaVersion!==MIGRATIONS_STATE_SCHEMA_VERSION))return parsed}function completedOf(state){let completed=state?.completed;return isStringArray3(completed)?completed.filter(name=>isScanMigrationName(name)):[]}function readCompletedScanMigrations(agentDir=getAgentDir()){return new Set(completedOf(readState(agentDir)))}function writeCompletedScanMigrations(completed,agentDir=getAgentDir()){writeState(agentDir,{...readState(agentDir),completed:[...completed]})}function isMtimeEntry(entry){return typeof entry[1]=="number"&&Number.isFinite(entry[1])}function readLegacyPiAgentDirRecord(agentDir=getAgentDir()){let raw=readState(agentDir)?.legacyPiAgentDir;if(!isRecord52(raw))return{noticedMtimes:{}};let noticedMtimes=isRecord52(raw.noticedMtimes)?Object.fromEntries(Object.entries(raw.noticedMtimes).filter(isMtimeEntry)):{},copiedAt=raw.copiedAt;return typeof copiedAt=="number"&&Number.isFinite(copiedAt)?{copiedAt,noticedMtimes}:{noticedMtimes}}function writeLegacyPiAgentDirRecord(record7,agentDir=getAgentDir()){let state=readState(agentDir);writeState(agentDir,{...state,completed:completedOf(state),legacyPiAgentDir:record7})}function recordLegacyPiAgentDirCopy(agentDir=getAgentDir(),copiedAt=Date.now()){writeLegacyPiAgentDirRecord({copiedAt,noticedMtimes:{}},agentDir)}function writeState(agentDir,fields){mkdirSync19(agentDir,{recursive:!0});let target=join76(agentDir,MIGRATIONS_STATE_FILENAME),temporary=`${target}.${process.pid}.tmp`,payload={schemaVersion:MIGRATIONS_STATE_SCHEMA_VERSION,...fields};try{writeFileSync20(temporary,`${JSON.stringify(payload,null,2)}
2477
2477
  `),renameSync14(temporary,target)}catch{try{rmSync11(temporary,{force:!0})}catch{}}}var LEGACY_PI_CONFIG_FILES=["auth.json","keybindings.json","models.json","settings.json"];function isLegacyPiConfigFile(name){return LEGACY_PI_CONFIG_FILES.some(file=>file===name)}function dirsFor(options){return{agentDir:options.agentDir??getAgentDir(),piAgentDir:join77(options.homeDir??homedir15(),".pi","agent")}}function hasSeparatePiAgentDir(dirs){return CONFIG_DIR_NAME===".pi"||!existsSync39(dirs.piAgentDir)?!1:!existsSync39(dirs.agentDir)||!pathsPointToSameLocation(dirs.piAgentDir,dirs.agentDir)}function fileStat(path15){try{let stat12=statSync21(path15);return stat12.isFile()?stat12:void 0}catch(error2){if(error2 instanceof Error&&"code"in error2&&(error2.code==="ENOENT"||error2.code==="ENOTDIR"))return;throw error2}}function editOf(file,dirs,copiedAt){let piPath=join77(dirs.piAgentDir,file),agentPath=join77(dirs.agentDir,file),pi=fileStat(piPath);if(pi===void 0)return;let agent=fileStat(agentPath),baseline=copiedAt??agent?.mtimeMs??0;if(!(pi.mtimeMs<=baseline)&&!(agent!==void 0&&readFileSync41(piPath).equals(readFileSync41(agentPath))))return{file,piPath,agentPath,mtimeMs:pi.mtimeMs}}function editsIn(dirs,copiedAt){return hasSeparatePiAgentDir(dirs)?LEGACY_PI_CONFIG_FILES.flatMap(file=>editOf(file,dirs,copiedAt)??[]):[]}function findLegacyPiEdits(options={}){let dirs=dirsFor(options);return editsIn(dirs,readLegacyPiAgentDirRecord(dirs.agentDir).copiedAt)}function takeLegacyPiEditNotice(options={}){let dirs=dirsFor(options),record7=readLegacyPiAgentDirRecord(dirs.agentDir),unreported=editsIn(dirs,record7.copiedAt).filter(edit=>record7.noticedMtimes[edit.file]!==edit.mtimeMs);if(unreported.length>0){let noticed=Object.fromEntries(unreported.map(edit=>[edit.file,edit.mtimeMs]));writeLegacyPiAgentDirRecord({...record7,noticedMtimes:{...record7.noticedMtimes,...noticed}},dirs.agentDir)}return unreported}function formatLegacyPiEditNotice(edits,agentDir){let files=edits.map(edit=>edit.file).join(" "),command=`${APP_COMMAND} config import-pi ${files}`,[only]=edits;return edits.length===1&&only!==void 0?`You edited ${only.piPath} after ${APP_NAME} moved to ${agentDir}; ${APP_NAME} reads ${only.agentPath}. Copy your change there (or run: ${command}).`:`You edited ${edits.map(edit=>edit.piPath).join(", ")} after ${APP_NAME} moved to ${agentDir}; ${APP_NAME} reads its config from ${agentDir}. Copy your changes there (or run: ${command}).`}function legacyPiEditStartupNotice(options={}){try{let edits=takeLegacyPiEditNotice(options);return edits.length>0?formatLegacyPiEditNotice(edits,dirsFor(options).agentDir):void 0}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return`Could not check ${dirsFor(options).piAgentDir} for config edits: ${reason}`}}function backupSuffix(now2){return now2.toISOString().replace(/[-:.]/g,"")}function importOne(file,dirs,now2){if(!isLegacyPiConfigFile(file))return{file,reason:`not one of ${LEGACY_PI_CONFIG_FILES.join(", ")}`};let from=join77(dirs.piAgentDir,file),to=join77(dirs.agentDir,file);if(fileStat(from)===void 0)return{file,reason:`${from} does not exist`};mkdirSync20(dirs.agentDir,{recursive:!0});let backupPath;return fileStat(to)!==void 0&&(backupPath=`${to}.bak-${backupSuffix(now2)}`,copyFileSync2(to,backupPath)),copyFileSync2(from,to),backupPath===void 0?{file,from,to}:{file,from,to,backupPath}}function importLegacyPiConfig(files,options={}){let dirs=dirsFor(options);if(!hasSeparatePiAgentDir(dirs))return{...dirs,imported:[],failures:[{file:dirs.piAgentDir,reason:"no separate pi config to import"}]};let requested=files.length>0?files:findLegacyPiEdits(options).map(edit=>edit.file),imported=[],failures=[];for(let file of requested){let outcome=importOne(file,dirs,options.now??new Date);"reason"in outcome?failures.push(outcome):imported.push(outcome)}return{...dirs,imported,failures}}import{existsSync as existsSync44,mkdirSync as mkdirSync23,readdirSync as readdirSync15,readFileSync as readFileSync43,renameSync as renameSync17,rmSync as rmSync13,writeFileSync as writeFileSync22}from"fs";import{dirname as dirname47,join as join82}from"path";import{cpSync as cpSync4,existsSync as existsSync40,mkdirSync as mkdirSync21,readdirSync as readdirSync11,writeFileSync as writeFileSync21}from"node:fs";import{homedir as homedir16}from"node:os";import{join as join78}from"node:path";var MIGRATION_MARKER=".migrated-from-senpi",SKIPPED_ENTRIES=new Set(["cache","logs","omo-local-update"]);function isSkipped(entry){return SKIPPED_ENTRIES.has(entry)||entry.endsWith(".log")}function migrateEngineStateToBrandDir(legacyAgentDir,brandDir){let result3={migrated:!1,copied:[],from:legacyAgentDir,to:brandDir};if(!existsSync40(legacyAgentDir)||existsSync40(join78(brandDir,MIGRATION_MARKER))||existsSync40(join78(brandDir,FLAT_LAYOUT_SENTINEL)))return result3;let entries;try{entries=readdirSync11(legacyAgentDir)}catch{return result3}mkdirSync21(brandDir,{recursive:!0});let copied=[];for(let entry of entries){if(isSkipped(entry))continue;let target=join78(brandDir,entry);if(!existsSync40(target))try{cpSync4(join78(legacyAgentDir,entry),target,{recursive:!0,errorOnExist:!1}),copied.push(entry)}catch{}}try{writeFileSync21(join78(brandDir,MIGRATION_MARKER),`${legacyAgentDir}
2478
2478
  `)}catch{return{...result3,copied}}return{migrated:!0,copied,from:legacyAgentDir,to:brandDir}}function migrateEngineStateForBrand(homeDir=homedir16()){if(!CONFIG_FLAT_LAYOUT)return;let result3=migrateEngineStateToBrandDir(join78(homeDir,".senpi","agent"),join78(homeDir,CONFIG_DIR_NAME));return result3.migrated&&result3.copied.length>0&&(console.log(source_default.green(`Copied existing settings from ${result3.from} to ${result3.to}`)),console.log(source_default.dim("The original directory is untouched; the two installs keep separate state from now on."))),result3}import{existsSync as existsSync41,readdirSync as readdirSync12,renameSync as renameSync15}from"fs";import{join as join79}from"path";function migrateCommandsToPrompts(baseDir,label3){let commandsDir=join79(baseDir,"commands"),promptsDir=join79(baseDir,"prompts");if(existsSync41(commandsDir)&&!existsSync41(promptsDir))try{return renameSync15(commandsDir,promptsDir),console.log(source_default.green(`Migrated ${label3} commands/ \u2192 prompts/`)),!0}catch(err2){console.log(source_default.yellow(`Warning: Could not migrate ${label3} commands/ to prompts/: ${err2 instanceof Error?err2.message:err2}`))}return!1}function checkDeprecatedExtensionDirs(baseDir,label3){let hooksDir=join79(baseDir,"hooks"),toolsDir=join79(baseDir,"tools"),warnings=[];if(existsSync41(hooksDir)&&warnings.push(`${label3} hooks/ directory found. Hooks have been renamed to extensions.`),existsSync41(toolsDir))try{readdirSync12(toolsDir).filter(entry=>existsSync41(join79(toolsDir,entry,"index.ts"))).length>0&&warnings.push(`${label3} tools/ directory contains custom tools. Custom tools have been merged into extensions.`)}catch{return warnings}return warnings}function migrateExtensionSystem(cwd){let agentDir=getAgentDir(),projectDir=join79(cwd,CONFIG_DIR_NAME);return migrateCommandsToPrompts(agentDir,"Global"),migrateCommandsToPrompts(projectDir,"Project"),[...checkDeprecatedExtensionDirs(agentDir,"Global"),...checkDeprecatedExtensionDirs(projectDir,"Project")]}import os6 from"node:os";import{existsSync as existsSync42,mkdirSync as mkdirSync22,readdirSync as readdirSync13,renameSync as renameSync16}from"fs";import{dirname as dirname46,join as join80}from"path";function copyLegacyDir({from,to,label:label3,isAgentConfig}){copyMissingEntries(from,to,entry=>!isRegenerableEntry(entry)).length!==0&&(console.log(source_default.green(`Copied ${label3} ${from} \u2192 ${to}`)),isAgentConfig?(recordLegacyPiAgentDirCopy(to),console.log(source_default.dim(`${APP_NAME} reads its config from ${to} now; edits to ${from} no longer reach ${APP_NAME}.`))):console.log(source_default.dim("The original directory is untouched; the two installs keep separate state from now on.")))}function moveLegacyDir({from,to,label:label3}){if(!existsSync42(to)){mkdirSync22(dirname46(to),{recursive:!0}),renameSync16(from,to),console.log(source_default.green(`Migrated ${label3} ${from} \u2192 ${to}`));return}let movedAny=!1;for(let entry of readdirSync13(from)){let target=join80(to,entry);existsSync42(target)||(renameSync16(join80(from,entry),target),movedAny=!0)}movedAny&&console.log(source_default.green(`Migrated missing ${label3} entries ${from} \u2192 ${to}`))}function transferLegacyDir(dir){if(existsSync42(dir.from)&&!(existsSync42(dir.to)&&pathsPointToSameLocation(dir.from,dir.to)))try{switch(dir.transfer){case"copy":copyLegacyDir(dir);return;case"move":moveLegacyDir(dir);return}}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Skipped the ${dir.label} ${dir.from}: ${reason}`))}}function migrateLegacySenpiDirs(cwd){if(CONFIG_DIR_NAME===".pi")return;let homeDir=os6.homedir(),globalNewAgentDir=getAgentDir(),globalNewMomDir=join80(homeDir,CONFIG_DIR_NAME,"mom"),projectNewDir=join80(cwd,CONFIG_DIR_NAME),shouldMigrateHomeConfig=isWithinOrSamePath(globalNewAgentDir,join80(homeDir,CONFIG_DIR_NAME)),dirs=[{from:join80(cwd,".pi"),to:projectNewDir,label:"project config directory",transfer:"copy"},{from:join80(cwd,CONFIG_DIR_NAME,".pi"),to:projectNewDir,label:"nested project config directory",transfer:"move"}];shouldMigrateHomeConfig&&dirs.unshift({from:join80(homeDir,".pi","agent"),to:globalNewAgentDir,label:"global agent directory",transfer:"copy",isAgentConfig:!0},{from:join80(homeDir,CONFIG_DIR_NAME,".pi","agent"),to:globalNewAgentDir,label:"nested global agent directory",transfer:"move"},{from:join80(homeDir,".pi","mom"),to:globalNewMomDir,label:"global mom directory",transfer:"copy"},{from:join80(homeDir,CONFIG_DIR_NAME,".pi","mom"),to:globalNewMomDir,label:"nested global mom directory",transfer:"move"});for(let dir of dirs)transferLegacyDir(dir)}import{existsSync as existsSync43,lstatSync as lstatSync7,readdirSync as readdirSync14,readFileSync as readFileSync42,rmSync as rmSync12,statSync as statSync22}from"node:fs";import{homedir as homedir17}from"node:os";import{join as join81}from"node:path";var UPSTREAM_PI_AGENT_ENTRIES=new Set(["auth.json","settings.json","models.json","models-store.json","keybindings.json","sessions","extensions","skills","prompts","themes","npm","git","experimental","AGENTS.md","CLAUDE.md","SYSTEM.md","APPEND_SYSTEM.md"]);function isDirectory(path15){return existsSync43(path15)&&statSync22(path15).isDirectory()}function movingMigrationMayHaveRun(agentDir,completed){return completed.has("migrateLegacySenpiDirs")?!0:existsSync43(join81(agentDir,MIGRATIONS_STATE_FILENAME))?!1:isDirectory(agentDir)&&readdirSync14(agentDir).some(entry=>UPSTREAM_PI_AGENT_ENTRIES.has(entry))}function isEmptyJsonStub(path15){let stat12=lstatSync7(path15);if(!stat12.isFile()||stat12.size>16)return!1;let text2=readFileSync42(path15,"utf-8").trim();return text2==="{}"||text2==="[]"}function holdsNoUserState(dir){return existsSync43(dir)?readdirSync14(dir).every(entry=>isRegenerableEntry(entry)||isEmptyJsonStub(join81(dir,entry))):!0}function restoreDir(from,to,include){if(!isDirectory(from)||!holdsNoUserState(to)||existsSync43(to)&&pathsPointToSameLocation(from,to))return!1;for(let entry of existsSync43(to)?readdirSync14(to):[])include(entry)&&existsSync43(join81(from,entry))&&isEmptyJsonStub(join81(to,entry))&&rmSync12(join81(to,entry));let restored=copyMissingEntries(from,to,include);return restored.length>0&&(console.log(source_default.green(`Restored ${to} from ${from}: an earlier start had moved it there.`)),console.log(source_default.dim("Both directories now hold independent copies."))),restored.length>0}function restoreDrainedPiDirs(completed,homeDir=homedir17()){if(CONFIG_DIR_NAME===".pi")return;let agentDir=getAgentDir(),brandDir=join81(homeDir,CONFIG_DIR_NAME),piDir=join81(homeDir,".pi");if(!(!isWithinOrSamePath(agentDir,brandDir)||!isDirectory(piDir))&&movingMigrationMayHaveRun(agentDir,completed))try{restoreDir(agentDir,join81(piDir,"agent"),entry=>UPSTREAM_PI_AGENT_ENTRIES.has(entry))&&recordLegacyPiAgentDirCopy(agentDir),restoreDir(join81(brandDir,"mom"),join81(piDir,"mom"),entry=>!isRegenerableEntry(entry))}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);console.warn(source_default.yellow(`Could not restore ${piDir}: ${reason}`))}}var MIGRATION_GUIDE_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration",EXTENSIONS_DOC_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md";function migrateAuthToAuthJson(){let agentDir=getAgentDir(),authPath=join82(agentDir,"auth.json"),oauthPath=join82(agentDir,"oauth.json"),settingsPath=join82(agentDir,"settings.json");if(existsSync44(authPath))return[];let migrated={},providers=[];if(existsSync44(oauthPath))try{let oauth=JSON.parse(stripBom(readFileSync43(oauthPath,"utf-8")));for(let[provider,cred]of Object.entries(oauth))migrated[provider]={type:"oauth",...cred},providers.push(provider);renameSync17(oauthPath,`${oauthPath}.migrated`)}catch{}if(existsSync44(settingsPath))try{let content=readFileSync43(settingsPath,"utf-8"),settings=JSON.parse(stripBom(content));if(settings.apiKeys&&typeof settings.apiKeys=="object"){for(let[provider,key]of Object.entries(settings.apiKeys))!migrated[provider]&&typeof key=="string"&&(migrated[provider]={type:"api_key",key},providers.push(provider));delete settings.apiKeys,writeFileSync22(settingsPath,JSON.stringify(settings,null,2))}}catch{}return Object.keys(migrated).length>0&&(mkdirSync23(dirname47(authPath),{recursive:!0}),writeFileSync22(authPath,JSON.stringify(migrated,null,2),{mode:384})),providers}function migrateSessionsFromAgentRoot(){let agentDir=getAgentDir(),files;try{files=readdirSync15(agentDir).filter(f=>f.endsWith(".jsonl")).map(f=>join82(agentDir,f))}catch{return}if(files.length!==0)for(let file of files)try{let firstLine2=readFileSync43(file,"utf8").split(`
2479
2479
  `)[0];if(!firstLine2?.trim())continue;let header2=JSON.parse(firstLine2);if(header2.type!=="session"||!header2.cwd)continue;let safePath=`--${header2.cwd.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`,correctDir=join82(agentDir,"sessions",safePath);existsSync44(correctDir)||mkdirSync23(correctDir,{recursive:!0});let fileName=file.split("/").pop()||file.split("\\").pop(),newPath=join82(correctDir,fileName);if(existsSync44(newPath))continue;renameSync17(file,newPath)}catch{}}function migrateKeybindingsConfigFile(){let configPath=join82(getAgentDir(),"keybindings.json");if(existsSync44(configPath))try{let parsed=JSON.parse(stripBom(readFileSync43(configPath,"utf-8")));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let{config,migrated}=migrateKeybindingsConfig(parsed);if(!migrated)return;writeFileSync22(configPath,`${JSON.stringify(config,null,2)}
@@ -2490,11 +2490,11 @@ Press any key to continue...`)),await new Promise(resolve46=>{process.stdin.setR
2490
2490
  `)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});if(await session.waitForSettledSessionWork(),mode==="text"){let lastMessage=session.state.messages.findLast(message=>message.role==="assistant");if(lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted"){let described=describeProviderFailureForUser(assistantMsg.errorMessage);console.error(described??(stripTurnRetrySuppressionPrefix(assistantMsg.errorMessage??"")||`Request ${assistantMsg.stopReason}`)),exitCode=1}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
2491
2491
  `):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
2492
2492
  `),writeRawStdout(`${formatProviderNativeBody(content,!1)}
2493
- `))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync44}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync44(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat12=linuxStat(pid),tail=stat12?.slice(stat12.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat12=linuxStat(pid),open8=stat12?.indexOf("(")??-1,close=stat12?.lastIndexOf(")")??-1;return stat12===void 0||open8===-1||close<=open8?"":stat12.slice(open8+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-XZF6IKKO.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 existsSync45,mkdirSync as mkdirSync24,renameSync as renameSync18,rmSync as rmSync14}from"node:fs";import{basename as basename27,dirname as dirname48,join as join83,relative as relative20,resolve as resolve42,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path15){return toNamespacedPath(resolve42(path15))}function getQuarantineRoot(packageDir){let current=resolve42(packageDir);for(;;){if(basename27(current).toLowerCase()==="node_modules")return join83(current,QUARANTINE_DIR_NAME);let parent=dirname48(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join83(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join83(quarantineRunDir,relative20(resolvedPackageDir,loadedFile));mkdirSync24(dirname48(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(resolve46=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve46(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path: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(`
2493
+ `))}}return exitCode}catch(error2){return console.error(error2 instanceof Error?error2.message:String(error2)),1}finally{for(let cleanup of signalCleanupHandlers)cleanup();await disposeRuntime(),await flushRawStdout()}}import{readdirSync as readdirSync16,readFileSync as readFileSync44}from"node:fs";var P_PID=1,WNOHANG=1,WEXITED=4,WNOWAIT={darwin:32,linux:16777216},SI_PID_OFFSET={darwin:12,linux:16},MAX_TRACKED_CHILDREN=4096;function supportedPlatform(platform5){return platform5==="darwin"||platform5==="linux"?platform5:void 0}async function loadChildReaperSyscalls(platform5=process.platform){let supported=supportedPlatform(platform5);if(supported===void 0||typeof globalThis.Bun>"u")return;let{dlopen,FFIType,ptr}=await import("bun:ffi"),wait=dlopen(supported==="darwin"?"libSystem.B.dylib":"libc.so.6",{waitid:{args:[FFIType.i32,FFIType.u32,FFIType.ptr,FFIType.i32],returns:FFIType.i32},waitpid:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),info=new Uint8Array(512),infoView=new DataView(info.buffer),status=new Int32Array(1),peekOptions=WEXITED|WNOHANG|WNOWAIT[supported],siPidOffset=SI_PID_OFFSET[supported];return{listDirectChildren:supported==="darwin"?darwinChildren(dlopen,FFIType,ptr):linuxChildren,isWaitable(pid){return info.fill(0),wait.symbols.waitid(P_PID,pid,ptr(info),peekOptions)===0&&infoView.getInt32(siPidOffset,!0)===pid},reapExited(pid){if(pid<=0)throw new Error(`child reaper refuses to wait on pid ${pid}`);return wait.symbols.waitpid(pid,ptr(status),WNOHANG)===pid},describe:supported==="darwin"?darwinName(dlopen,FFIType,ptr):linuxName}}function darwinChildren(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_listchildpids:{args:[FFIType.i32,FFIType.ptr,FFIType.i32],returns:FFIType.i32}}),pids=new Int32Array(MAX_TRACKED_CHILDREN);return()=>{let found=libproc.symbols.proc_listchildpids(process.pid,ptr(pids),pids.byteLength);return found<=0?[]:Array.from(pids.subarray(0,Math.min(found,pids.length)))}}function darwinName(dlopen,FFIType,ptr){let libproc=dlopen("libSystem.B.dylib",{proc_name:{args:[FFIType.i32,FFIType.ptr,FFIType.u32],returns:FFIType.i32}}),name=new Uint8Array(256),decoder=new TextDecoder;return pid=>{name.fill(0);let written=libproc.symbols.proc_name(pid,ptr(name),name.length);return written<=0?"":decoder.decode(name.subarray(0,written))}}function linuxChildren(){let children=[];for(let entry of readdirSync16("/proc")){let pid=Number(entry);if(!(!Number.isInteger(pid)||pid<=0)&&(parentOf(pid)===process.pid&&children.push(pid),children.length>=MAX_TRACKED_CHILDREN))break}return children}function linuxStat(pid){try{return readFileSync44(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat12=linuxStat(pid),tail=stat12?.slice(stat12.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat12=linuxStat(pid),open8=stat12?.indexOf("(")??-1,close=stat12?.lastIndexOf(")")??-1;return stat12===void 0||open8===-1||close<=open8?"":stat12.slice(open8+1,close)}var CHILD_REAPER_ENV="SENPI_RPC_HOST_REAPER",CHILD_REAPER_MIN_WAITABLE_MS_ENV="SENPI_RPC_HOST_REAPER_MIN_WAITABLE_MS",MIN_WAITABLE_FLOOR_MS=5e3,DEFAULT_MIN_WAITABLE_MS=3e4,TICK_MS=1e3,WARN_INTERVAL_MS=5*6e4,WARN_AT_WAITING=10,TOP_NAMES=3;function resolveChildReaperConfig(env){let override=Number(env[CHILD_REAPER_MIN_WAITABLE_MS_ENV]);return{enabled:env[CHILD_REAPER_ENV]!=="0",tickMs:TICK_MS,minWaitableMs:Number.isFinite(override)&&override>0?clampWindow(override):DEFAULT_MIN_WAITABLE_MS}}function clampWindow(milliseconds){return Math.max(MIN_WAITABLE_FLOOR_MS,milliseconds)}function createChildReaper(options){let now2=options.now??Date.now,minWaitableMs=clampWindow(options.minWaitableMs??DEFAULT_MIN_WAITABLE_MS),tracked=new Map,lastWarnAt,report=(waiting,reaped)=>{options.log===void 0||reaped.length===0&&waiting.length<WARN_AT_WAITING||lastWarnAt!==void 0&&now2()-lastWarnAt<WARN_INTERVAL_MS||(lastWarnAt=now2(),options.log(`child reaper: reaped=${reaped.length} waiting=${waiting.length} top=${topNames(waiting,reaped)}`))};return{tick(){let children=options.syscalls.listDirectChildren(),present=new Set(children);for(let pid of[...tracked.keys()])present.has(pid)||tracked.delete(pid);let reaped=[];for(let pid of children){let child=tracked.get(pid)??{name:options.syscalls.describe(pid)||"unknown",waitableSince:void 0};if(tracked.set(pid,child),!options.syscalls.isWaitable(pid)){child.waitableSince=void 0;continue}if(child.waitableSince===void 0){child.waitableSince=now2();continue}now2()-child.waitableSince<minWaitableMs||options.syscalls.reapExited(pid)&&(tracked.delete(pid),reaped.push(child.name))}report(waitingNames(tracked),reaped)},get waitingPids(){return[...tracked].filter(([,child])=>child.waitableSince!==void 0).map(([pid])=>pid)}}}function waitingNames(tracked){return[...tracked.values()].filter(child=>child.waitableSince!==void 0).map(child=>child.name)}function topNames(waiting,reaped){let counts=new Map;for(let name of[...waiting,...reaped])counts.set(name,(counts.get(name)??0)+1);return[...counts].sort(([,left],[,right])=>right-left).slice(0,TOP_NAMES).map(([name,count])=>`${name} x${count}`).join(", ")}async function startHostChildReaper(log){let config=resolveChildReaperConfig(process.env);if(!config.enabled)return()=>{};let syscalls=await loadChildReaperSyscalls();if(syscalls===void 0)return log(`child reaper unavailable under ${runtimeName()}: children orphaned by a terminated worker thread stay as zombies until this host exits`),()=>{};let reaper=createChildReaper({syscalls,minWaitableMs:config.minWaitableMs,log}),timer=setInterval(()=>reaper.tick(),config.tickMs);return timer.unref(),()=>clearInterval(timer)}var orphanSyscalls;async function collectOrphanedChildren(pids){if(pids.length===0)return[];orphanSyscalls??=loadChildReaperSyscalls();let syscalls=await orphanSyscalls;return syscalls===void 0?[]:pids.filter(pid=>Number.isInteger(pid)&&pid>0&&syscalls.isWaitable(pid)&&syscalls.reapExited(pid))}function runtimeName(){return typeof globalThis.Bun>"u"?"Node":`Bun on ${process.platform}`}var INTERNAL_SUPERVISOR_ROUTE_FLAG="--internal-rpc-host-supervisor";async function dispatchInternalSupervisor(args){if(!args.includes(INTERNAL_SUPERVISOR_ROUTE_FLAG))return!1;let{findInternalSupervisorArgs,parseSupervisorArgs,runHostSupervisor}=await import("./host-lifecycle-GC3GIR2N.js"),supervisorArgs=findInternalSupervisorArgs(args);if(!supervisorArgs)return!1;let launch=parseSupervisorArgs(supervisorArgs);return launch||(console.error("invalid internal RPC host supervisor arguments"),process.exit(2)),await runHostSupervisor(launch),!0}import{randomUUID as randomUUID12}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync24,renameSync as renameSync18,rmSync as rmSync14}from"node:fs";import{basename as basename27,dirname as dirname48,join as join83,relative as relative20,resolve as resolve42,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path15){return toNamespacedPath(resolve42(path15))}function getQuarantineRoot(packageDir){let current=resolve42(packageDir);for(;;){if(basename27(current).toLowerCase()==="node_modules")return join83(current,QUARANTINE_DIR_NAME);let parent=dirname48(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath3(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath3(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync14(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath3(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join83(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID12()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join83(quarantineRunDir,relative20(resolvedPackageDir,loadedFile));mkdirSync24(dirname48(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(resolve46=>{let data="";process.stdin.setEncoding("utf8"),process.stdin.on("data",chunk=>{data+=chunk}),process.stdin.on("end",()=>{resolve46(data.trim()||void 0)}),process.stdin.resume()})}function collectAuthDiagnostics(authStorage,context){return authStorage.drainErrors().map(error2=>({type:"warning",message:`(${context}, auth storage) ${error2.message}`}))}function collectExtensionLoadDiagnostics(errors){return errors.map(({path: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(`
2494
2494
  `));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}
2495
2495
  `),!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}
2496
- `),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve46=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve46(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path15,sessionDir){try{return SessionManager.open(path15,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-R5N2EKUS.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return launchProfile?.retryFallback&&runtimeSettingsManager.applyOverrides({retry:{modelFallback:launchProfile.retryFallback.modelFallback,fallbackChains:Object.fromEntries(Object.entries(launchProfile.retryFallback.fallbackChains).map(([key,entries])=>[key,[...entries]]))}}),{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;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags2),writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-IIRFXBTO.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-HHIC6N7C.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join84(agentDir,"auth.json")),authPath:join84(agentDir,"auth.json"),agentDir,modelsPath:join84(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2497
- `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-K5YGBGQO.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-U7IH4VMJ.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve46=>setTimeout(resolve46,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve46=>process.stdout.once("drain",resolve46)),process.stderr.writableLength>0&&await new Promise(resolve46=>process.stderr.once("drain",resolve46)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4;function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve46=>setTimeout(resolve46,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve46=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve46()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve46()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve46,reject)=>{let onConnect=()=>{cleanup(),resolve46()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{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 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((resolve46,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46())})})}collectEvents(timeout=6e4){return new Promise((resolve46,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve46,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve46(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>deadline.extend(compacting?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage)}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2496
+ `),process.exitCode=result3.status==="ready"?0:result3.status==="not_ready"?1:2}catch(error2){let message=error2 instanceof AuthCommandError?error2.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,autoResizeImages,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text:text2,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text2,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localMatch=(sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd)).find(s=>s.id===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let localSessions=await SessionManager.list(cwd,sessionDir),localMatch=localSessions.find(s=>s.id===sessionArg)??localSessions.find(s=>s.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s=>s.id===sessionArg)??allSessions.find(s=>s.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve46=>{let rl=createInterface2({input:process.stdin,output:process.stdout}),settled=!1,settle=result3=>{settled||(settled=!0,resolve46(result3))};rl.question(`${message} [y/N] `,answer=>{let normalized2=answer.trim().toLowerCase();settle(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle(!1))})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateRebindFlags(parsed){if(!parsed.rebind)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.fork?"--fork":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0,parsed.sessionId!==void 0?"--session-id":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --rebind cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function openSessionOrExit(path15,sessionDir){try{return SessionManager.open(path15,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}async function rebindSessionOrExit(sourcePath,cwd,sessionDir){try{let reboundPath=await rebindSessionFile(sourcePath,cwd,sessionDir);return console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(reboundPath,sessionDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(source_default.red(`Error: ${message}`)),process.exit(1)}}function sessionCwdOrUndefined(sessionFile){try{return readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.rebind){let resolved=await resolveSessionPath(parsed.rebind,cwd,sessionDir);resolved.type==="not_found"&&(console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1));let sessionCwd=resolved.type==="global"?resolved.cwd:sessionCwdOrUndefined(resolved.path);return resolved.type==="local"||sessionCwd===void 0||resolvePath(sessionCwd)===resolvePath(cwd)?openSessionOrExit(resolved.path,sessionDir):(await classifySessionRepository(resolved.path,sessionCwd,cwd)==="different"&&(console.error(source_default.red(`Refusing to rebind: ${cwd} is a different git repository than ${sessionCwd}. Use --fork '${parsed.rebind}' to copy the session into this directory instead.`)),process.exit(1)),rebindSessionOrExit(resolved.path,cwd,sessionDir))}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":{let action=await chooseCrossProjectAction({sessionArg:parsed.session,sessionCwd:resolved.cwd,cwd,match:await classifySessionRepository(resolved.path,resolved.cwd,cwd),interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return action==="rebind"?rebindSessionOrExit(resolved.path,cwd,sessionDir):action==="fork"?forkSessionOrExit(resolved.path,cwd,sessionDir):(action==="abort"&&console.log(source_default.dim("Aborted.")),process.exit(action==="abort"?0:1))}case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let{selectSession}=await import("./session-picker-R5N2EKUS.js"),movedOptions=sessionDir===void 0?{}:{sessionDir},selectedPath=await selectSession(onProgress=>withMovedSessions(SessionManager.list(cwd,sessionDir,onProgress),cwd,movedOptions),async onProgress=>markMovedSessions(await SessionManager.listAll(sessionDir,onProgress),cwd),settingsManager);selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0));let target=await resolveResumeTarget({sessionPath:selectedPath,cwd,...movedOptions,confirm:selectedCwd=>(console.log(source_default.yellow(`Session found in different project: ${selectedCwd}`)),confirmSameRepositoryRebind({sessionArg:selectedPath,cwd,confirm:promptConfirm,out:line=>console.log(line)}))}).catch(error2=>(console.error(source_default.red(`Error: ${error2 instanceof Error?error2.message:String(error2)}`)),process.exit(1)));return target.rebound&&console.log(source_default.dim(`Session moved to ${cwd}`)),SessionManager.open(target.path,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue){let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let moved=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return moved===void 0?recent:rebindSessionOrExit(moved,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value2=>isLocalPath(value2)?resolvePath(value2,cwd):value2)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}function applyGrokNeoThemeFallback(settingsManager){if(settingsManager.getThemeSetting()!==void 0)return;let getThemeSetting=settingsManager.getThemeSetting.bind(settingsManager),setTheme=settingsManager.setTheme.bind(settingsManager),fallbackActive=!0;settingsManager.getThemeSetting=()=>getThemeSetting()??(fallbackActive?"grok-night":void 0),settingsManager.setTheme=theme2=>{fallbackActive=!1,setTheme(theme2)}}function createCliRuntimeFactory(configuration,local={}){let{parsed,cwd,agentDir,appMode}=configuration,extensionFactories=local.extensionFactories??builtInExtensions,startupSettingsManager=local.startupSettingsManager??SettingsManager.create(cwd,agentDir),startupLoadingIndicator=local.startupLoadingIndicator??createStartupLoadingIndicator({writer:()=>{},isTTY:!1,label:`Loading ${APP_NAME}`}),trustStore=new ProjectTrustStore(agentDir),projectTrustByCwd=new Map,trustPromptMode=parsed.help||parsed.listModels!==void 0||parsed.listTips?"print":toProjectTrustMode(appMode),resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createServices=async({cwd:cwd2,agentDir:agentDir2,projectTrustContext,launchProfile,mcpRegistry,isInitialRuntime})=>{let projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted});return launchProfile?.retryFallback&&applyRetryFallbackProfile(runtimeSettingsManager,launchProfile.retryFallback),{services:await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,...local.modelRuntime===void 0?{}:{modelRuntime:local.modelRuntime},mcpRegistry,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:sessionExtensionFlagValues(parsed.unknownFlags,launchProfile),resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??pauseIndicatorDuringPrompts(createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:toProjectTrustMode(appMode),settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),startupLoadingIndicator),onExtensionError:message=>projectTrustDiagnostics.push({type:"warning",message})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{sessionKind:launchProfile?.sessionKind,sessionContext:launchProfile?.sessionContext,additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),projectTrustDiagnostics}};return Object.assign(async({cwd:cwd2,agentDir:agentDir2,sessionManager,sessionStartEvent,projectTrustContext,launchProfile,mcpRegistry})=>{let isInitialRuntime=sessionStartEvent===void 0,markSwitch=label3=>{sessionStartEvent?.reason==="resume"&&time(label3,"switch")},{services,projectTrustDiagnostics}=await createServices({cwd:cwd2,agentDir:agentDir2,...projectTrustContext!==void 0?{projectTrustContext}:{},...launchProfile!==void 0?{launchProfile}:{},...mcpRegistry!==void 0?{mcpRegistry}:{},isInitialRuntime});markSwitch("services");let{settingsManager,modelRuntime,resourceLoader}=services,diagnostics=[...projectTrustDiagnostics,...services.diagnostics,...collectSettingsDiagnosticsWithContext(settingsManager,"runtime creation"),...collectExtensionLoadDiagnostics(resourceLoader.getExtensions().errors),...(resourceLoader.getExtensions().warnings??[]).map(({path:path15,warning})=>({type:"warning",message:`Extension package "${path15}": ${warning}`}))],modelPatterns=getModelNarrowingPatterns({cliPatterns:parsed.models,legacyEnabledPatterns:settingsManager.getEnabledModels()}),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime,{signal:AbortSignal.timeout(15e3)}):[],runtimeParsed=launchProfile===void 0?parsed:{...parsed,...launchProfile.creationModel===void 0?{}:{provider:launchProfile.creationModel.provider,model:launchProfile.creationModel.modelId},...launchProfile.initialThinkingLevel===void 0?{}:{thinking:launchProfile.initialThinkingLevel}},{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(runtimeParsed,scopedModels,sessionManager.hasContextMessages(),modelRuntime,settingsManager);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"})),isInitialRuntime&&startupLoadingIndicator.setPhase("opening session"),markSwitch("sessionOptions");let created=await createAgentSessionFromServices({services,sessionManager,sessionStartEvent,model:sessionOptions.model,initialModelProvenance:sessionOptions.initialModelProvenance,thinkingLevel:sessionOptions.thinkingLevel,thinkingSelection:sessionOptions.thinkingSelection,serviceTier:sessionOptions.serviceTier,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools,autoTitleSessions:resolveAutoTitleSessions(appMode,parsed,sessionManager.hasContextMessages(),parseClientCapabilities(envValue("RPC_CLIENT_CAPABILITIES")),launchProfile?.autoTitle),promptSurface:launchProfile?.promptSurface,browserEngine:launchProfile?.browserEngine});markSwitch("createSession");let cliThinkingOverride=runtimeParsed.thinking!==void 0||cliThinkingFromModel;if(created.session.model&&cliThinkingOverride){let selection=created.session.thinkingSelection;created.session.setThinkingLevel(selection?.requested??created.session.thinkingLevel)}return{...created,services,diagnostics}},{prepare:async options=>{await createServices({...options,isInitialRuntime:!0})}})}async function main(args,options){resetTimings(),recordTiming("processStart->main",Math.round(process.uptime()*1e3));let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;process.exit(exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories})||await dispatchAppServerCommand(args))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&process.exit(hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&process.exit(scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(DISPLAY_VERSION),process.exit(0)),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}console.log(`Exported to: ${result3}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});printHelp(flags2),writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),printTimings(),process.exit(0)}if(parsed.listTips){let{listTips}=await import("./list-tips-IIRFXBTO.js");listTips(),process.exit(0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing")]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(services2.modelRuntime,searchPattern2),process.exit(0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-EM24ZBGK.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join84(agentDir,"auth.json")),authPath:join84(agentDir,"auth.json"),agentDir,modelsPath:join84(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),printTimings(),await runMultiSessionHost({agentDir,createRuntime:createCliRuntimeFactory(runtimeConfiguration,{...hostModelRuntime===void 0?{}:{modelRuntime:hostModelRuntime}}),...sessionRuntime==="worker"?{workerConfiguration:runtimeConfiguration}:{},cwd,creationModel:parsed.provider&&parsed.model?{provider:parsed.provider,modelId:parsed.model}:void 0,initialThinkingLevel:parsed.thinking,listen:parsed.listen})}let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager,appMode),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,startupLoadingIndicator=createStartupLoadingIndicator({writer:chunk=>process.stdout.write(chunk),isTTY:process.stdout.isTTY===!0,label:`Loading ${APP_NAME}`});shouldShowStartupLoadingIndicator({appMode,stdoutIsTTY:process.stdout.isTTY===!0,helpRequested:parsed.help===!0})&&(startupLoadingIndicator.start(),startupLoadingIndicator.setPhase("extensions & models"));let createRuntime=createCliRuntimeFactory({parsed,cwd,agentDir,appMode},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&(printHelp(extensionFlags),process.exit(0)),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin"),recordProcessLifetime(agentDir,appMode,{supervised:appMode==="rpc"}),time("recordProcessLifetime");let{initialMessage,initialImages,initialTitlePrompt}=await prepareInitialMessage(parsed,settingsManager.getImageAutoResize(),stdinContent);time("prepareInitialMessage"),parsed.grokNeo&&appMode==="interactive"&&applyGrokNeoThemeFallback(settingsManager),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope"),reportDiagnostics(runtime.diagnostics);let startupThinkingClamp=runtime.session.startupThinkingClamp;appMode!=="interactive"&&startupThinkingClamp&&reportDiagnostics([{type:"warning",message:formatThinkingClampWarning(startupThinkingClamp)}]),appMode!=="interactive"&&reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation")),runtime.diagnostics.some(diagnostic2=>diagnostic2.type==="error")&&(runtime.diagnostics.some(diagnostic2=>diagnostic2.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(envValue("STARTUP_BENCHMARK"));if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}let stopChildReaper=await startHostChildReaper(appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
2497
+ `)});if(appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-2GT75YBZ.js");printTimings(),await runRpcMode2(runtime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-KUP43WXL.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,legacyPiEditNotice:legacyPiEditStartupNotice(),modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialTitlePrompt,initialMessages:parsed.messages,verbose:parsed.verbose,chrome:parsed.grokNeo?"grok":void 0,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});startupBenchmark&&(await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve46=>setTimeout(resolve46,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve46=>process.stdout.once("drain",resolve46)),process.stderr.writableLength>0&&await new Promise(resolve46=>process.stderr.once("drain",resolve46)),process.exit(0)),printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});reportDiagnostics(collectAuthDiagnostics(services.authStorage,"print mode")),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import{spawn as spawn9}from"node:child_process";import{createConnection as createConnection3}from"node:net";var REQUEST_DEADLINE_MS=3e4,PROMPT_COMPACTION_DEADLINE_MS=SUMMARIZATION_TOTAL_BUDGET_MS+SUMMARIZATION_MAX_DURATION_CAP_MS+REQUEST_DEADLINE_MS,PROMPT_ACK_MAX_WAIT_MS=PROMPT_COMPACTION_DEADLINE_MS+REQUEST_DEADLINE_MS,OPEN_AFTER_QUEUED_DEADLINE_MS=10*6e4;function openStalledMessage(position){let queued=typeof position=="number"?` at queue position ${position}`:"",minutes=OPEN_AFTER_QUEUED_DEADLINE_MS/6e4;return`open_session was accepted by the host${queued} but not answered within ${minutes} minutes`}function armRequestDeadline(ms,message,expire){let timer=setTimeout(()=>expire(new Error(message())),ms);return{extend(nextMs,nextMessage){clearTimeout(timer),timer=setTimeout(()=>expire(new Error(nextMessage())),nextMs)},clear(){clearTimeout(timer)}}}var RpcCommandError=class extends Error{constructor(message,errorCode4,errorData){super(message),this.name="RpcCommandError",this.errorCode=errorCode4,this.errorData=errorData}};function isProviderAccountEvent(event){return event.type==="auth_accounts_changed"||event.type==="account_failover"}var RpcTransportGoneError=class extends Error{constructor(message="Shared RPC host is unavailable"){super(message),this.code="rpc_transport_gone",this.name="RpcTransportGoneError"}};function isTransportGoneError(error2){return error2 instanceof RpcTransportGoneError||error2 instanceof Error&&(error2.message==="Client not started"||error2.message.startsWith("RPC transport is not writable.")||error2.message==="RPC socket closed")}var RpcClientOpenInFlightError=class extends Error{constructor(){super("An open_session request is already in flight"),this.code="open_session_in_flight",this.name="RpcClientOpenInFlightError"}},MAX_PENDING_SESSION_EVENTS=512,MAX_PENDING_SESSION_EVENT_BYTES=1024*1024,RpcClient=class{constructor(options={}){this.process=null,this.socket=null,this.stopReadingStdout=null,this.eventListeners=[],this.pendingRequests=new Map,this.requestId=0,this.compactions=new Map,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.stderr="",this.exitError=null,this.disconnectNotified=!1,this.stopping=!1,this.options=options,this.onEvent(event=>{switch(event.type){case"compaction_start":{let key=event.requestId??"";if(this.compactions.has(key))return;this.compactions.set(key,Date.now());break}case"compaction_end":if(!this.compactions.delete(event.requestId??""))return;break;case"session_replaced":this.compactions.clear();break;default:return}for(let pending of this.pendingRequests.values())pending.sessionId===this.sessionId&&pending.onCompaction?.(this.isCompacting())})}async start(){if(this.process||this.socket)throw new Error("Client already started");if(this.exitError=null,this.compactions.clear(),this.stopping=!1,this.disconnectNotified=!1,this.options.socketPath){await this.startSocket(this.options.socketPath);return}let cliPath=this.options.cliPath??"dist/cli.js",args=["--mode","rpc"];this.options.provider&&this.options.model&&args.push("--provider",this.options.provider),this.options.model&&args.push("--model",this.options.model),this.options.args&&args.push(...this.options.args);let childProcess=spawn9("node",[cliPath,...args],{cwd:this.options.cwd,env:{...process.env,SENPI_RUNTIME:"node",...this.options.env},stdio:["pipe","pipe","pipe"],windowsHide:!0});if(this.process=childProcess,childProcess.stderr?.on("data",data=>{this.stderr+=data.toString(),process.stderr.write(data)}),childProcess.once("exit",(code,signal)=>{if(this.process!==childProcess)return;let error2=this.createProcessExitError(code,signal);this.exitError=error2,this.rejectPendingRequests(error2)}),childProcess.once("error",error2=>{if(this.process!==childProcess)return;let processError=new Error(`Agent process error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=processError,this.rejectPendingRequests(processError)}),childProcess.stdin?.on("error",error2=>{if(this.process!==childProcess)return;let stdinError=this.exitError??new Error(`Agent process stdin error: ${error2.message}. Stderr: ${this.stderr}`);this.exitError=stdinError,this.rejectPendingRequests(stdinError)}),this.stopReadingStdout=attachJsonlLineReader(childProcess.stdout,line=>{this.handleLine(line)}),await new Promise(resolve46=>setTimeout(resolve46,100)),this.process.exitCode!==null){let error2=this.exitError??this.createProcessExitError(this.process.exitCode,this.process.signalCode);throw this.exitError=error2,error2}}isCompacting(){let now2=Date.now();for(let[key,startedAt]of this.compactions)now2-startedAt>=PROMPT_COMPACTION_DEADLINE_MS&&this.compactions.delete(key);return this.compactions.size>0}async stop(){if(this.compactions.clear(),this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,this.socket){this.stopping=!0,this.stopReadingStdout?.(),this.stopReadingStdout=null,this.socket.destroy(),this.socket=null,this.sessionId=void 0,this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.notifyDisconnect(new RpcTransportGoneError);return}this.process&&(this.stopReadingStdout?.(),this.stopReadingStdout=null,this.process.kill("SIGTERM"),await new Promise(resolve46=>{let timeout=setTimeout(()=>{this.process?.kill("SIGKILL"),resolve46()},1e3);this.process?.on("exit",()=>{clearTimeout(timeout),resolve46()})}),this.process=null,this.pendingRequests.clear())}async startSocket(path15){let secret=socketNeedsHandshake(path15)?await readSocketSecret(socketSecretPath(path15)):void 0,socket=createConnection3(resolveSocketTransportAddress(path15,process.platform,secret));this.socket=socket,await new Promise((resolve46,reject)=>{let onConnect=()=>{cleanup(),resolve46()},onError=error2=>{cleanup(),this.socket=null,reject(error2)},cleanup=()=>{socket.off("connect",onConnect),socket.off("error",onError)};socket.once("connect",onConnect),socket.once("error",onError)}),secret&&sendSocketHandshake(socket,secret),this.stopReadingStdout=attachJsonlLineReader(socket,line=>this.handleLine(line)),socket.once("close",()=>{this.socket===socket&&(this.socket=null,this.notifyDisconnect(new RpcTransportGoneError))}),socket.once("error",error2=>{this.socket===socket&&this.notifyDisconnect(new RpcTransportGoneError)})}onEvent(listener){return this.eventListeners.push(listener),()=>{let index=this.eventListeners.indexOf(listener);index!==-1&&this.eventListeners.splice(index,1)}}getStderr(){return this.stderr}async setClientInfo(width,capabilities){await this.send({type:"set_client_info",width,capabilities},this.sessionId!==void 0)}async openSession(options){if(this.pendingOpenSession)throw new RpcClientOpenInFlightError;this.pendingOpenSession=!0;try{let response=await this.send({type:"open_session",...options},!1),opened=this.getData(response);return this.sessionId=opened.sessionId,this.compactions.clear(),this.pendingOpenSession=!1,this.flushPendingSessionEvents(),opened}catch(error2){throw this.pendingOpenSession=!1,this.pendingSessionEvents=[],this.pendingSessionEventBytes=0,error2}}async sendExtensionUIResponse(response){await this.send(response,!0,void 0,!1)}async sendExtensionUIProgress(progress){await this.send(progress,!0,void 0,!1)}async closeSession(sessionId=this.sessionId){if(sessionId){try{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((resolve46,reject)=>{let timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout waiting for agent to become idle. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46())})})}collectEvents(timeout=6e4){return new Promise((resolve46,reject)=>{let events=[],timer=setTimeout(()=>{unsubscribe(),reject(new Error(`Timeout collecting events. Stderr: ${this.stderr}`))},timeout),unsubscribe=this.onEvent(event=>{isProviderAccountEvent(event)||event.type==="extension_event"||event.type==="bash_start"||event.type==="bash_end"||event.type==="extension_ui_request"||event.type==="session_replaced"||event.type==="session_parked"||event.type==="queued"||(events.push(event),event.type==="agent_settled"&&(clearTimeout(timer),unsubscribe(),resolve46(events)))})})}async promptAndWait(message,images,timeout=6e4){let eventsPromise=this.collectEvents(timeout);return await this.prompt(message,images?{images}:void 0),eventsPromise}handleLine(line){try{let data=JSON.parse(line);if(data.type==="response"&&data.id&&this.pendingRequests.has(data.id)){let pending=this.pendingRequests.get(data.id);this.pendingRequests.delete(data.id),pending.onResponse?.(data),pending.resolve(data);return}if(data.type==="queued"&&typeof data.for_request=="string"&&this.pendingRequests.get(data.for_request)?.onQueued?.(data.position),typeof data.sessionId=="string"&&data.sessionId!==this.sessionId){if(this.pendingOpenSession){let bytes=Buffer.byteLength(line);for(this.pendingSessionEvents.push({sessionId:data.sessionId,event:data,bytes}),this.pendingSessionEventBytes+=bytes;this.pendingSessionEvents.length>MAX_PENDING_SESSION_EVENTS||this.pendingSessionEventBytes>MAX_PENDING_SESSION_EVENT_BYTES;){let oldest=this.pendingSessionEvents.shift();if(!oldest)break;this.pendingSessionEventBytes-=oldest.bytes}}return}for(let listener of[...this.eventListeners])listener(data)}catch{}}flushPendingSessionEvents(){let pending=this.pendingSessionEvents;this.pendingSessionEvents=[],this.pendingSessionEventBytes=0;for(let{sessionId,event}of pending)if(sessionId===this.sessionId)for(let listener of[...this.eventListeners])listener(event)}createProcessExitError(code,signal){return new Error(`Agent process exited (code=${code} signal=${signal}). Stderr: ${this.stderr}`)}notifyDisconnect(error2){this.rejectPendingRequests(error2),!this.disconnectNotified&&!this.stopping&&(this.disconnectNotified=!0,this.options.onDisconnect?.(error2))}rejectPendingRequests(error2){for(let pending of this.pendingRequests.values())pending.onReject?.(error2),pending.reject(error2);this.pendingRequests.clear()}async send(command,route=!0,hooks,expectResponse=!0){let childProcess=this.process,stream2=this.socket??childProcess?.stdin;if(!stream2)throw new RpcTransportGoneError;if(this.exitError)throw this.exitError;if(childProcess?.exitCode!==null&&childProcess?.exitCode!==void 0){let error2=this.createProcessExitError(childProcess.exitCode,childProcess.signalCode);throw this.exitError=error2,error2}if(stream2.destroyed||!stream2.writable){let error2=new RpcTransportGoneError;throw this.notifyDisconnect(error2),error2}let ownId=command.type==="extension_ui_response"||command.type==="extension_ui_progress"?command.id:void 0,id=ownId??`req_${++this.requestId}`,fullCommand={...command,...route&&this.sessionId&&!("sessionId"in command)?{sessionId:this.sessionId}:{},...ownId===void 0?{id}:{}};if(!expectResponse)return stream2.write(serializeJsonLine(fullCommand)),Promise.resolve({type:"response",command:command.type,success:!0});let sessionId="sessionId"in fullCommand?fullCommand.sessionId:void 0;return new Promise((resolve46,reject)=>{let timeoutMessage=()=>`Timeout waiting for response to ${command.type}. Stderr: ${this.stderr}`,promptCap,expire=timeoutError=>{clearTimeout(promptCap);let pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(timeoutError),reject(timeoutError)},deadline=armRequestDeadline(command.type==="prompt"&&sessionId===this.sessionId&&this.isCompacting()?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage,expire);command.type==="prompt"&&(promptCap=setTimeout(()=>{deadline.clear(),expire(new Error(timeoutMessage()))},PROMPT_ACK_MAX_WAIT_MS)),this.pendingRequests.set(id,{sessionId,resolve:response=>{deadline.clear(),clearTimeout(promptCap),resolve46(response)},reject:error2=>{deadline.clear(),clearTimeout(promptCap),reject(error2)},...command.type==="prompt"?{onCompaction:compacting=>deadline.extend(compacting?PROMPT_COMPACTION_DEADLINE_MS:REQUEST_DEADLINE_MS,timeoutMessage)}:{},...command.type==="open_session"?{onQueued:position=>deadline.extend(OPEN_AFTER_QUEUED_DEADLINE_MS,()=>openStalledMessage(position))}:{},...hooks?.onResponse?{onResponse:hooks.onResponse}:{},...hooks?.onReject?{onReject:hooks.onReject}:{}});try{stream2.write(serializeJsonLine(fullCommand))}catch(error2){let writeError=error2 instanceof Error?error2:new Error(String(error2)),pending=this.pendingRequests.get(id);this.pendingRequests.delete(id),pending?.onReject?.(writeError),pending?.reject(writeError)}})}getData(response){if(!response.success){let errorResponse=response;throw errorResponse.errorCode==="missing_session_cwd"&&errorResponse.errorData?new MissingSessionCwdError(errorResponse.errorData):new RpcCommandError(errorResponse.error,errorResponse.errorCode,errorResponse.errorData)}return response.data}};var WIDTH=31,HEIGHT=36,BITS=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],BYTES_PER_ROW=Math.ceil(WIDTH/8),DISPLAY_HEIGHT=Math.ceil(HEIGHT/2),EFFECTS=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function getPixel(x,y){if(y>=HEIGHT)return!1;let byteIndex=y*BYTES_PER_ROW+Math.floor(x/8),bitIndex=x%8;return(BITS[byteIndex]>>bitIndex&1)===0}function getChar(x,row){let upper=getPixel(x,row*2),lower=getPixel(x,row*2+1);return upper&&lower?"\u2588":upper?"\u2580":lower?"\u2584":" "}function buildFinalGrid(){let grid=[];for(let row=0;row<DISPLAY_HEIGHT;row++){let line=[];for(let x=0;x<WIDTH;x++)line.push(getChar(x,row));grid.push(line)}return grid}var ArminComponent=class{constructor(ui){this.interval=null,this.effectState={},this.cachedLines=[],this.cachedWidth=0,this.gridVersion=0,this.cachedVersion=-1,this.ui=ui,this.effect=EFFECTS[Math.floor(Math.random()*EFFECTS.length)],this.finalGrid=buildFinalGrid(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(width){if(width===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;let padding=1,availableWidth=width-padding;this.cachedLines=this.currentGrid.map(row=>{let clipped=row.slice(0,availableWidth).join(""),padRight=Math.max(0,width-padding-clipped.length);return` ${theme.fg("accent",clipped)}${" ".repeat(padRight)}`});let message="ARMIN SAYS HI",msgPadRight=Math.max(0,width-padding-message.length);return this.cachedLines.push(` ${theme.fg("accent",message)}${" ".repeat(msgPadRight)}`),this.cachedWidth=width,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:DISPLAY_HEIGHT},()=>Array(WIDTH).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:WIDTH},()=>({y:-Math.floor(Math.random()*DISPLAY_HEIGHT*2),settled:0}))};break;case"fade":{let positions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)positions.push([row,x]);for(let i=positions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[positions[i],positions[j]]=[positions[j],positions[i]]}this.effectState={positions,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:DISPLAY_HEIGHT},()=>Array.from({length:WIDTH},()=>{let chars=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return chars[Math.floor(Math.random()*chars.length)]}));let dissolvePositions=[];for(let row=0;row<DISPLAY_HEIGHT;row++)for(let x=0;x<WIDTH;x++)dissolvePositions.push([row,x]);for(let i=dissolvePositions.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1));[dissolvePositions[i],dissolvePositions[j]]=[dissolvePositions[j],dissolvePositions[i]]}this.effectState={positions:dissolvePositions,idx:0};break}}}startAnimation(){let fps=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{let done=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),done&&this.stopAnimation()},1e3/fps)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){let state=this.effectState,pixelsPerFrame=3;for(let i=0;i<pixelsPerFrame;i++){let row=Math.floor(state.pos/WIDTH),x=state.pos%WIDTH;if(row>=DISPLAY_HEIGHT)return!0;this.currentGrid[row][x]=this.finalGrid[row][x],state.pos++}return!1}tickScanline(){let state=this.effectState;if(state.row>=DISPLAY_HEIGHT)return!0;for(let x=0;x<WIDTH;x++)this.currentGrid[state.row][x]=this.finalGrid[state.row][x];return state.row++,!1}tickRain(){let state=this.effectState,allSettled=!0;this.currentGrid=this.createEmptyGrid();for(let x=0;x<WIDTH;x++){let drop=state.drops[x];for(let row=DISPLAY_HEIGHT-1;row>=DISPLAY_HEIGHT-drop.settled;row--)row>=0&&(this.currentGrid[row][x]=this.finalGrid[row][x]);if(drop.settled>=DISPLAY_HEIGHT)continue;allSettled=!1;let targetRow=-1;for(let row=DISPLAY_HEIGHT-1-drop.settled;row>=0;row--)if(this.finalGrid[row][x]!==" "){targetRow=row;break}drop.y++,drop.y>=0&&drop.y<DISPLAY_HEIGHT&&(targetRow>=0&&drop.y>=targetRow?(drop.settled=DISPLAY_HEIGHT-targetRow,drop.y=-Math.floor(Math.random()*5)-1):this.currentGrid[drop.y][x]="\u2593")}return allSettled}tickFade(){let state=this.effectState,pixelsPerFrame=15;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}tickCrt(){let state=this.effectState,midRow=Math.floor(DISPLAY_HEIGHT/2);this.currentGrid=this.createEmptyGrid();let top=midRow-state.expansion,bottom=midRow+state.expansion;for(let row=Math.max(0,top);row<=Math.min(DISPLAY_HEIGHT-1,bottom);row++)for(let x=0;x<WIDTH;x++)this.currentGrid[row][x]=this.finalGrid[row][x];return state.expansion++,state.expansion>DISPLAY_HEIGHT}tickGlitch(){let state=this.effectState;return state.phase<state.glitchFrames?(this.currentGrid=this.finalGrid.map(row=>{let offset=Math.floor(Math.random()*7)-3,glitchRow=[...row];if(Math.random()<.3)return glitchRow.slice(offset).concat(glitchRow.slice(0,offset)).slice(0,WIDTH);if(Math.random()<.2){let swapRow=Math.floor(Math.random()*DISPLAY_HEIGHT);return[...this.finalGrid[swapRow]]}return glitchRow}),state.phase++,!1):(this.currentGrid=this.finalGrid.map(row=>[...row]),!0)}tickDissolve(){let state=this.effectState,pixelsPerFrame=20;for(let i=0;i<pixelsPerFrame;i++){if(state.idx>=state.positions.length)return!0;let[row,x]=state.positions[state.idx];this.currentGrid[row][x]=this.finalGrid[row][x],state.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}};function formatDuration3(ms){return ms<1e3?`${ms}ms`:ms<6e4?`${(ms/1e3).toFixed(1)}s`:ms<36e5?`${Math.floor(ms/6e4)}m ${Math.floor(ms%6e4/1e3)}s`:ms<864e5?`${Math.floor(ms/36e5)}h ${Math.floor(ms%36e5/6e4)}m`:`${Math.floor(ms/864e5)}d ${Math.floor(ms%864e5/36e5)}h`}var SPACER_DESCRIPTOR={kind:"spacer",text:""};function assertNever3(value2){throw new TypeError(`Unexpected assistant render variant: ${String(value2)}`)}function isVisibleContent(content,providerNativeVisible){switch(content.type){case"text":return!!content.text.trim();case"thinking":return!!content.thinking.trim();case"providerNative":return providerNativeVisible;case"toolCall":return!1;default:return assertNever3(content)}}function createAssistantRenderDescriptors(message,options){let descriptors=[];message.content.some(content=>isVisibleContent(content,!0))&&descriptors.push(SPACER_DESCRIPTOR);let thinkingRunIndex=0;for(let i=0;i<message.content.length;i++){let content=message.content[i];switch(content.type){case"text":{let text2=content.text.trim();text2&&descriptors.push({kind:"text-md",text:text2});break}case"thinking":{let thinkingBlocks=[],hasTiming=!1,isDone=!0,minStart=Number.POSITIVE_INFINITY,maxEnd=Number.NEGATIVE_INFINITY;for(;i<message.content.length;i++){let thinkingContent=message.content[i];if(thinkingContent.type!=="thinking")break;let startedAt=thinkingContent.startedAt;if(startedAt!==void 0){hasTiming=!0,minStart=Math.min(minStart,startedAt);let endedAt=thinkingContent.endedAt;endedAt===void 0?isDone=!1:maxEnd=Math.max(maxEnd,endedAt)}let thinking=thinkingContent.thinking.trim();thinking&&thinkingBlocks.push(thinking)}if(i--,thinkingBlocks.length===0)break;let thinkingRun=thinkingRunIndex++,hidden=options.thinkingVisibilityOverrides?.get(thinkingRun)??options.hideThinkingBlock;if(hasTiming){let label3=isDone?theme.italic(theme.fg("thinkingText",`Thought: ${formatDuration3(Math.max(0,maxEnd-minStart))}`)):theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel));hidden?descriptors.push({kind:"thinking-label",text:label3,thinkingRun}):descriptors.push({kind:"thinking-label",text:label3,thinkingRun},{kind:"thinking-md",text:thinkingBlocks.join(`
2498
2498
 
2499
2499
  `),thinkingRun})}else{let text2=hidden?theme.italic(theme.fg("thinkingText",options.hiddenThinkingLabel)):thinkingBlocks.join(`
2500
2500
 
@@ -2524,7 +2524,7 @@ ${details}
2524
2524
  `),result3=[],i=0;for(;i<lines.length;){let line=lines[i],parsed=parseDiffLine(line);if(!parsed){result3.push(theme.fg("toolDiffContext",line)),i++;continue}if(parsed.prefix==="-"){let removedLines=[];for(;i<lines.length;){let p=parseDiffLine(lines[i]);if(p?.prefix!=="-")break;removedLines.push({lineNum:p.lineNum,content:p.content}),i++}let addedLines=[];for(;i<lines.length;){let p=parseDiffLine(lines[i]);if(p?.prefix!=="+")break;addedLines.push({lineNum:p.lineNum,content:p.content}),i++}if(removedLines.length===1&&addedLines.length===1){let removed=removedLines[0],added=addedLines[0],{removedLine,addedLine}=renderIntraLineDiff(replaceTabs3(removed.content),replaceTabs3(added.content));result3.push(theme.fg("toolDiffRemoved",`-${removed.lineNum} ${removedLine}`)),result3.push(theme.fg("toolDiffAdded",`+${added.lineNum} ${addedLine}`))}else{for(let removed of removedLines)result3.push(theme.fg("toolDiffRemoved",`-${removed.lineNum} ${replaceTabs3(removed.content)}`));for(let added of addedLines)result3.push(theme.fg("toolDiffAdded",`+${added.lineNum} ${replaceTabs3(added.content)}`))}}else parsed.prefix==="+"?(result3.push(theme.fg("toolDiffAdded",`+${parsed.lineNum} ${replaceTabs3(parsed.content)}`)),i++):(result3.push(theme.fg("toolDiffContext",` ${parsed.lineNum} ${replaceTabs3(parsed.content)}`)),i++)}return result3.join(`
2525
2525
  `)}import{spawn as spawn10}from"node:child_process";import{mkdtempSync,readFileSync as readFileSync45,rmSync as rmSync15,writeFileSync as writeFileSync23}from"node:fs";import{tmpdir as tmpdir7}from"node:os";import{join as join85}from"node:path";async function editInExternalEditor(options){let directory=mkdtempSync(join85(tmpdir7(),"pi-editor-")),filePath=join85(directory,"prompt.md");try{writeFileSync23(filePath,options.content,"utf-8");let[editor,...editorArgs]=options.command.split(" ");process.stdout.write(`Launching external editor: ${options.command}
2526
2526
  Pi will resume when the editor exits.
2527
- `);let outcome=await new Promise(resolve46=>{let child=spawn10(editor,[...editorArgs,filePath],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve46({launched:!1})),child.on("close",code=>resolve46({launched:!0,code}))});return outcome.launched?outcome.code!==0?{status:"failed"}:{status:"complete",content:stripBom(readFileSync45(filePath,"utf-8")).replace(/\n$/,"")}:{status:"launch-failed"}}finally{try{rmSync15(directory,{recursive:!0,force:!0})}catch{}}}async function editFileInExternalEditor(options){let[editor,...editorArgs]=options.command.split(" "),outcome=await new Promise(resolve46=>{let child=spawn10(editor,[...editorArgs,options.path],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve46({launched:!1})),child.on("close",code=>resolve46({launched:!0,code}))});return outcome.launched?outcome.code===0?{status:"complete"}:{status:"exited",code:outcome.code??-1}:{status:"launch-failed"}}var ExtensionEditorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.editor.focused=value2}constructor(tui,keybindings,title,prefill,onSubmit,onCancel,options,externalEditorCommand){super(),this._focused=!1,this.tui=tui,this.keybindings=keybindings,this.externalEditorCommand=externalEditorCommand||process.env.VISUAL||process.env.EDITOR||(process.platform==="win32"?"notepad":"nano"),this.onSubmitCallback=onSubmit,this.onCancelCallback=onCancel;let{description,...editorOptions}=options??{};this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",title),1,0)),description&&(this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("text",description),1,0))),this.addChild(new Spacer(1)),this.editor=new Editor(tui,getEditorTheme(),editorOptions),prefill&&this.editor.setText(prefill),this.editor.onSubmit=text2=>{this.onSubmitCallback(text2)},this.addChild(this.editor),this.addChild(new Spacer(1));let hint=keyHint("tui.select.confirm","submit")+" "+keyHint("tui.input.newLine","newline")+" "+keyHint("tui.select.cancel","cancel")+` ${keyHint("app.editor.external","external editor")}`;this.addChild(new Text(hint,1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder)}handleInput(keyData){if(getKeybindings().matches(keyData,"tui.select.cancel")){this.onCancelCallback();return}if(this.keybindings.matches(keyData,"app.editor.external")){this.handleOpenExternalEditor();return}this.editor.handleInput(keyData)}async handleOpenExternalEditor(){let content=this.editor.getText();this.tui.stop();try{let result3=await editInExternalEditor({command:this.externalEditorCommand,content});result3.status==="complete"&&this.editor.setText(result3.content)}finally{this.tui.start(),this.tui.requestRender(!0)}}};var FIELD_NAMES=["id","name","provider","providerId"],EXACT_FIELD_WEIGHTS={providerId:0,id:1,provider:2,name:3},RANKED_FIELD_WEIGHTS={id:0,name:1,provider:2,providerId:3};function isAlphanumeric(char){if(!char)return!1;let code=char.charCodeAt(0);return code>=97&&code<=122||code>=48&&code<=57}function matchField(token,field2){if(field2.length===0)return null;if(field2===token)return{tier:0,occurrenceStart:0,fuzzyScore:0};let best=null,index=field2.indexOf(token);for(;index!==-1;){let leftBoundary=index===0||!isAlphanumeric(field2[index-1]),end=index+token.length,rightBoundary=end===field2.length||!isAlphanumeric(field2[end]),tier=leftBoundary&&rightBoundary?1:leftBoundary||rightBoundary?2:3;(!best||tier<best.tier)&&(best={tier,occurrenceStart:index,fuzzyScore:0}),index=field2.indexOf(token,index+1)}if(best)return best;let fuzzy=fuzzyMatch(token,field2);return fuzzy.matches?{tier:4,occurrenceStart:0,fuzzyScore:fuzzy.score}:null}function compareTokenMatches(a,b){return a.tier-b.tier||a.fieldWeight-b.fieldWeight||a.cost-b.cost}function matchToken(token,fields){let best=null;for(let fieldName of FIELD_NAMES){let match=matchField(token,fields[fieldName]);if(!match)continue;let fieldWeight=match.tier===0?EXACT_FIELD_WEIGHTS[fieldName]:RANKED_FIELD_WEIGHTS[fieldName],candidate={tier:match.tier,fieldWeight,cost:match.tier===4?match.fuzzyScore:match.occurrenceStart};(!best||compareTokenMatches(candidate,best)<0)&&(best=candidate)}return best}function scorePlan(tokens,fields){let score3={fuzzyCount:0,substringCount:0,boundarySubstringCount:0,wholeTokenCount:0,fieldCost:0,fuzzyCost:0,positionCost:0};for(let token of tokens){let match=matchToken(token,fields);if(!match)return null;match.tier===4?(score3.fuzzyCount+=1,score3.fuzzyCost+=match.cost):match.tier===3?(score3.substringCount+=1,score3.positionCost+=match.cost):match.tier===2?(score3.boundarySubstringCount+=1,score3.positionCost+=match.cost):(match.tier===1&&(score3.wholeTokenCount+=1),score3.positionCost+=match.cost),score3.fieldCost+=match.fieldWeight}return score3}var PLAN_SCORE_KEYS=["fuzzyCount","substringCount","boundarySubstringCount","wholeTokenCount","fieldCost","fuzzyCost","positionCost"];function comparePlanScores(a,b){for(let key of PLAN_SCORE_KEYS){let diff=a[key]-b[key];if(diff!==0)return diff}return 0}function compareKeys2(a,b){for(let i=0;i<a.length&&i<b.length;i++){let diff=a[i]-b[i];if(diff!==0)return diff}return a.length-b.length}function sameTokens(a,b){return a.length===b.length&&a.every((token,index)=>token===b[index])}function rankModelSearchItems(items,query,getModel,options){let normalizedQuery=query.trim().toLowerCase().replace(/\s*\/\s*/g,"/");if(!normalizedQuery)return items;let compoundTokens=normalizedQuery.split(/\s+/).filter(token=>token.length>0),legacyTokens=normalizedQuery.split(/[\s/]+/).filter(token=>token.length>0),plans=sameTokens(compoundTokens,legacyTokens)?[compoundTokens]:[compoundTokens,legacyTokens],ranked=[];for(let index=0;index<items.length;index++){let item=items[index],model=getModel(item),id=model.id.toLowerCase(),provider=model.provider.toLowerCase(),fields={id,name:(model.name??"").toLowerCase(),provider,providerId:`${provider}/${id}`},bestPlan=null;for(let plan of plans){let score3=scorePlan(plan,fields);score3&&(!bestPlan||comparePlanScores(score3,bestPlan)<0)&&(bestPlan=score3)}if(!bestPlan)continue;let canonicalProviderPathMiss=normalizedQuery===fields.providerId?0:1,favoritePartition=options.favoritesFirst?options.isFavorite(item)?0:1:0;ranked.push({item,key:[canonicalProviderPathMiss,favoritePartition,bestPlan.fuzzyCount,bestPlan.substringCount,bestPlan.boundarySubstringCount,bestPlan.wholeTokenCount,bestPlan.fieldCost,bestPlan.fuzzyCost,bestPlan.positionCost,id.length,index]})}return ranked.sort((a,b)=>compareKeys2(a.key,b.key)),ranked.map(entry=>entry.item)}function getModelFullId(model){return`${model.provider}/${model.id}`}function isFavoriteModel(favoriteIds,id){return favoriteIds===null||favoriteIds.includes(id)}function toggleFavoriteModel(favoriteIds,allIds,id){if(favoriteIds===null)return allIds.filter(candidateId=>candidateId!==id);let index=favoriteIds.indexOf(id);return index>=0?[...favoriteIds.slice(0,index),...favoriteIds.slice(index+1)]:[...favoriteIds,id]}function favoriteModels(favoriteIds,allIds,targetIds){if(favoriteIds===null)return null;let targets=targetIds??allIds,result3=[...favoriteIds];for(let id of targets)result3.includes(id)||result3.push(id);return result3.length===allIds.length?null:result3}function clearFavoriteModels(favoriteIds,allIds,targetIds){if(favoriteIds===null)return targetIds?allIds.filter(id=>!targetIds.includes(id)):[];let targets=new Set(targetIds??favoriteIds);return favoriteIds.filter(id=>!targets.has(id))}function moveFavoriteModel(favoriteIds,id,delta){if(favoriteIds===null)return null;let index=favoriteIds.indexOf(id);if(index<0)return[...favoriteIds];let newIndex=index+delta;if(newIndex<0||newIndex>=favoriteIds.length)return[...favoriteIds];let result3=[...favoriteIds];return[result3[index],result3[newIndex]]=[result3[newIndex],result3[index]],result3}function mergeFavoritePatternsForPersist(options){let{storedPatterns,patternResolutions,selectedIds,candidateIds}=options,selected=selectedIds===null?[...candidateIds]:selectedIds,selectedSet=new Set(selected),candidateSet=new Set(candidateIds),accountedIds=new Set,merged=[],mergedSet=new Set,append=pattern=>{mergedSet.has(pattern)||(mergedSet.add(pattern),merged.push(pattern))},decorateExactId=(id,resolution)=>{let exactPattern=id;return resolution.serviceTier&&(exactPattern+=`:${resolution.serviceTier}`),resolution.thinkingLevel&&(exactPattern+=`:${resolution.thinkingLevel}`),exactPattern},resolutionByPattern=new Map;for(let resolution of patternResolutions)resolutionByPattern.has(resolution.pattern)||resolutionByPattern.set(resolution.pattern,resolution);for(let storedPattern of storedPatterns){let resolution=resolutionByPattern.get(storedPattern);if(!resolution)continue;if(resolution.unresolved){append(resolution.pattern);continue}if(resolution.ownedIds.length===0)continue;let visibleOwnedIds=resolution.ownedIds.filter(id=>candidateSet.has(id)),selectedVisibleIds=visibleOwnedIds.filter(id=>selectedSet.has(id)),selectedPositions=selectedVisibleIds.map(id=>selected.indexOf(id)),remainsOrderedBlock=selectedPositions.every((position,positionIndex)=>positionIndex===0||position===selectedPositions[positionIndex-1]+1);if(selectedVisibleIds.length===visibleOwnedIds.length&&remainsOrderedBlock){append(resolution.pattern);for(let id of selectedVisibleIds)accountedIds.add(id);continue}if(!resolution.isGlob)continue;let selectedVisibleSet=new Set(selectedVisibleIds),explodedIds=[...selected.filter(id=>selectedVisibleSet.has(id)),...resolution.ownedIds.filter(id=>!candidateSet.has(id))];for(let id of explodedIds)append(decorateExactId(id,resolution)),candidateSet.has(id)&&accountedIds.add(id)}for(let id of selected)accountedIds.has(id)||append(id);return merged.length>0?merged:void 0}function getSortedFavoriteModelIds(favoriteIds,allIds){if(favoriteIds===null)return allIds;let favoriteSet=new Set(favoriteIds);return[...favoriteIds,...allIds.filter(id=>!favoriteSet.has(id))]}var FavoriteModelsSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(config,callbacks){super(),this.modelsById=new Map,this.allIds=[],this.favoriteIds=null,this.displayIds=[],this.filteredItems=[],this.selectedIndex=0,this._focused=!1,this.maxVisible=8,this.isDirty=!1,this.callbacks=callbacks,this.currentModel=config.currentModel;for(let model of config.allModels){let fullId=getModelFullId(model);this.modelsById.set(fullId,model),this.allIds.push(fullId)}this.favoriteIds=config.favoriteModelIds===null?null:[...config.favoriteModelIds],this.displayIds=getSortedFavoriteModelIds(this.favoriteIds,this.allIds),this.filteredItems=this.buildItems(),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Favorite Models")),0,0)),this.addChild(new Text(theme.fg("muted",`${keyText("tui.select.confirm")} selects. ${keyText("app.models.toggleFavorite")} toggles favorite. ${keyText("app.models.save")} saves.`),0,0)),this.addChild(new Spacer(1)),this.searchInput=new Input,this.addChild(this.searchInput),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.footerText=new Text(this.getFooterText(),0,0),this.addChild(this.footerText),this.secondaryFooterText=new Text(this.getSecondaryFooterText(),0,0),this.addChild(this.secondaryFooterText),this.addChild(new DynamicBorder),this.updateList()}buildItems(){let items=[];for(let id of this.displayIds){let model=this.modelsById.get(id);model&&items.push({fullId:id,model,favorite:isFavoriteModel(this.favoriteIds,id)})}return items}getFooterText(){let favoriteCount=this.favoriteIds?.length??this.allIds.length,countText=this.favoriteIds===null?"all favorites":`${favoriteCount}/${this.allIds.length} favorites`,parts=[`${keyText("tui.select.confirm")} select`,`${keyText("app.models.toggleFavorite")} favorite`,`${keyText("app.models.save")} save`,countText];return this.isDirty?theme.fg("dim",` ${parts.join(" \xB7 ")} `)+theme.fg("warning","unsaved"):theme.fg("dim",` ${parts.join(" \xB7 ")}`)}getSecondaryFooterText(){let parts=[`${keyText("app.models.enableAll")} all`,`${keyText("app.models.clearAll")} clear`,`${keyText("app.models.toggleProvider")} provider`,`${keyText("app.models.reorderUp")}/${keyText("app.models.reorderDown")} order`];return theme.fg("dim",` ${parts.join(" \xB7 ")}`)}refresh(preferredSelectedId){let query=this.searchInput.getValue(),selectedId=preferredSelectedId??this.filteredItems[this.selectedIndex]?.fullId,items=this.buildItems();this.filteredItems=rankModelSearchItems(items,query,i=>({id:i.model.id,provider:i.model.provider,name:i.model.name}),{favoritesFirst:!1,isFavorite:()=>!1});let selectedIndex=selectedId?this.filteredItems.findIndex(item=>item.fullId===selectedId):-1;this.selectedIndex=selectedIndex>=0?selectedIndex:Math.min(this.selectedIndex,Math.max(0,this.filteredItems.length-1)),this.updateList(),this.footerText.setText(this.getFooterText()),this.secondaryFooterText.setText(this.getSecondaryFooterText())}swapDisplayIds(firstId,secondId){let firstIndex=this.displayIds.indexOf(firstId),secondIndex=this.displayIds.indexOf(secondId);firstIndex<0||secondIndex<0||([this.displayIds[firstIndex],this.displayIds[secondIndex]]=[this.displayIds[secondIndex],this.displayIds[firstIndex]])}notifyChange(){this.callbacks.onChange(this.favoriteIds===null?null:[...this.favoriteIds])}updateList(){if(this.listContainer.clear(),this.filteredItems.length===0){this.listContainer.addChild(new Text(theme.fg("muted"," No matching models"),0,0));return}let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.filteredItems.length);for(let i=startIndex;i<endIndex;i++){let item=this.filteredItems[i];if(!item)continue;let isSelected=i===this.selectedIndex,prefix=isSelected?theme.fg("accent","\u2192 "):" ",favoriteMarker=item.favorite?theme.fg("success","*"):theme.fg("dim","-"),modelText=isSelected?theme.fg("accent",item.model.id):item.model.id,providerBadge=theme.fg("muted",` [${item.model.provider}]`),currentMarker=this.currentModel&&modelsAreEqual(this.currentModel,item.model)?theme.fg("success"," \u2713"):"";this.listContainer.addChild(new TruncatedText(`${prefix}${favoriteMarker} ${modelText}${providerBadge}${currentMarker}`))}if((startIndex>0||endIndex<this.filteredItems.length)&&this.listContainer.addChild(new Text(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredItems.length})`),0,0)),this.filteredItems.length>0){let selected=this.filteredItems[this.selectedIndex];selected&&(this.listContainer.addChild(new Spacer(1)),this.listContainer.addChild(new Text(theme.fg("muted",` Model Name: ${selected.model.name}`),0,0)))}}handleInput(data){let kb=getKeybindings();if(kb.matches(data,"tui.select.up")){if(this.filteredItems.length===0)return;this.selectedIndex=this.selectedIndex===0?this.filteredItems.length-1:this.selectedIndex-1,this.updateList();return}if(kb.matches(data,"tui.select.down")){if(this.filteredItems.length===0)return;this.selectedIndex=this.selectedIndex===this.filteredItems.length-1?0:this.selectedIndex+1,this.updateList();return}let reorderUp=kb.matches(data,"app.models.reorderUp"),reorderDown=kb.matches(data,"app.models.reorderDown");if(reorderUp||reorderDown){if(this.favoriteIds===null)return;let item=this.filteredItems[this.selectedIndex];if(item&&isFavoriteModel(this.favoriteIds,item.fullId)){let delta=reorderUp?-1:1,newIndex=this.favoriteIds.indexOf(item.fullId)+delta;if(newIndex>=0&&newIndex<this.favoriteIds.length){let displacedId=this.favoriteIds[newIndex];this.favoriteIds=moveFavoriteModel(this.favoriteIds,item.fullId,delta),this.swapDisplayIds(item.fullId,displacedId),this.isDirty=!0,this.selectedIndex+=delta,this.refresh(item.fullId),this.notifyChange()}}return}if(kb.matches(data,"tui.select.confirm")){let item=this.filteredItems[this.selectedIndex];item&&this.callbacks.onSelect(item.model);return}if(kb.matches(data,"app.models.toggleFavorite")){let item=this.filteredItems[this.selectedIndex];item&&(this.favoriteIds=toggleFavoriteModel(this.favoriteIds,this.allIds,item.fullId),this.isDirty=!0,this.refresh(item.fullId),this.notifyChange());return}if(kb.matches(data,"app.models.enableAll")){let item=this.filteredItems[this.selectedIndex],targetIds=this.searchInput.getValue()?this.filteredItems.map(i=>i.fullId):void 0;this.favoriteIds=favoriteModels(this.favoriteIds,this.allIds,targetIds),this.isDirty=!0,this.refresh(item?.fullId),this.notifyChange();return}if(kb.matches(data,"app.models.clearAll")){let item=this.filteredItems[this.selectedIndex],targetIds=this.searchInput.getValue()?this.filteredItems.map(i=>i.fullId):void 0;this.favoriteIds=clearFavoriteModels(this.favoriteIds,this.allIds,targetIds),this.isDirty=!0,this.refresh(item?.fullId),this.notifyChange();return}if(kb.matches(data,"app.models.toggleProvider")){let item=this.filteredItems[this.selectedIndex];if(item){let provider=item.model.provider,providerIds=this.allIds.filter(id=>this.modelsById.get(id)?.provider===provider),allFavorite=providerIds.every(id=>isFavoriteModel(this.favoriteIds,id));this.favoriteIds=allFavorite?clearFavoriteModels(this.favoriteIds,this.allIds,providerIds):favoriteModels(this.favoriteIds,this.allIds,providerIds),this.isDirty=!0,this.refresh(item.fullId),this.notifyChange()}return}if(kb.matches(data,"app.models.save")){this.callbacks.onPersist(this.favoriteIds===null?null:[...this.favoriteIds]),this.isDirty=!1,this.footerText.setText(this.getFooterText());return}if(matchesKey(data,Key.ctrl("c"))){this.searchInput.getValue()?(this.searchInput.setValue(""),this.refresh()):this.callbacks.onCancel();return}if(matchesKey(data,Key.escape)){this.callbacks.onCancel();return}this.searchInput.handleInput(data),this.refresh()}getSearchInput(){return this.searchInput}};import{createHash as createHash21}from"node:crypto";import{isAbsolute as isAbsolute23,relative as relative21,resolve as resolve43,sep as sep17}from"node:path";function segmentsWidth(segments,separator){if(segments.length===0)return 0;let total=visibleWidth(separator)*(segments.length-1);for(let segment2 of segments)total+=visibleWidth(segment2.plain);return total}function fits(left,right,input){return segmentsWidth(left,input.separator)+input.minPadding+visibleWidth(right.plain)<=input.width}function pwdBudget(rest,right,input){return input.width-input.minPadding-visibleWidth(right.plain)-visibleWidth(input.separator)-segmentsWidth(rest,input.separator)}function elideHead(text2,maxWidth){if(maxWidth<=0)return"";if(visibleWidth(text2)<=maxWidth)return text2;if(maxWidth===1)return"\u2026";let budget=maxWidth-visibleWidth("\u2026"),chars=[...text2],kept=[],used=0;for(let i=chars.length-1;i>=0;i--){let char=chars[i];if(char===void 0)break;let charWidth=visibleWidth(char);if(used+charWidth>budget)break;kept.unshift(char),used+=charWidth}return`\u2026${kept.join("")}`}function planFooterLayout(input){let{anchor,middle,tail,right}=input,pwd=anchor[input.pwdIndex];if(pwd===void 0)throw new RangeError(`pwdIndex ${input.pwdIndex} is outside the footer anchor`);let anchorRest=anchor.filter((_,index)=>index!==input.pwdIndex),preferPwdElision=visibleWidth(pwd.plain)>Math.floor(input.width/3),planForRight=(rightSegment,useFullRight)=>{let candidates=[{keptMiddleCount:middle.length,showMarker:!1},...Array.from({length:middle.length},(_,index)=>({keptMiddleCount:middle.length-index-1,showMarker:!0})),{keptMiddleCount:0,showMarker:!1}];for(let candidate of candidates){let retainedMiddle=middle.slice(0,candidate.keptMiddleCount),marker=candidate.showMarker?[input.ellipsisMarker]:[],left=[...anchor,...retainedMiddle,...marker,tail];if(fits(left,rightSegment,input))return candidate.keptMiddleCount===middle.length?{kind:"full",useFullRight}:{kind:"middle-elided",...candidate,useFullRight};let isMinimalFallback=!useFullRight&&candidate.keptMiddleCount===0&&!candidate.showMarker;if(preferPwdElision||isMinimalFallback){let budget=pwdBudget([...anchorRest,...retainedMiddle,...marker,tail],rightSegment,input);if(budget>=2)return{kind:"pwd-elided",pwdPlain:elideHead(pwd.plain,budget),...candidate,useFullRight}}}};if(right.full!==void 0){let fullRightPlan=planForRight(right.full,!0);if(fullRightPlan!==void 0)return fullRightPlan}let minimalRightPlan=planForRight(right.minimal,!1);if(minimalRightPlan!==void 0)return minimalRightPlan;let leftBudget=input.width-input.minPadding-visibleWidth(right.minimal.plain);if(leftBudget>=1){let allLeftPlain=[...anchor,tail].map(segment2=>segment2.plain).join(input.separator);return{kind:"left-elided",leftPlain:elideHead(allLeftPlain,leftBudget)}}return{kind:"right-truncated",rightPlain:truncateToWidth(right.minimal.plain,input.width,"")}}var FAST_MODE_INDICATOR="\u26A1 ";function sanitizeStatusText(text2){return text2.replace(/[\r\n\t]/g," ").replace(/ +/g," ").trim()}function formatTokens(count){let n=Math.round(count);return n<1e3?n.toString():n<1e4?`${trim1(n/1e3)}K`:n<1e6?`${Math.round(n/1e3)}K`:n<1e7?`${trim1(n/1e6)}M`:n<1e9?`${Math.round(n/1e6)}M`:n<1e10?`${trim1(n/1e9)}B`:`${Math.round(n/1e9)}B`}function accountFooterSuffix(credential,sessionId){let slots=listSlots(credential);if(slots.length<2)return"";let pinned=Object.entries(credential??{}).find(([key])=>key==="pinned")?.[1],pinnedSlot=slots.find(slot=>slot.name===pinned);if(pinnedSlot)return`@${footerAccountLabel(pinnedSlot)}`;let winner=rendezvousOrder(sessionId,slots,input=>createHash21("sha256").update(input).digest().readBigUInt64BE(0))[0];return winner===void 0?"":`@${footerAccountLabel(winner)}`}var ACCOUNT_FOOTER_MAX_COLUMNS=24;function footerAccountLabel(slot){return truncateToWidth(accountLabel(slot),ACCOUNT_FOOTER_MAX_COLUMNS,"\u2026")}function trim1(n){let s=n.toFixed(1);return s.endsWith(".0")?s.slice(0,-2):s}function formatCwdForFooter(cwd,home){if(!home)return cwd;let resolvedCwd=resolve43(cwd),resolvedHome=resolve43(home),relativeToHome=relative21(resolvedHome,resolvedCwd);return relativeToHome===""||relativeToHome!==".."&&!relativeToHome.startsWith(`..${sep17}`)&&!isAbsolute23(relativeToHome)?relativeToHome===""?"~":`~${sep17}${relativeToHome}`:cwd}function colorRightSide(runs,plain){let text2=stripTerminalSequences(plain);if(!text2)return"";let offset=0,colored="";for(let run2 of runs){if(offset>=text2.length)break;let visible=text2.slice(offset,offset+run2.text.length);if(visible.length===0)break;colored+=theme.fg(run2.color,visible),offset+=visible.length}return colored}var FooterComponent=class{constructor(session,footerData){this.autoCompactEnabled=!0,this.compactionDelegated=!1,this.session=session,this.footerData=footerData}setSession(session){this.session=session}setAutoCompactEnabled(enabled){this.autoCompactEnabled=enabled}setCompactionDelegated(delegated){this.compactionDelegated=delegated}invalidate(){}dispose(){}render(width){let state=this.session.state,usageTotals=this.session.sessionManager.getUsageTotals(),totalCacheRead=usageTotals.cacheRead,totalCacheWrite=usageTotals.cacheWrite,totalCost=usageTotals.cost,latestCacheHitRate=usageTotals.latestCacheHitRate,contextUsage=this.session.getContextUsage(),contextWindow=contextUsage?.contextWindow??state.model?.contextWindow??0,contextPercentValue=contextUsage?.percent??0,contextPercent=contextUsage?.percent!==null?contextPercentValue.toFixed(1):"?",contextTokens=typeof contextUsage?.tokens=="number"?formatTokens(contextUsage.tokens):typeof contextUsage?.percent=="number"?formatTokens(Math.round(contextWindow*contextUsage.percent/100)):"?",separator=" \u2022 ",sepColored=theme.fg("borderMuted",separator),pwdRaw=formatCwdForFooter(this.session.sessionManager.getCwd(),process.env.HOME||process.env.USERPROFILE),branch=this.footerData.getGitBranch(),sessionName2=this.session.sessionManager.getSessionName(),anchor=[{plain:pwdRaw,colored:theme.fg("accent",pwdRaw)}];branch&&anchor.push({plain:branch,colored:theme.fg("warning",branch)});let pwdIndex=0,dim=plain=>({plain,colored:theme.fg("dim",plain)}),middle=[];sessionName2&&middle.push({plain:sessionName2,colored:theme.fg("muted",sessionName2)}),(totalCacheRead>0||totalCacheWrite>0)&&latestCacheHitRate!==void 0&&latestCacheHitRate>=10&&middle.push(dim(`CH${latestCacheHitRate.toFixed(1)}%`));let usingSubscription=state.model?state.model.provider==="kimi-coding"||this.session.modelRuntime.isUsingSubscription(state.model.provider):!1;if(totalCost||usingSubscription){let costStr=`$${totalCost.toFixed(3)}${usingSubscription?" (sub)":""}`;middle.push({plain:costStr,colored:theme.fg("success",costStr)})}let autoIndicator=this.autoCompactEnabled?" (auto)":"",delegationIndicator=this.compactionDelegated?" (SDK)":"",ctxBase=contextPercent==="?"?`${contextTokens}/${formatTokens(contextWindow)} (?)${autoIndicator}`:`${contextTokens}/${formatTokens(contextWindow)} (${contextPercent}%)${autoIndicator}`,colorCtx=text2=>contextPercentValue>90?theme.fg("error",text2):contextPercentValue>70?theme.fg("warning",text2):theme.fg("muted",text2),makeTail=withMarker=>({plain:withMarker?`${ctxBase}${delegationIndicator}`:ctxBase,colored:withMarker?`${colorCtx(ctxBase)}${theme.fg("muted",delegationIndicator)}`:colorCtx(ctxBase)}),tail=makeTail(delegationIndicator!==""),modelName=state.model?.id||"no-model",fastIndicator=this.session.isFastModeActive()?FAST_MODE_INDICATOR:"",minimalRight=`${fastIndicator}${modelName}`;if(state.model?.reasoning){let thinkingLevel=state.thinkingLevel||"off";minimalRight=thinkingLevel==="off"?`${minimalRight}:off`:`${minimalRight}:${thinkingLevel}`}let thinkingSuffix=state.model?.reasoning?`:${state.thinkingLevel||"off"}`:"",modelRuns=[...fastIndicator?[{text:fastIndicator,color:"warning"}]:[],{text:modelName,color:"accent"},...thinkingSuffix?[{text:thinkingSuffix,color:"dim"}]:[]],routed=this.session.routedModel;if(routed){let routedSuffix=` \u2192 ${routed.model.id}`,routedLevel=routed.thinkingLevel?`:${routed.thinkingLevel}`:"";minimalRight+=`${routedSuffix}${routedLevel}`,modelRuns.push({text:routedSuffix,color:"accent"}),routedLevel&&modelRuns.push({text:routedLevel,color:"dim"})}let minimal={plain:minimalRight,colored:colorRightSide(modelRuns,minimalRight)},accountSuffix="";if(state.model)try{accountSuffix=accountFooterSuffix(this.session.modelRegistry.authStorage.get(state.model.provider),this.session.sessionManager.getSessionId())}catch{}let providerPrefix=(this.footerData.getAvailableProviderCount()>1||accountSuffix!=="")&&state.model?`(${state.model.provider}${accountSuffix}) `:"",full=providerPrefix?{plain:`${providerPrefix}${minimalRight}`,colored:colorRightSide([{text:providerPrefix,color:"muted"},...modelRuns],`${providerPrefix}${minimalRight}`)}:void 0,marker={plain:"\u2026",colored:theme.fg("dim","\u2026")},planWithTail=tailSegment=>planFooterLayout({width,anchor,pwdIndex,middle,tail:tailSegment,right:{minimal,full},separator,minPadding:2,ellipsisMarker:marker}),plan=planWithTail(tail);delegationIndicator!==""&&plan.kind==="left-elided"&&!plan.leftPlain.includes(delegationIndicator.trimStart())&&(tail=makeTail(!1),plan=planWithTail(tail));let joinSegments=segments=>({colored:segments.map(segment2=>segment2.colored).join(sepColored),width:visibleWidth(segments.map(segment2=>segment2.plain).join(separator))}),left,right;if(plan.kind==="full")right=plan.useFullRight&&full?full:minimal,left=joinSegments([...anchor,...middle,tail]);else if(plan.kind==="middle-elided"){right=plan.useFullRight&&full?full:minimal;let segments=[...anchor,...middle.slice(0,plan.keptMiddleCount)];plan.showMarker&&segments.push(marker),segments.push(tail),left=joinSegments(segments)}else if(plan.kind==="pwd-elided"){right=plan.useFullRight&&full?full:minimal;let segments=[...anchor.map((segment2,index)=>index===pwdIndex?{plain:plan.pwdPlain,colored:theme.fg("accent",plan.pwdPlain)}:segment2),...middle.slice(0,plan.keptMiddleCount)];plan.showMarker&&segments.push(marker),segments.push(tail),left=joinSegments(segments)}else plan.kind==="left-elided"?(right=minimal,left={colored:theme.fg("muted",plan.leftPlain),width:visibleWidth(plan.leftPlain)}):(left={colored:"",width:0},right={plain:plan.rightPlain,colored:colorRightSide(modelRuns,plan.rightPlain)});let rightWidth=visibleWidth(right.plain),padding=" ".repeat(Math.max(0,width-left.width-rightWidth)),lines=[left.colored+padding+right.colored],extensionStatuses=this.footerData.getExtensionStatuses();if(extensionStatuses.size>0){let statusLine2=Array.from(extensionStatuses.entries()).sort(([a],[b])=>a.localeCompare(b)).map(([,text2])=>sanitizeStatusText(text2)).join(" ");lines.push(truncateToWidth(statusLine2,width,theme.fg("dim","...")))}return lines}};var LoginDialogComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(tui,providerId,onComplete,providerNameOverride,titleOverride){super(),this.abortController=new AbortController,this._focused=!1,this.tui=tui,this.onComplete=onComplete;let title=titleOverride??`Login to ${providerNameOverride||providerId}`;this.addChild(new DynamicBorder),this.addChild(new Text(theme.fg("accent",theme.bold(title)),1,0)),this.contentContainer=new Container,this.addChild(this.contentContainer),this.input=new Input,this.input.onSubmit=()=>{if(this.inputResolver){let value2=this.input.getValue();this.replaceInputWithSubmittedText(value2),this.inputResolver(value2),this.inputResolver=void 0,this.inputRejecter=void 0}},this.input.onEscape=()=>{this.cancel()},this.addChild(new DynamicBorder)}get signal(){return this.abortController.signal}replaceInputWithSubmittedText(value2){this.contentContainer.children=this.contentContainer.children.map(child=>child===this.input?new Text(`> ${value2}`,0,0):child)}remountInput(hint){this.contentContainer.children=this.contentContainer.children.filter(child=>child!==this.input&&child!==this.liveHint),this.contentContainer.addChild(this.input),this.liveHint=hint,this.contentContainer.addChild(hint)}setLiveHint(hint){this.contentContainer.children=this.contentContainer.children.filter(child=>child!==this.liveHint),this.liveHint=hint,this.contentContainer.addChild(hint)}resetContent(){this.contentContainer.clear(),this.liveHint=void 0}cancel(){this.abortController.abort(),this.inputRejecter&&(this.inputRejecter(new Error("Login cancelled")),this.inputResolver=void 0,this.inputRejecter=void 0),this.onComplete(!1,"Login cancelled")}showAuth(url,instructions){this.resetContent(),this.contentContainer.addChild(new Spacer(1));let linkedUrl=`\x1B]8;;${url}\x07${url}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("accent",linkedUrl),1,0));let clickHint=process.platform==="darwin"?"Cmd+click to open":"Ctrl+click to open",hyperlink2=`\x1B]8;;${url}\x07${clickHint}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("dim",hyperlink2),1,0)),instructions&&(this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("warning",instructions),1,0))),openBrowser(url),this.tui.requestRender()}showDeviceCode(info){this.resetContent(),this.contentContainer.addChild(new Spacer(1));let linkedUrl=`\x1B]8;;${info.verificationUri}\x07${info.verificationUri}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("accent",linkedUrl),1,0));let clickHint=process.platform==="darwin"?"Cmd+click to open":"Ctrl+click to open",hyperlink2=`\x1B]8;;${info.verificationUri}\x07${clickHint}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("dim",hyperlink2),1,0)),this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("warning",`Enter code: ${info.userCode}`),1,0)),this.tui.requestRender()}showManualInput(prompt){return this.input.setValue(""),this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("dim",prompt),1,0)),this.remountInput(new Text(`(${keyHint("tui.select.cancel","to cancel")})`,1,0)),this.tui.requestRender(),new Promise((resolve46,reject)=>{this.inputResolver=resolve46,this.inputRejecter=reject})}showPrompt(message,placeholder){return this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("text",message),1,0)),placeholder&&this.contentContainer.addChild(new Text(theme.fg("dim",`e.g., ${placeholder}`),1,0)),this.remountInput(new Text(`(${keyHint("tui.select.cancel","to cancel,")} ${keyHint("tui.select.confirm","to submit")})`,1,0)),this.input.setValue(""),this.tui.requestRender(),new Promise((resolve46,reject)=>{this.inputResolver=resolve46,this.inputRejecter=reject})}showDetails(lines){this.resetContent(),this.contentContainer.addChild(new Spacer(1));for(let line of lines)this.contentContainer.addChild(new Text(line,1,0));this.tui.requestRender()}showInfo(message,links=[],showCloseHint=!1){this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("text",message),1,0));for(let link of links){let text2=link.label?`${link.label}: ${link.url}`:link.url,hyperlink2=`\x1B]8;;${link.url}\x07${text2}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("accent",hyperlink2),1,0))}showCloseHint&&(this.contentContainer.addChild(new Spacer(1)),this.setLiveHint(new Text(`(${keyHint("tui.select.cancel","to close")})`,1,0))),this.tui.requestRender()}showWaiting(message){this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("dim",message),1,0)),this.setLiveHint(new Text(`(${keyHint("tui.select.cancel","to cancel")})`,1,0)),this.tui.requestRender()}showProgress(message){this.contentContainer.addChild(new Text(theme.fg("dim",message),1,0)),this.tui.requestRender()}handleInput(data){if(getKeybindings().matches(data,"tui.select.cancel")){this.cancel();return}this.input.handleInput(data)}};var ModelCatalogRefreshCoordinator=class{constructor(){this.activeByRuntime=new WeakMap}refresh(modelRuntime,signal){signal.throwIfAborted();let active=this.activeByRuntime.get(modelRuntime);if(!active){let controller=new AbortController,created,operation=modelRuntime.refresh({signal:controller.signal}),promise=raceWithAbortSignal(operation,controller.signal).finally(()=>{this.activeByRuntime.get(modelRuntime)===created&&this.activeByRuntime.delete(modelRuntime)});created={controller,promise,waiters:0},active=created,this.activeByRuntime.set(modelRuntime,active)}return active.waiters++,raceWithAbortSignal(active.promise,signal).finally(()=>{active.waiters--,active.waiters===0&&this.activeByRuntime.get(modelRuntime)===active&&active.controller.abort()})}},modelCatalogRefreshCoordinator=new ModelCatalogRefreshCoordinator;function refreshModelCatalogs(modelRuntime,signal){return modelCatalogRefreshCoordinator.refresh(modelRuntime,signal)}var ModelSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(tui,currentModel,settingsManager,modelRuntime,scopedModels,onSelect,onCancel,initialSearchInput,favorites){if(super(),this._focused=!1,this.allModels=[],this.scopedModelItems=[],this.activeModels=[],this.filteredModels=[],this.selectedIndex=0,this.favoriteIds=[],this.refreshStatusMessage="Refreshing model catalogs\u2026",this.refreshStatusSuccess=!1,this.scope="all",this.refreshAbortController=new AbortController,this.closed=!1,this.tui=tui,this.currentModel=currentModel,this.settingsManager=settingsManager,this.modelRuntime=modelRuntime,this.scopedModels=scopedModels,this.scope=scopedModels.length>0?"narrowed":"all",this.onSelectCallback=onSelect,this.onCancelCallback=onCancel,this.favoriteIds=favorites?.favoriteModelIds===null?null:[...favorites?.favoriteModelIds??[]],this.favoriteIdsAtOpen=this.favoriteIds===null?null:[...this.favoriteIds],this.onFavoriteChangeCallback=favorites?.onFavoriteChange,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),scopedModels.length>0)this.scopeText=new Text(this.getScopeText(),0,0),this.addChild(this.scopeText),this.scopeHintText=new Text(this.getScopeHintText(),0,0),this.addChild(this.scopeHintText);else{let hintText="Only showing models from configured providers. Use /login to add providers.";this.addChild(new Text(theme.fg("warning",hintText),0,0))}this.addChild(new Spacer(1)),this.addChild(new Text(`${keyHint("tui.select.confirm","select")} ${keyHint("app.models.toggleFavorite","favorite")}`,0,0)),this.addChild(new Spacer(1)),this.searchInput=new Input,initialSearchInput&&this.searchInput.setValue(initialSearchInput),this.searchInput.onSubmit=()=>{this.filteredModels[this.selectedIndex]&&this.handleSelect(this.filteredModels[this.selectedIndex].model)},this.addChild(this.searchInput),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.loadModelsFromSnapshot(),initialSearchInput?this.filterModels(initialSearchInput):this.updateList(),this.tui.requestRender(),this.refreshModels()}loadModelsFromSnapshot(){let models=(this.modelRuntime instanceof ModelRegistry?this.modelRuntime.getAvailable():this.modelRuntime.getAvailableSnapshot()).map(model=>({fullId:getModelFullId(model),provider:model.provider,id:model.id,model}));this.allModels=this.sortModels(models);let modelsById=new Map(models.map(model=>[model.fullId,model]));this.scopedModels=this.scopedModels.map(scoped=>{let refreshed=this.modelRuntime instanceof ModelRegistry?this.modelRuntime.find(scoped.model.provider,scoped.model.id):this.modelRuntime.getModel(scoped.model.provider,scoped.model.id);return refreshed?{...scoped,model:refreshed}:scoped}),this.scopedModelItems=this.scopedModels.flatMap(scoped=>{let refreshed=modelsById.get(`${scoped.model.provider}/${scoped.model.id}`);return refreshed?[refreshed]:[]}),this.activeModels=this.scope==="narrowed"?this.scopedModelItems:this.allModels,this.filteredModels=this.activeModels;let currentIndex=this.filteredModels.findIndex(item=>modelsAreEqual(this.currentModel,item.model));this.selectedIndex=currentIndex>=0?currentIndex:Math.min(this.selectedIndex,Math.max(0,this.filteredModels.length-1))}async refreshModels(){let timedOut=!1;this.refreshTimeout=setTimeout(()=>{timedOut=!0,this.refreshAbortController.abort()},15e3);try{let result3;if(this.modelRuntime instanceof ModelRegistry?(await this.modelRuntime.refresh(),result3={aborted:!1,errors:new Map}):result3=await refreshModelCatalogs(this.modelRuntime,this.refreshAbortController.signal),this.closed)return;this.refreshStatusMessage="",result3.aborted&&timedOut?this.errorMessage="Model refresh timed out; showing cached models.":result3.errors.size===1?this.errorMessage=`Could not refresh ${result3.errors.keys().next().value}; showing cached models.`:result3.errors.size>1?this.errorMessage=`Could not refresh ${result3.errors.size} model catalogs (${[...result3.errors.keys()].join(", ")}); showing cached models.`:(this.errorMessage=this.modelRuntime.getError(),this.errorMessage||(this.refreshStatusMessage="Model catalogs refreshed.",this.refreshStatusSuccess=!0)),this.loadModelsFromSnapshot(),this.filterModels(this.searchInput.getValue()),this.tui.requestRender()}catch(error2){if(this.closed)return;this.refreshStatusMessage="",this.errorMessage=timedOut?"Model refresh timed out; showing cached models.":`Could not refresh model catalogs: ${error2 instanceof Error?error2.message:String(error2)}`,this.updateList(),this.tui.requestRender()}finally{this.refreshTimeout&&clearTimeout(this.refreshTimeout)}}dispose(){this.closed||(this.closed=!0,this.refreshTimeout&&clearTimeout(this.refreshTimeout),this.refreshAbortController.abort())}sortModels(models){let sorted=[...models],isAmbient=createAmbientProviderCheck(this.modelRuntime);return sorted.sort((a,b)=>{let aIsCurrent=modelsAreEqual(this.currentModel,a.model),bIsCurrent=modelsAreEqual(this.currentModel,b.model);if(aIsCurrent&&!bIsCurrent)return-1;if(!aIsCurrent&&bIsCurrent)return 1;let aIsFavorite=isFavoriteModel(this.favoriteIdsAtOpen,a.fullId),bIsFavorite=isFavoriteModel(this.favoriteIdsAtOpen,b.fullId);if(aIsFavorite&&!bIsFavorite)return-1;if(!aIsFavorite&&bIsFavorite)return 1;let ambientCompare=Number(isAmbient(a.provider))-Number(isAmbient(b.provider));if(ambientCompare!==0)return ambientCompare;let providerCompare=a.provider.localeCompare(b.provider);return providerCompare!==0?providerCompare:a.id.localeCompare(b.id)}),sorted}getScopeText(){let allText=this.scope==="all"?theme.fg("accent","all"):theme.fg("muted","all"),narrowedText=this.scope==="narrowed"?theme.fg("accent","narrowed"):theme.fg("muted","narrowed");return`${theme.fg("muted","Catalog: ")}${allText}${theme.fg("muted"," | ")}${narrowedText}`}getScopeHintText(){return keyHint("tui.input.tab","catalog")+theme.fg("muted"," (all/narrowed)")}setScope(scope){if(this.scope===scope)return;this.scope=scope,this.activeModels=this.scope==="narrowed"?this.scopedModelItems:this.allModels;let currentIndex=this.activeModels.findIndex(item=>modelsAreEqual(this.currentModel,item.model));this.selectedIndex=currentIndex>=0?currentIndex:0,this.filterModels(this.searchInput.getValue()),this.scopeText&&this.scopeText.setText(this.getScopeText())}filterModels(query){this.filteredModels=query?rankModelSearchItems(this.activeModels,query,({id,provider,model})=>({id,provider,name:model.name}),{favoritesFirst:this.scope==="all",isFavorite:item=>isFavoriteModel(this.favoriteIdsAtOpen,item.fullId)}):this.activeModels,this.selectedIndex=query?0:Math.min(this.selectedIndex,Math.max(0,this.filteredModels.length-1)),this.updateList()}updateList(){this.listContainer.clear();let maxVisible=this.tui.terminal?Math.max(5,Math.floor(this.tui.terminal.rows/2)):10,startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(maxVisible/2),this.filteredModels.length-maxVisible)),endIndex=Math.min(startIndex+maxVisible,this.filteredModels.length);startIndex>0&&this.listContainer.addChild(new Text(theme.fg("muted",` \u2026 ${startIndex} more above`),0,0));for(let i=startIndex;i<endIndex;i++){let item=this.filteredModels[i];if(!item)continue;let isSelected=i===this.selectedIndex,isCurrent=modelsAreEqual(this.currentModel,item.model),favoriteMarker=isFavoriteModel(this.favoriteIds,item.fullId)?theme.fg("success","* "):theme.fg("dim"," "),line="";if(isSelected){let prefix=theme.fg("accent","\u2192 "),modelText=`${favoriteMarker}${theme.fg("accent",item.id)}`,providerBadge=theme.fg("muted",`[${item.provider}]`),checkmark=isCurrent?theme.fg("success"," \u2713"):"";line=`${prefix}${modelText} ${providerBadge}${checkmark}`}else{let modelText=` ${favoriteMarker}${item.id}`,providerBadge=theme.fg("muted",`[${item.provider}]`),checkmark=isCurrent?theme.fg("success"," \u2713"):"";line=`${modelText} ${providerBadge}${checkmark}`}this.listContainer.addChild(new Text(line,0,0))}if(endIndex<this.filteredModels.length&&this.listContainer.addChild(new Text(theme.fg("muted",` \u2026 ${this.filteredModels.length-endIndex} more below`),0,0)),this.errorMessage){let errorLines2=this.errorMessage.split(`
2527
+ `);let outcome=await new Promise(resolve46=>{let child=spawn10(editor,[...editorArgs,filePath],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve46({launched:!1})),child.on("close",code=>resolve46({launched:!0,code}))});return outcome.launched?outcome.code!==0?{status:"failed"}:{status:"complete",content:stripBom(readFileSync45(filePath,"utf-8")).replace(/\n$/,"")}:{status:"launch-failed"}}finally{try{rmSync15(directory,{recursive:!0,force:!0})}catch{}}}async function editFileInExternalEditor(options){let[editor,...editorArgs]=options.command.split(" "),outcome=await new Promise(resolve46=>{let child=spawn10(editor,[...editorArgs,options.path],{stdio:"inherit",shell:process.platform==="win32"});child.on("error",()=>resolve46({launched:!1})),child.on("close",code=>resolve46({launched:!0,code}))});return outcome.launched?outcome.code===0?{status:"complete"}:{status:"exited",code:outcome.code??-1}:{status:"launch-failed"}}var ExtensionEditorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.editor.focused=value2}constructor(tui,keybindings,title,prefill,onSubmit,onCancel,options,externalEditorCommand){super(),this._focused=!1,this.tui=tui,this.keybindings=keybindings,this.externalEditorCommand=externalEditorCommand||process.env.VISUAL||process.env.EDITOR||(process.platform==="win32"?"notepad":"nano"),this.onSubmitCallback=onSubmit,this.onCancelCallback=onCancel;let{description,...editorOptions}=options??{};this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",title),1,0)),description&&(this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("text",description),1,0))),this.addChild(new Spacer(1)),this.editor=new Editor(tui,getEditorTheme(),editorOptions),prefill&&this.editor.setText(prefill),this.editor.onSubmit=text2=>{this.onSubmitCallback(text2)},this.addChild(this.editor),this.addChild(new Spacer(1));let hint=keyHint("tui.select.confirm","submit")+" "+keyHint("tui.input.newLine","newline")+" "+keyHint("tui.select.cancel","cancel")+` ${keyHint("app.editor.external","external editor")}`;this.addChild(new Text(hint,1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder)}handleInput(keyData){if(getKeybindings().matches(keyData,"tui.select.cancel")){this.onCancelCallback();return}if(this.keybindings.matches(keyData,"app.editor.external")){this.handleOpenExternalEditor();return}this.editor.handleInput(keyData)}async handleOpenExternalEditor(){let content=this.editor.getText();this.tui.stop();try{let result3=await editInExternalEditor({command:this.externalEditorCommand,content});result3.status==="complete"&&this.editor.setText(result3.content)}finally{this.tui.start(),this.tui.requestRender(!0)}}};var FIELD_NAMES=["id","name","provider","providerId"],EXACT_FIELD_WEIGHTS={providerId:0,id:1,provider:2,name:3},RANKED_FIELD_WEIGHTS={id:0,name:1,provider:2,providerId:3};function isAlphanumeric(char){if(!char)return!1;let code=char.charCodeAt(0);return code>=97&&code<=122||code>=48&&code<=57}function matchField(token,field2){if(field2.length===0)return null;if(field2===token)return{tier:0,occurrenceStart:0,fuzzyScore:0};let best=null,index=field2.indexOf(token);for(;index!==-1;){let leftBoundary=index===0||!isAlphanumeric(field2[index-1]),end=index+token.length,rightBoundary=end===field2.length||!isAlphanumeric(field2[end]),tier=leftBoundary&&rightBoundary?1:leftBoundary||rightBoundary?2:3;(!best||tier<best.tier)&&(best={tier,occurrenceStart:index,fuzzyScore:0}),index=field2.indexOf(token,index+1)}if(best)return best;let fuzzy=fuzzyMatch(token,field2);return fuzzy.matches?{tier:4,occurrenceStart:0,fuzzyScore:fuzzy.score}:null}function compareTokenMatches(a,b){return a.tier-b.tier||a.fieldWeight-b.fieldWeight||a.cost-b.cost}function matchToken(token,fields){let best=null;for(let fieldName of FIELD_NAMES){let match=matchField(token,fields[fieldName]);if(!match)continue;let fieldWeight=match.tier===0?EXACT_FIELD_WEIGHTS[fieldName]:RANKED_FIELD_WEIGHTS[fieldName],candidate={tier:match.tier,fieldWeight,cost:match.tier===4?match.fuzzyScore:match.occurrenceStart};(!best||compareTokenMatches(candidate,best)<0)&&(best=candidate)}return best}function scorePlan(tokens,fields){let score3={fuzzyCount:0,substringCount:0,boundarySubstringCount:0,wholeTokenCount:0,fieldCost:0,fuzzyCost:0,positionCost:0};for(let token of tokens){let match=matchToken(token,fields);if(!match)return null;match.tier===4?(score3.fuzzyCount+=1,score3.fuzzyCost+=match.cost):match.tier===3?(score3.substringCount+=1,score3.positionCost+=match.cost):match.tier===2?(score3.boundarySubstringCount+=1,score3.positionCost+=match.cost):(match.tier===1&&(score3.wholeTokenCount+=1),score3.positionCost+=match.cost),score3.fieldCost+=match.fieldWeight}return score3}var PLAN_SCORE_KEYS=["fuzzyCount","substringCount","boundarySubstringCount","wholeTokenCount","fieldCost","fuzzyCost","positionCost"];function comparePlanScores(a,b){for(let key of PLAN_SCORE_KEYS){let diff=a[key]-b[key];if(diff!==0)return diff}return 0}function compareKeys2(a,b){for(let i=0;i<a.length&&i<b.length;i++){let diff=a[i]-b[i];if(diff!==0)return diff}return a.length-b.length}function sameTokens(a,b){return a.length===b.length&&a.every((token,index)=>token===b[index])}function rankModelSearchItems(items,query,getModel,options){let normalizedQuery=query.trim().toLowerCase().replace(/\s*\/\s*/g,"/");if(!normalizedQuery)return items;let compoundTokens=normalizedQuery.split(/\s+/).filter(token=>token.length>0),legacyTokens=normalizedQuery.split(/[\s/]+/).filter(token=>token.length>0),plans=sameTokens(compoundTokens,legacyTokens)?[compoundTokens]:[compoundTokens,legacyTokens],ranked=[];for(let index=0;index<items.length;index++){let item=items[index],model=getModel(item),id=model.id.toLowerCase(),provider=model.provider.toLowerCase(),fields={id,name:(model.name??"").toLowerCase(),provider,providerId:`${provider}/${id}`},bestPlan=null;for(let plan of plans){let score3=scorePlan(plan,fields);score3&&(!bestPlan||comparePlanScores(score3,bestPlan)<0)&&(bestPlan=score3)}if(!bestPlan)continue;let canonicalProviderPathMiss=normalizedQuery===fields.providerId?0:1,favoritePartition=options.favoritesFirst?options.isFavorite(item)?0:1:0;ranked.push({item,key:[canonicalProviderPathMiss,favoritePartition,bestPlan.fuzzyCount,bestPlan.substringCount,bestPlan.boundarySubstringCount,bestPlan.wholeTokenCount,bestPlan.fieldCost,bestPlan.fuzzyCost,bestPlan.positionCost,id.length,index]})}return ranked.sort((a,b)=>compareKeys2(a.key,b.key)),ranked.map(entry=>entry.item)}function getModelFullId(model){return`${model.provider}/${model.id}`}function isFavoriteModel(favoriteIds,id){return favoriteIds===null||favoriteIds.includes(id)}function toggleFavoriteModel(favoriteIds,allIds,id){if(favoriteIds===null)return allIds.filter(candidateId=>candidateId!==id);let index=favoriteIds.indexOf(id);return index>=0?[...favoriteIds.slice(0,index),...favoriteIds.slice(index+1)]:[...favoriteIds,id]}function favoriteModels(favoriteIds,allIds,targetIds){if(favoriteIds===null)return null;let targets=targetIds??allIds,result3=[...favoriteIds];for(let id of targets)result3.includes(id)||result3.push(id);return result3.length===allIds.length?null:result3}function clearFavoriteModels(favoriteIds,allIds,targetIds){if(favoriteIds===null)return targetIds?allIds.filter(id=>!targetIds.includes(id)):[];let targets=new Set(targetIds??favoriteIds);return favoriteIds.filter(id=>!targets.has(id))}function moveFavoriteModel(favoriteIds,id,delta){if(favoriteIds===null)return null;let index=favoriteIds.indexOf(id);if(index<0)return[...favoriteIds];let newIndex=index+delta;if(newIndex<0||newIndex>=favoriteIds.length)return[...favoriteIds];let result3=[...favoriteIds];return[result3[index],result3[newIndex]]=[result3[newIndex],result3[index]],result3}function mergeFavoritePatternsForPersist(options){let{storedPatterns,patternResolutions,selectedIds,candidateIds}=options,selected=selectedIds===null?[...candidateIds]:selectedIds,selectedSet=new Set(selected),candidateSet=new Set(candidateIds),accountedIds=new Set,merged=[],mergedSet=new Set,append=pattern=>{mergedSet.has(pattern)||(mergedSet.add(pattern),merged.push(pattern))},decorateExactId=(id,resolution)=>{let exactPattern=id;return resolution.serviceTier&&(exactPattern+=`:${resolution.serviceTier}`),resolution.thinkingLevel&&(exactPattern+=`:${resolution.thinkingLevel}`),exactPattern},resolutionByPattern=new Map;for(let resolution of patternResolutions)resolutionByPattern.has(resolution.pattern)||resolutionByPattern.set(resolution.pattern,resolution);for(let storedPattern of storedPatterns){let resolution=resolutionByPattern.get(storedPattern);if(!resolution)continue;if(resolution.unresolved){append(resolution.pattern);continue}if(resolution.ownedIds.length===0)continue;let visibleOwnedIds=resolution.ownedIds.filter(id=>candidateSet.has(id)),selectedVisibleIds=visibleOwnedIds.filter(id=>selectedSet.has(id)),selectedPositions=selectedVisibleIds.map(id=>selected.indexOf(id)),remainsOrderedBlock=selectedPositions.every((position,positionIndex)=>positionIndex===0||position===selectedPositions[positionIndex-1]+1);if(selectedVisibleIds.length===visibleOwnedIds.length&&remainsOrderedBlock){append(resolution.pattern);for(let id of selectedVisibleIds)accountedIds.add(id);continue}if(!resolution.isGlob)continue;let selectedVisibleSet=new Set(selectedVisibleIds),explodedIds=[...selected.filter(id=>selectedVisibleSet.has(id)),...resolution.ownedIds.filter(id=>!candidateSet.has(id))];for(let id of explodedIds)append(decorateExactId(id,resolution)),candidateSet.has(id)&&accountedIds.add(id)}for(let id of selected)accountedIds.has(id)||append(id);return merged.length>0?merged:void 0}function getSortedFavoriteModelIds(favoriteIds,allIds){if(favoriteIds===null)return allIds;let favoriteSet=new Set(favoriteIds);return[...favoriteIds,...allIds.filter(id=>!favoriteSet.has(id))]}var FavoriteModelsSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(config,callbacks){super(),this.modelsById=new Map,this.allIds=[],this.favoriteIds=null,this.displayIds=[],this.filteredItems=[],this.selectedIndex=0,this._focused=!1,this.maxVisible=8,this.isDirty=!1,this.callbacks=callbacks,this.currentModel=config.currentModel;for(let model of config.allModels){let fullId=getModelFullId(model);this.modelsById.set(fullId,model),this.allIds.push(fullId)}this.favoriteIds=config.favoriteModelIds===null?null:[...config.favoriteModelIds],this.displayIds=getSortedFavoriteModelIds(this.favoriteIds,this.allIds),this.filteredItems=this.buildItems(),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("accent",theme.bold("Favorite Models")),0,0)),this.addChild(new Text(theme.fg("muted",`${keyText("tui.select.confirm")} selects. ${keyText("app.models.toggleFavorite")} toggles favorite. ${keyText("app.models.save")} saves.`),0,0)),this.addChild(new Spacer(1)),this.searchInput=new Input,this.addChild(this.searchInput),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.footerText=new Text(this.getFooterText(),0,0),this.addChild(this.footerText),this.secondaryFooterText=new Text(this.getSecondaryFooterText(),0,0),this.addChild(this.secondaryFooterText),this.addChild(new DynamicBorder),this.updateList()}buildItems(){let items=[];for(let id of this.displayIds){let model=this.modelsById.get(id);model&&items.push({fullId:id,model,favorite:isFavoriteModel(this.favoriteIds,id)})}return items}getFooterText(){let favoriteCount=this.favoriteIds?.length??this.allIds.length,countText=this.favoriteIds===null?"all favorites":`${favoriteCount}/${this.allIds.length} favorites`,parts=[`${keyText("tui.select.confirm")} select`,`${keyText("app.models.toggleFavorite")} favorite`,`${keyText("app.models.save")} save`,countText];return this.isDirty?theme.fg("dim",` ${parts.join(" \xB7 ")} `)+theme.fg("warning","unsaved"):theme.fg("dim",` ${parts.join(" \xB7 ")}`)}getSecondaryFooterText(){let parts=[`${keyText("app.models.enableAll")} all`,`${keyText("app.models.clearAll")} clear`,`${keyText("app.models.toggleProvider")} provider`,`${keyText("app.models.reorderUp")}/${keyText("app.models.reorderDown")} order`];return theme.fg("dim",` ${parts.join(" \xB7 ")}`)}refresh(preferredSelectedId){let query=this.searchInput.getValue(),selectedId=preferredSelectedId??this.filteredItems[this.selectedIndex]?.fullId,items=this.buildItems();this.filteredItems=rankModelSearchItems(items,query,i=>({id:i.model.id,provider:i.model.provider,name:i.model.name}),{favoritesFirst:!1,isFavorite:()=>!1});let selectedIndex=selectedId?this.filteredItems.findIndex(item=>item.fullId===selectedId):-1;this.selectedIndex=selectedIndex>=0?selectedIndex:Math.min(this.selectedIndex,Math.max(0,this.filteredItems.length-1)),this.updateList(),this.footerText.setText(this.getFooterText()),this.secondaryFooterText.setText(this.getSecondaryFooterText())}swapDisplayIds(firstId,secondId){let firstIndex=this.displayIds.indexOf(firstId),secondIndex=this.displayIds.indexOf(secondId);firstIndex<0||secondIndex<0||([this.displayIds[firstIndex],this.displayIds[secondIndex]]=[this.displayIds[secondIndex],this.displayIds[firstIndex]])}notifyChange(){this.callbacks.onChange(this.favoriteIds===null?null:[...this.favoriteIds])}updateList(){if(this.listContainer.clear(),this.filteredItems.length===0){this.listContainer.addChild(new Text(theme.fg("muted"," No matching models"),0,0));return}let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.filteredItems.length);for(let i=startIndex;i<endIndex;i++){let item=this.filteredItems[i];if(!item)continue;let isSelected=i===this.selectedIndex,prefix=isSelected?theme.fg("accent","\u2192 "):" ",favoriteMarker=item.favorite?theme.fg("success","*"):theme.fg("dim","-"),modelText=isSelected?theme.fg("accent",item.model.id):item.model.id,providerBadge=theme.fg("muted",` [${item.model.provider}]`),currentMarker=this.currentModel&&modelsAreEqual(this.currentModel,item.model)?theme.fg("success"," \u2713"):"";this.listContainer.addChild(new TruncatedText(`${prefix}${favoriteMarker} ${modelText}${providerBadge}${currentMarker}`))}if((startIndex>0||endIndex<this.filteredItems.length)&&this.listContainer.addChild(new Text(theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredItems.length})`),0,0)),this.filteredItems.length>0){let selected=this.filteredItems[this.selectedIndex];selected&&(this.listContainer.addChild(new Spacer(1)),this.listContainer.addChild(new Text(theme.fg("muted",` Model Name: ${selected.model.name}`),0,0)))}}handleInput(data){let kb=getKeybindings();if(kb.matches(data,"tui.select.up")){if(this.filteredItems.length===0)return;this.selectedIndex=this.selectedIndex===0?this.filteredItems.length-1:this.selectedIndex-1,this.updateList();return}if(kb.matches(data,"tui.select.down")){if(this.filteredItems.length===0)return;this.selectedIndex=this.selectedIndex===this.filteredItems.length-1?0:this.selectedIndex+1,this.updateList();return}let reorderUp=kb.matches(data,"app.models.reorderUp"),reorderDown=kb.matches(data,"app.models.reorderDown");if(reorderUp||reorderDown){if(this.favoriteIds===null)return;let item=this.filteredItems[this.selectedIndex];if(item&&isFavoriteModel(this.favoriteIds,item.fullId)){let delta=reorderUp?-1:1,newIndex=this.favoriteIds.indexOf(item.fullId)+delta;if(newIndex>=0&&newIndex<this.favoriteIds.length){let displacedId=this.favoriteIds[newIndex];this.favoriteIds=moveFavoriteModel(this.favoriteIds,item.fullId,delta),this.swapDisplayIds(item.fullId,displacedId),this.isDirty=!0,this.selectedIndex+=delta,this.refresh(item.fullId),this.notifyChange()}}return}if(kb.matches(data,"tui.select.confirm")){let item=this.filteredItems[this.selectedIndex];item&&this.callbacks.onSelect(item.model);return}if(kb.matches(data,"app.models.toggleFavorite")){let item=this.filteredItems[this.selectedIndex];item&&(this.favoriteIds=toggleFavoriteModel(this.favoriteIds,this.allIds,item.fullId),this.isDirty=!0,this.refresh(item.fullId),this.notifyChange());return}if(kb.matches(data,"app.models.enableAll")){let item=this.filteredItems[this.selectedIndex],targetIds=this.searchInput.getValue()?this.filteredItems.map(i=>i.fullId):void 0;this.favoriteIds=favoriteModels(this.favoriteIds,this.allIds,targetIds),this.isDirty=!0,this.refresh(item?.fullId),this.notifyChange();return}if(kb.matches(data,"app.models.clearAll")){let item=this.filteredItems[this.selectedIndex],targetIds=this.searchInput.getValue()?this.filteredItems.map(i=>i.fullId):void 0;this.favoriteIds=clearFavoriteModels(this.favoriteIds,this.allIds,targetIds),this.isDirty=!0,this.refresh(item?.fullId),this.notifyChange();return}if(kb.matches(data,"app.models.toggleProvider")){let item=this.filteredItems[this.selectedIndex];if(item){let provider=item.model.provider,providerIds=this.allIds.filter(id=>this.modelsById.get(id)?.provider===provider),allFavorite=providerIds.every(id=>isFavoriteModel(this.favoriteIds,id));this.favoriteIds=allFavorite?clearFavoriteModels(this.favoriteIds,this.allIds,providerIds):favoriteModels(this.favoriteIds,this.allIds,providerIds),this.isDirty=!0,this.refresh(item.fullId),this.notifyChange()}return}if(kb.matches(data,"app.models.save")){this.callbacks.onPersist(this.favoriteIds===null?null:[...this.favoriteIds]),this.isDirty=!1,this.footerText.setText(this.getFooterText());return}if(matchesKey(data,Key.ctrl("c"))){this.searchInput.getValue()?(this.searchInput.setValue(""),this.refresh()):this.callbacks.onCancel();return}if(matchesKey(data,Key.escape)){this.callbacks.onCancel();return}this.searchInput.handleInput(data),this.refresh()}getSearchInput(){return this.searchInput}};import{createHash as createHash21}from"node:crypto";import{isAbsolute as isAbsolute24,relative as relative21,resolve as resolve43,sep as sep17}from"node:path";function segmentsWidth(segments,separator){if(segments.length===0)return 0;let total=visibleWidth(separator)*(segments.length-1);for(let segment2 of segments)total+=visibleWidth(segment2.plain);return total}function fits(left,right,input){return segmentsWidth(left,input.separator)+input.minPadding+visibleWidth(right.plain)<=input.width}function pwdBudget(rest,right,input){return input.width-input.minPadding-visibleWidth(right.plain)-visibleWidth(input.separator)-segmentsWidth(rest,input.separator)}function elideHead(text2,maxWidth){if(maxWidth<=0)return"";if(visibleWidth(text2)<=maxWidth)return text2;if(maxWidth===1)return"\u2026";let budget=maxWidth-visibleWidth("\u2026"),chars=[...text2],kept=[],used=0;for(let i=chars.length-1;i>=0;i--){let char=chars[i];if(char===void 0)break;let charWidth=visibleWidth(char);if(used+charWidth>budget)break;kept.unshift(char),used+=charWidth}return`\u2026${kept.join("")}`}function planFooterLayout(input){let{anchor,middle,tail,right}=input,pwd=anchor[input.pwdIndex];if(pwd===void 0)throw new RangeError(`pwdIndex ${input.pwdIndex} is outside the footer anchor`);let anchorRest=anchor.filter((_,index)=>index!==input.pwdIndex),preferPwdElision=visibleWidth(pwd.plain)>Math.floor(input.width/3),planForRight=(rightSegment,useFullRight)=>{let candidates=[{keptMiddleCount:middle.length,showMarker:!1},...Array.from({length:middle.length},(_,index)=>({keptMiddleCount:middle.length-index-1,showMarker:!0})),{keptMiddleCount:0,showMarker:!1}];for(let candidate of candidates){let retainedMiddle=middle.slice(0,candidate.keptMiddleCount),marker=candidate.showMarker?[input.ellipsisMarker]:[],left=[...anchor,...retainedMiddle,...marker,tail];if(fits(left,rightSegment,input))return candidate.keptMiddleCount===middle.length?{kind:"full",useFullRight}:{kind:"middle-elided",...candidate,useFullRight};let isMinimalFallback=!useFullRight&&candidate.keptMiddleCount===0&&!candidate.showMarker;if(preferPwdElision||isMinimalFallback){let budget=pwdBudget([...anchorRest,...retainedMiddle,...marker,tail],rightSegment,input);if(budget>=2)return{kind:"pwd-elided",pwdPlain:elideHead(pwd.plain,budget),...candidate,useFullRight}}}};if(right.full!==void 0){let fullRightPlan=planForRight(right.full,!0);if(fullRightPlan!==void 0)return fullRightPlan}let minimalRightPlan=planForRight(right.minimal,!1);if(minimalRightPlan!==void 0)return minimalRightPlan;let leftBudget=input.width-input.minPadding-visibleWidth(right.minimal.plain);if(leftBudget>=1){let allLeftPlain=[...anchor,tail].map(segment2=>segment2.plain).join(input.separator);return{kind:"left-elided",leftPlain:elideHead(allLeftPlain,leftBudget)}}return{kind:"right-truncated",rightPlain:truncateToWidth(right.minimal.plain,input.width,"")}}var FAST_MODE_INDICATOR="\u26A1 ";function sanitizeStatusText(text2){return text2.replace(/[\r\n\t]/g," ").replace(/ +/g," ").trim()}function formatTokens(count){let n=Math.round(count);return n<1e3?n.toString():n<1e4?`${trim1(n/1e3)}K`:n<1e6?`${Math.round(n/1e3)}K`:n<1e7?`${trim1(n/1e6)}M`:n<1e9?`${Math.round(n/1e6)}M`:n<1e10?`${trim1(n/1e9)}B`:`${Math.round(n/1e9)}B`}function accountFooterSuffix(credential,sessionId){let slots=listSlots(credential);if(slots.length<2)return"";let pinned=Object.entries(credential??{}).find(([key])=>key==="pinned")?.[1],pinnedSlot=slots.find(slot=>slot.name===pinned);if(pinnedSlot)return`@${footerAccountLabel(pinnedSlot)}`;let winner=rendezvousOrder(sessionId,slots,input=>createHash21("sha256").update(input).digest().readBigUInt64BE(0))[0];return winner===void 0?"":`@${footerAccountLabel(winner)}`}var ACCOUNT_FOOTER_MAX_COLUMNS=24;function footerAccountLabel(slot){return truncateToWidth(accountLabel(slot),ACCOUNT_FOOTER_MAX_COLUMNS,"\u2026")}function trim1(n){let s=n.toFixed(1);return s.endsWith(".0")?s.slice(0,-2):s}function formatCwdForFooter(cwd,home){if(!home)return cwd;let resolvedCwd=resolve43(cwd),resolvedHome=resolve43(home),relativeToHome=relative21(resolvedHome,resolvedCwd);return relativeToHome===""||relativeToHome!==".."&&!relativeToHome.startsWith(`..${sep17}`)&&!isAbsolute24(relativeToHome)?relativeToHome===""?"~":`~${sep17}${relativeToHome}`:cwd}function colorRightSide(runs,plain){let text2=stripTerminalSequences(plain);if(!text2)return"";let offset=0,colored="";for(let run2 of runs){if(offset>=text2.length)break;let visible=text2.slice(offset,offset+run2.text.length);if(visible.length===0)break;colored+=theme.fg(run2.color,visible),offset+=visible.length}return colored}var FooterComponent=class{constructor(session,footerData){this.autoCompactEnabled=!0,this.compactionDelegated=!1,this.session=session,this.footerData=footerData}setSession(session){this.session=session}setAutoCompactEnabled(enabled){this.autoCompactEnabled=enabled}setCompactionDelegated(delegated){this.compactionDelegated=delegated}invalidate(){}dispose(){}render(width){let state=this.session.state,usageTotals=this.session.sessionManager.getUsageTotals(),totalCacheRead=usageTotals.cacheRead,totalCacheWrite=usageTotals.cacheWrite,totalCost=usageTotals.cost,latestCacheHitRate=usageTotals.latestCacheHitRate,contextUsage=this.session.getContextUsage(),contextWindow=contextUsage?.contextWindow??state.model?.contextWindow??0,contextPercentValue=contextUsage?.percent??0,contextPercent=contextUsage?.percent!==null?contextPercentValue.toFixed(1):"?",contextTokens=typeof contextUsage?.tokens=="number"?formatTokens(contextUsage.tokens):typeof contextUsage?.percent=="number"?formatTokens(Math.round(contextWindow*contextUsage.percent/100)):"?",separator=" \u2022 ",sepColored=theme.fg("borderMuted",separator),pwdRaw=formatCwdForFooter(this.session.sessionManager.getCwd(),process.env.HOME||process.env.USERPROFILE),branch=this.footerData.getGitBranch(),sessionName2=this.session.sessionManager.getSessionName(),anchor=[{plain:pwdRaw,colored:theme.fg("accent",pwdRaw)}];branch&&anchor.push({plain:branch,colored:theme.fg("warning",branch)});let pwdIndex=0,dim=plain=>({plain,colored:theme.fg("dim",plain)}),middle=[];sessionName2&&middle.push({plain:sessionName2,colored:theme.fg("muted",sessionName2)}),(totalCacheRead>0||totalCacheWrite>0)&&latestCacheHitRate!==void 0&&latestCacheHitRate>=10&&middle.push(dim(`CH${latestCacheHitRate.toFixed(1)}%`));let usingSubscription=state.model?state.model.provider==="kimi-coding"||this.session.modelRuntime.isUsingSubscription(state.model.provider):!1;if(totalCost||usingSubscription){let costStr=`$${totalCost.toFixed(3)}${usingSubscription?" (sub)":""}`;middle.push({plain:costStr,colored:theme.fg("success",costStr)})}let autoIndicator=this.autoCompactEnabled?" (auto)":"",delegationIndicator=this.compactionDelegated?" (SDK)":"",ctxBase=contextPercent==="?"?`${contextTokens}/${formatTokens(contextWindow)} (?)${autoIndicator}`:`${contextTokens}/${formatTokens(contextWindow)} (${contextPercent}%)${autoIndicator}`,colorCtx=text2=>contextPercentValue>90?theme.fg("error",text2):contextPercentValue>70?theme.fg("warning",text2):theme.fg("muted",text2),makeTail=withMarker=>({plain:withMarker?`${ctxBase}${delegationIndicator}`:ctxBase,colored:withMarker?`${colorCtx(ctxBase)}${theme.fg("muted",delegationIndicator)}`:colorCtx(ctxBase)}),tail=makeTail(delegationIndicator!==""),modelName=state.model?.id||"no-model",fastIndicator=this.session.isFastModeActive()?FAST_MODE_INDICATOR:"",minimalRight=`${fastIndicator}${modelName}`;if(state.model?.reasoning){let thinkingLevel=state.thinkingLevel||"off";minimalRight=thinkingLevel==="off"?`${minimalRight}:off`:`${minimalRight}:${thinkingLevel}`}let thinkingSuffix=state.model?.reasoning?`:${state.thinkingLevel||"off"}`:"",modelRuns=[...fastIndicator?[{text:fastIndicator,color:"warning"}]:[],{text:modelName,color:"accent"},...thinkingSuffix?[{text:thinkingSuffix,color:"dim"}]:[]],routed=this.session.routedModel;if(routed){let routedSuffix=` \u2192 ${routed.model.id}`,routedLevel=routed.thinkingLevel?`:${routed.thinkingLevel}`:"";minimalRight+=`${routedSuffix}${routedLevel}`,modelRuns.push({text:routedSuffix,color:"accent"}),routedLevel&&modelRuns.push({text:routedLevel,color:"dim"})}let minimal={plain:minimalRight,colored:colorRightSide(modelRuns,minimalRight)},accountSuffix="";if(state.model)try{accountSuffix=accountFooterSuffix(this.session.modelRegistry.authStorage.get(state.model.provider),this.session.sessionManager.getSessionId())}catch{}let providerPrefix=(this.footerData.getAvailableProviderCount()>1||accountSuffix!=="")&&state.model?`(${state.model.provider}${accountSuffix}) `:"",full=providerPrefix?{plain:`${providerPrefix}${minimalRight}`,colored:colorRightSide([{text:providerPrefix,color:"muted"},...modelRuns],`${providerPrefix}${minimalRight}`)}:void 0,marker={plain:"\u2026",colored:theme.fg("dim","\u2026")},planWithTail=tailSegment=>planFooterLayout({width,anchor,pwdIndex,middle,tail:tailSegment,right:{minimal,full},separator,minPadding:2,ellipsisMarker:marker}),plan=planWithTail(tail);delegationIndicator!==""&&plan.kind==="left-elided"&&!plan.leftPlain.includes(delegationIndicator.trimStart())&&(tail=makeTail(!1),plan=planWithTail(tail));let joinSegments=segments=>({colored:segments.map(segment2=>segment2.colored).join(sepColored),width:visibleWidth(segments.map(segment2=>segment2.plain).join(separator))}),left,right;if(plan.kind==="full")right=plan.useFullRight&&full?full:minimal,left=joinSegments([...anchor,...middle,tail]);else if(plan.kind==="middle-elided"){right=plan.useFullRight&&full?full:minimal;let segments=[...anchor,...middle.slice(0,plan.keptMiddleCount)];plan.showMarker&&segments.push(marker),segments.push(tail),left=joinSegments(segments)}else if(plan.kind==="pwd-elided"){right=plan.useFullRight&&full?full:minimal;let segments=[...anchor.map((segment2,index)=>index===pwdIndex?{plain:plan.pwdPlain,colored:theme.fg("accent",plan.pwdPlain)}:segment2),...middle.slice(0,plan.keptMiddleCount)];plan.showMarker&&segments.push(marker),segments.push(tail),left=joinSegments(segments)}else plan.kind==="left-elided"?(right=minimal,left={colored:theme.fg("muted",plan.leftPlain),width:visibleWidth(plan.leftPlain)}):(left={colored:"",width:0},right={plain:plan.rightPlain,colored:colorRightSide(modelRuns,plan.rightPlain)});let rightWidth=visibleWidth(right.plain),padding=" ".repeat(Math.max(0,width-left.width-rightWidth)),lines=[left.colored+padding+right.colored],extensionStatuses=this.footerData.getExtensionStatuses();if(extensionStatuses.size>0){let statusLine2=Array.from(extensionStatuses.entries()).sort(([a],[b])=>a.localeCompare(b)).map(([,text2])=>sanitizeStatusText(text2)).join(" ");lines.push(truncateToWidth(statusLine2,width,theme.fg("dim","...")))}return lines}};var LoginDialogComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.input.focused=value2}constructor(tui,providerId,onComplete,providerNameOverride,titleOverride){super(),this.abortController=new AbortController,this._focused=!1,this.tui=tui,this.onComplete=onComplete;let title=titleOverride??`Login to ${providerNameOverride||providerId}`;this.addChild(new DynamicBorder),this.addChild(new Text(theme.fg("accent",theme.bold(title)),1,0)),this.contentContainer=new Container,this.addChild(this.contentContainer),this.input=new Input,this.input.onSubmit=()=>{if(this.inputResolver){let value2=this.input.getValue();this.replaceInputWithSubmittedText(value2),this.inputResolver(value2),this.inputResolver=void 0,this.inputRejecter=void 0}},this.input.onEscape=()=>{this.cancel()},this.addChild(new DynamicBorder)}get signal(){return this.abortController.signal}replaceInputWithSubmittedText(value2){this.contentContainer.children=this.contentContainer.children.map(child=>child===this.input?new Text(`> ${value2}`,0,0):child)}remountInput(hint){this.contentContainer.children=this.contentContainer.children.filter(child=>child!==this.input&&child!==this.liveHint),this.contentContainer.addChild(this.input),this.liveHint=hint,this.contentContainer.addChild(hint)}setLiveHint(hint){this.contentContainer.children=this.contentContainer.children.filter(child=>child!==this.liveHint),this.liveHint=hint,this.contentContainer.addChild(hint)}resetContent(){this.contentContainer.clear(),this.liveHint=void 0}cancel(){this.abortController.abort(),this.inputRejecter&&(this.inputRejecter(new Error("Login cancelled")),this.inputResolver=void 0,this.inputRejecter=void 0),this.onComplete(!1,"Login cancelled")}showAuth(url,instructions){this.resetContent(),this.contentContainer.addChild(new Spacer(1));let linkedUrl=`\x1B]8;;${url}\x07${url}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("accent",linkedUrl),1,0));let clickHint=process.platform==="darwin"?"Cmd+click to open":"Ctrl+click to open",hyperlink2=`\x1B]8;;${url}\x07${clickHint}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("dim",hyperlink2),1,0)),instructions&&(this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("warning",instructions),1,0))),openBrowser(url),this.tui.requestRender()}showDeviceCode(info){this.resetContent(),this.contentContainer.addChild(new Spacer(1));let linkedUrl=`\x1B]8;;${info.verificationUri}\x07${info.verificationUri}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("accent",linkedUrl),1,0));let clickHint=process.platform==="darwin"?"Cmd+click to open":"Ctrl+click to open",hyperlink2=`\x1B]8;;${info.verificationUri}\x07${clickHint}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("dim",hyperlink2),1,0)),this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("warning",`Enter code: ${info.userCode}`),1,0)),this.tui.requestRender()}showManualInput(prompt){return this.input.setValue(""),this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("dim",prompt),1,0)),this.remountInput(new Text(`(${keyHint("tui.select.cancel","to cancel")})`,1,0)),this.tui.requestRender(),new Promise((resolve46,reject)=>{this.inputResolver=resolve46,this.inputRejecter=reject})}showPrompt(message,placeholder){return this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("text",message),1,0)),placeholder&&this.contentContainer.addChild(new Text(theme.fg("dim",`e.g., ${placeholder}`),1,0)),this.remountInput(new Text(`(${keyHint("tui.select.cancel","to cancel,")} ${keyHint("tui.select.confirm","to submit")})`,1,0)),this.input.setValue(""),this.tui.requestRender(),new Promise((resolve46,reject)=>{this.inputResolver=resolve46,this.inputRejecter=reject})}showDetails(lines){this.resetContent(),this.contentContainer.addChild(new Spacer(1));for(let line of lines)this.contentContainer.addChild(new Text(line,1,0));this.tui.requestRender()}showInfo(message,links=[],showCloseHint=!1){this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("text",message),1,0));for(let link of links){let text2=link.label?`${link.label}: ${link.url}`:link.url,hyperlink2=`\x1B]8;;${link.url}\x07${text2}\x1B]8;;\x07`;this.contentContainer.addChild(new Text(theme.fg("accent",hyperlink2),1,0))}showCloseHint&&(this.contentContainer.addChild(new Spacer(1)),this.setLiveHint(new Text(`(${keyHint("tui.select.cancel","to close")})`,1,0))),this.tui.requestRender()}showWaiting(message){this.contentContainer.addChild(new Spacer(1)),this.contentContainer.addChild(new Text(theme.fg("dim",message),1,0)),this.setLiveHint(new Text(`(${keyHint("tui.select.cancel","to cancel")})`,1,0)),this.tui.requestRender()}showProgress(message){this.contentContainer.addChild(new Text(theme.fg("dim",message),1,0)),this.tui.requestRender()}handleInput(data){if(getKeybindings().matches(data,"tui.select.cancel")){this.cancel();return}this.input.handleInput(data)}};var ModelCatalogRefreshCoordinator=class{constructor(){this.activeByRuntime=new WeakMap}refresh(modelRuntime,signal){signal.throwIfAborted();let active=this.activeByRuntime.get(modelRuntime);if(!active){let controller=new AbortController,created,operation=modelRuntime.refresh({signal:controller.signal}),promise=raceWithAbortSignal(operation,controller.signal).finally(()=>{this.activeByRuntime.get(modelRuntime)===created&&this.activeByRuntime.delete(modelRuntime)});created={controller,promise,waiters:0},active=created,this.activeByRuntime.set(modelRuntime,active)}return active.waiters++,raceWithAbortSignal(active.promise,signal).finally(()=>{active.waiters--,active.waiters===0&&this.activeByRuntime.get(modelRuntime)===active&&active.controller.abort()})}},modelCatalogRefreshCoordinator=new ModelCatalogRefreshCoordinator;function refreshModelCatalogs(modelRuntime,signal){return modelCatalogRefreshCoordinator.refresh(modelRuntime,signal)}var ModelSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(tui,currentModel,settingsManager,modelRuntime,scopedModels,onSelect,onCancel,initialSearchInput,favorites){if(super(),this._focused=!1,this.allModels=[],this.scopedModelItems=[],this.activeModels=[],this.filteredModels=[],this.selectedIndex=0,this.favoriteIds=[],this.refreshStatusMessage="Refreshing model catalogs\u2026",this.refreshStatusSuccess=!1,this.scope="all",this.refreshAbortController=new AbortController,this.closed=!1,this.tui=tui,this.currentModel=currentModel,this.settingsManager=settingsManager,this.modelRuntime=modelRuntime,this.scopedModels=scopedModels,this.scope=scopedModels.length>0?"narrowed":"all",this.onSelectCallback=onSelect,this.onCancelCallback=onCancel,this.favoriteIds=favorites?.favoriteModelIds===null?null:[...favorites?.favoriteModelIds??[]],this.favoriteIdsAtOpen=this.favoriteIds===null?null:[...this.favoriteIds],this.onFavoriteChangeCallback=favorites?.onFavoriteChange,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),scopedModels.length>0)this.scopeText=new Text(this.getScopeText(),0,0),this.addChild(this.scopeText),this.scopeHintText=new Text(this.getScopeHintText(),0,0),this.addChild(this.scopeHintText);else{let hintText="Only showing models from configured providers. Use /login to add providers.";this.addChild(new Text(theme.fg("warning",hintText),0,0))}this.addChild(new Spacer(1)),this.addChild(new Text(`${keyHint("tui.select.confirm","select")} ${keyHint("app.models.toggleFavorite","favorite")}`,0,0)),this.addChild(new Spacer(1)),this.searchInput=new Input,initialSearchInput&&this.searchInput.setValue(initialSearchInput),this.searchInput.onSubmit=()=>{this.filteredModels[this.selectedIndex]&&this.handleSelect(this.filteredModels[this.selectedIndex].model)},this.addChild(this.searchInput),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.loadModelsFromSnapshot(),initialSearchInput?this.filterModels(initialSearchInput):this.updateList(),this.tui.requestRender(),this.refreshModels()}loadModelsFromSnapshot(){let models=(this.modelRuntime instanceof ModelRegistry?this.modelRuntime.getAvailable():this.modelRuntime.getAvailableSnapshot()).map(model=>({fullId:getModelFullId(model),provider:model.provider,id:model.id,model}));this.allModels=this.sortModels(models);let modelsById=new Map(models.map(model=>[model.fullId,model]));this.scopedModels=this.scopedModels.map(scoped=>{let refreshed=this.modelRuntime instanceof ModelRegistry?this.modelRuntime.find(scoped.model.provider,scoped.model.id):this.modelRuntime.getModel(scoped.model.provider,scoped.model.id);return refreshed?{...scoped,model:refreshed}:scoped}),this.scopedModelItems=this.scopedModels.flatMap(scoped=>{let refreshed=modelsById.get(`${scoped.model.provider}/${scoped.model.id}`);return refreshed?[refreshed]:[]}),this.activeModels=this.scope==="narrowed"?this.scopedModelItems:this.allModels,this.filteredModels=this.activeModels;let currentIndex=this.filteredModels.findIndex(item=>modelsAreEqual(this.currentModel,item.model));this.selectedIndex=currentIndex>=0?currentIndex:Math.min(this.selectedIndex,Math.max(0,this.filteredModels.length-1))}async refreshModels(){let timedOut=!1;this.refreshTimeout=setTimeout(()=>{timedOut=!0,this.refreshAbortController.abort()},15e3);try{let result3;if(this.modelRuntime instanceof ModelRegistry?(await this.modelRuntime.refresh(),result3={aborted:!1,errors:new Map}):result3=await refreshModelCatalogs(this.modelRuntime,this.refreshAbortController.signal),this.closed)return;this.refreshStatusMessage="",result3.aborted&&timedOut?this.errorMessage="Model refresh timed out; showing cached models.":result3.errors.size===1?this.errorMessage=`Could not refresh ${result3.errors.keys().next().value}; showing cached models.`:result3.errors.size>1?this.errorMessage=`Could not refresh ${result3.errors.size} model catalogs (${[...result3.errors.keys()].join(", ")}); showing cached models.`:(this.errorMessage=this.modelRuntime.getError(),this.errorMessage||(this.refreshStatusMessage="Model catalogs refreshed.",this.refreshStatusSuccess=!0)),this.loadModelsFromSnapshot(),this.filterModels(this.searchInput.getValue()),this.tui.requestRender()}catch(error2){if(this.closed)return;this.refreshStatusMessage="",this.errorMessage=timedOut?"Model refresh timed out; showing cached models.":`Could not refresh model catalogs: ${error2 instanceof Error?error2.message:String(error2)}`,this.updateList(),this.tui.requestRender()}finally{this.refreshTimeout&&clearTimeout(this.refreshTimeout)}}dispose(){this.closed||(this.closed=!0,this.refreshTimeout&&clearTimeout(this.refreshTimeout),this.refreshAbortController.abort())}sortModels(models){let sorted=[...models],isAmbient=createAmbientProviderCheck(this.modelRuntime);return sorted.sort((a,b)=>{let aIsCurrent=modelsAreEqual(this.currentModel,a.model),bIsCurrent=modelsAreEqual(this.currentModel,b.model);if(aIsCurrent&&!bIsCurrent)return-1;if(!aIsCurrent&&bIsCurrent)return 1;let aIsFavorite=isFavoriteModel(this.favoriteIdsAtOpen,a.fullId),bIsFavorite=isFavoriteModel(this.favoriteIdsAtOpen,b.fullId);if(aIsFavorite&&!bIsFavorite)return-1;if(!aIsFavorite&&bIsFavorite)return 1;let ambientCompare=Number(isAmbient(a.provider))-Number(isAmbient(b.provider));if(ambientCompare!==0)return ambientCompare;let providerCompare=a.provider.localeCompare(b.provider);return providerCompare!==0?providerCompare:a.id.localeCompare(b.id)}),sorted}getScopeText(){let allText=this.scope==="all"?theme.fg("accent","all"):theme.fg("muted","all"),narrowedText=this.scope==="narrowed"?theme.fg("accent","narrowed"):theme.fg("muted","narrowed");return`${theme.fg("muted","Catalog: ")}${allText}${theme.fg("muted"," | ")}${narrowedText}`}getScopeHintText(){return keyHint("tui.input.tab","catalog")+theme.fg("muted"," (all/narrowed)")}setScope(scope){if(this.scope===scope)return;this.scope=scope,this.activeModels=this.scope==="narrowed"?this.scopedModelItems:this.allModels;let currentIndex=this.activeModels.findIndex(item=>modelsAreEqual(this.currentModel,item.model));this.selectedIndex=currentIndex>=0?currentIndex:0,this.filterModels(this.searchInput.getValue()),this.scopeText&&this.scopeText.setText(this.getScopeText())}filterModels(query){this.filteredModels=query?rankModelSearchItems(this.activeModels,query,({id,provider,model})=>({id,provider,name:model.name}),{favoritesFirst:this.scope==="all",isFavorite:item=>isFavoriteModel(this.favoriteIdsAtOpen,item.fullId)}):this.activeModels,this.selectedIndex=query?0:Math.min(this.selectedIndex,Math.max(0,this.filteredModels.length-1)),this.updateList()}updateList(){this.listContainer.clear();let maxVisible=this.tui.terminal?Math.max(5,Math.floor(this.tui.terminal.rows/2)):10,startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(maxVisible/2),this.filteredModels.length-maxVisible)),endIndex=Math.min(startIndex+maxVisible,this.filteredModels.length);startIndex>0&&this.listContainer.addChild(new Text(theme.fg("muted",` \u2026 ${startIndex} more above`),0,0));for(let i=startIndex;i<endIndex;i++){let item=this.filteredModels[i];if(!item)continue;let isSelected=i===this.selectedIndex,isCurrent=modelsAreEqual(this.currentModel,item.model),favoriteMarker=isFavoriteModel(this.favoriteIds,item.fullId)?theme.fg("success","* "):theme.fg("dim"," "),line="";if(isSelected){let prefix=theme.fg("accent","\u2192 "),modelText=`${favoriteMarker}${theme.fg("accent",item.id)}`,providerBadge=theme.fg("muted",`[${item.provider}]`),checkmark=isCurrent?theme.fg("success"," \u2713"):"";line=`${prefix}${modelText} ${providerBadge}${checkmark}`}else{let modelText=` ${favoriteMarker}${item.id}`,providerBadge=theme.fg("muted",`[${item.provider}]`),checkmark=isCurrent?theme.fg("success"," \u2713"):"";line=`${modelText} ${providerBadge}${checkmark}`}this.listContainer.addChild(new Text(line,0,0))}if(endIndex<this.filteredModels.length&&this.listContainer.addChild(new Text(theme.fg("muted",` \u2026 ${this.filteredModels.length-endIndex} more below`),0,0)),this.errorMessage){let errorLines2=this.errorMessage.split(`
2528
2528
  `);for(let line of errorLines2)this.listContainer.addChild(new Text(theme.fg("error",line),0,0))}else if(this.filteredModels.length===0)this.listContainer.addChild(new Text(theme.fg("muted"," No matching models"),0,0));else{let selected=this.filteredModels[this.selectedIndex];this.listContainer.addChild(new Spacer(1)),this.listContainer.addChild(new Text(theme.fg("muted",` Model Name: ${selected.model.name}`),0,0))}this.refreshStatusMessage&&(this.listContainer.addChild(new Spacer(1)),this.listContainer.addChild(new Text(theme.fg(this.refreshStatusSuccess?"success":"muted",` ${this.refreshStatusMessage}`),0,0)))}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.input.tab")){if(this.scopedModelItems.length>0){let nextScope=this.scope==="all"?"narrowed":"all";this.setScope(nextScope),this.scopeHintText&&this.scopeHintText.setText(this.getScopeHintText())}return}if(kb.matches(keyData,"tui.select.up")){if(this.filteredModels.length===0)return;this.selectedIndex=this.selectedIndex===0?this.filteredModels.length-1:this.selectedIndex-1,this.updateList()}else if(kb.matches(keyData,"tui.select.down")){if(this.filteredModels.length===0)return;this.selectedIndex=this.selectedIndex===this.filteredModels.length-1?0:this.selectedIndex+1,this.updateList()}else if(kb.matches(keyData,"tui.select.confirm")){let selectedModel=this.filteredModels[this.selectedIndex];selectedModel&&this.handleSelect(selectedModel.model)}else kb.matches(keyData,"app.models.toggleFavorite")?this.handleToggleFavorite():kb.matches(keyData,"tui.select.cancel")?(this.dispose(),this.onCancelCallback()):(this.searchInput.handleInput(keyData),this.filterModels(this.searchInput.getValue()))}handleSelect(model){this.dispose(),this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this.onSelectCallback(model)}handleToggleFavorite(){let selectedModel=this.filteredModels[this.selectedIndex];if(!selectedModel)return;let allModelIds=this.allModels.map(model=>model.fullId);this.favoriteIds=toggleFavoriteModel(this.favoriteIds,allModelIds,selectedModel.fullId),this.filterModels(this.searchInput.getValue());let selectedIndex=this.filteredModels.findIndex(item=>item.fullId===selectedModel.fullId);selectedIndex>=0&&(this.selectedIndex=selectedIndex,this.updateList());let nextFavoriteIds=this.favoriteIds===null?null:[...this.favoriteIds];this.onFavoriteChangeCallback?.(nextFavoriteIds,this.allModels.map(item=>item.model),selectedModel.model),this.tui.requestRender()}getSearchInput(){return this.searchInput}};function formatAuthSelectorProviderType(authType,subscription){return authType==="api_key"?"API key":subscription===!1?"account":"subscription"}function formatAuthSelectorProviderStatus(provider){if(!provider.status)return theme.fg("muted"," \u2022 not configured");if(provider.status.type!==provider.authType){let label3=`${formatAuthSelectorProviderType(provider.status.type,provider.subscription)} configured`;return theme.fg("muted"," \u2022 ")+theme.fg("warning",label3)}if(!provider.status.source||provider.status.source==="OAuth"||provider.status.source==="stored credential")return theme.fg("success"," \u2713 configured");let source2=/^[A-Z][A-Z0-9_]*(?:, [A-Z][A-Z0-9_]*)*$/.test(provider.status.source)?`env: ${provider.status.source}`:provider.status.source;return theme.fg("success",` \u2713 ${source2}`)}var OAuthSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(mode,providers,onSelect,onCancel,initialSearchInput){super(),this._focused=!1,this.selectedIndex=0,this.mode=mode,this.allProviders=providers,this.filteredProviders=providers,this.showAuthTypeLabels=new Set(providers.map(provider=>provider.authType)).size>1,this.onSelectCallback=onSelect,this.onCancelCallback=onCancel,this.addChild(new DynamicBorder),this.addChild(new Spacer(1));let title=mode==="login"?"Select provider to configure:":"Select provider to logout:";this.addChild(new TruncatedText(theme.fg("accent",theme.bold(title)),1,0)),this.addChild(new Spacer(1)),this.searchInput=new Input,initialSearchInput&&this.searchInput.setValue(initialSearchInput),this.searchInput.onSubmit=()=>{let selectedProvider=this.filteredProviders[this.selectedIndex];selectedProvider&&this.onSelectCallback(selectedProvider.id,selectedProvider.authType)},this.addChild(this.searchInput),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.filterProviders(initialSearchInput??"")}filterProviders(query){this.filteredProviders=query?fuzzyFilter(this.allProviders,query,provider=>`${provider.name} ${provider.id} ${provider.authType} ${provider.method?.name??""}`):this.allProviders,this.selectedIndex=Math.max(0,Math.min(this.selectedIndex,Math.max(0,this.filteredProviders.length-1))),this.updateList()}updateList(){this.listContainer.clear();let maxVisible=8,startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(maxVisible/2),this.filteredProviders.length-maxVisible)),endIndex=Math.min(startIndex+maxVisible,this.filteredProviders.length);for(let i=startIndex;i<endIndex;i++){let provider=this.filteredProviders[i];if(!provider)continue;let isSelected=i===this.selectedIndex,statusIndicator=formatAuthSelectorProviderStatus(provider),authTypeLabel=this.showAuthTypeLabels?theme.fg("muted",` [${formatAuthSelectorProviderType(provider.authType,provider.subscription)}]`):"",line="";if(isSelected){let prefix=theme.fg("accent","\u2192 "),text2=theme.fg("accent",provider.name);line=prefix+text2+authTypeLabel+statusIndicator}else line=` ${theme.fg("text",provider.name)}`+authTypeLabel+statusIndicator;this.listContainer.addChild(new TruncatedText(line,1,0))}if(startIndex>0||endIndex<this.filteredProviders.length){let scrollInfo=theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredProviders.length})`);this.listContainer.addChild(new TruncatedText(scrollInfo,1,0))}if(this.filteredProviders.length===0){let message=this.allProviders.length===0?this.mode==="login"?"No providers available":"No providers logged in. Use /login first.":"No matching providers";this.listContainer.addChild(new TruncatedText(theme.fg("muted",` ${message}`),1,0))}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up")){if(this.filteredProviders.length===0)return;this.selectedIndex=Math.max(0,this.selectedIndex-1),this.updateList()}else if(kb.matches(keyData,"tui.select.down")){if(this.filteredProviders.length===0)return;this.selectedIndex=Math.min(this.filteredProviders.length-1,this.selectedIndex+1),this.updateList()}else if(kb.matches(keyData,"tui.select.confirm")){let selectedProvider=this.filteredProviders[this.selectedIndex];selectedProvider&&this.onSelectCallback(selectedProvider.id,selectedProvider.authType)}else kb.matches(keyData,"tui.select.cancel")?this.onCancelCallback():(this.searchInput.handleInput(keyData),this.filterProviders(this.searchInput.getValue()))}};var SETTINGS_SUBMENU_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},THINKING_DESCRIPTIONS={off:"No reasoning",minimal:"Very brief reasoning (~1k tokens)",low:"Light reasoning (~2k tokens)",medium:"Moderate reasoning (~8k tokens)",high:"Deep reasoning (~16k tokens)",xhigh:"Extended reasoning (~32k tokens or native xhigh effort)",max:"Maximum reasoning"},DEFAULT_PROJECT_TRUST_LABELS={ask:"Ask",always:"Always trust",never:"Never trust"},DEFAULT_PROJECT_TRUST_BY_LABEL=new Map(Object.entries(DEFAULT_PROJECT_TRUST_LABELS).map(([value2,label3])=>[label3,value2])),WarningSettingsSubmenu=class extends Container{constructor(warnings,onChange,onCancel){super(),this.state={...warnings};let items=[{id:"anthropic-extra-usage",label:"Anthropic extra usage",description:"Warn when Anthropic subscription auth may use paid extra usage",currentValue:this.state.anthropicExtraUsage??!0?"true":"false",values:["true","false"]}];this.settingsList=new SettingsList(items,Math.min(items.length,10),getSettingsListTheme(),(id,newValue)=>{id==="anthropic-extra-usage"&&(this.state={...this.state,anthropicExtraUsage:newValue==="true"},onChange({...this.state}))},onCancel),this.addChild(this.settingsList)}handleInput(data){this.settingsList.handleInput(data)}},SelectSubmenu=class extends Container{constructor(title,description,options,currentValue,onSelect,onCancel,onSelectionChange){super(),this.addChild(new Text(theme.bold(theme.fg("accent",title)),0,0)),description&&(this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("muted",description),0,0))),this.addChild(new Spacer(1)),this.selectList=new SelectList(options,Math.min(options.length,10),getSelectListTheme(),SETTINGS_SUBMENU_SELECT_LIST_LAYOUT);let currentIndex=options.findIndex(o=>o.value===currentValue);currentIndex!==-1&&this.selectList.setSelectedIndex(currentIndex),this.selectList.onSelect=item=>{onSelect(item.value)},this.selectList.onCancel=onCancel,onSelectionChange&&(this.selectList.onSelectionChange=item=>{onSelectionChange(item.value)}),this.addChild(this.selectList),this.addChild(new Spacer(1)),this.addChild(new Text(theme.fg("dim"," Enter to select \xB7 Esc to go back"),0,0))}handleInput(data){this.selectList.handleInput(data)}};function themeItems(availableThemes,currentTheme){return availableThemes.map(name=>({value:name,label:`${name===currentTheme?"\u2713 ":" "}${name}`,...name===SYSTEM_THEME_NAME?{description:"Theme created from your terminal's colors"}:{}}))}var AUTOMATIC_THEME_VALUE="/";function singleModeThemeItems(availableThemes,currentTheme){let items=themeItems(availableThemes,currentTheme),systemIndex=items.findIndex(item=>item.value===SYSTEM_THEME_NAME);return[...systemIndex===-1?[]:items.splice(systemIndex,1),{value:AUTOMATIC_THEME_VALUE,label:" automatic",description:"Use separate themes for light and dark terminal appearance"},...items]}function preferredTheme(availableThemes,preferred,fallback){return preferred&&availableThemes.includes(preferred)?preferred:availableThemes.includes(fallback)?fallback:availableThemes[0]??fallback}function defaultAutomaticThemes(currentThemeSetting,availableThemes){let autoTheme=parseAutoThemeSetting(currentThemeSetting);if(autoTheme)return autoTheme;let currentFixedTheme=currentThemeSetting.includes("/")?void 0:currentThemeSetting,themeName=preferredTheme(availableThemes,currentFixedTheme,SYSTEM_THEME_NAME);return{lightTheme:themeName,darkTheme:themeName}}var ThemeSubmenu=class extends Container{constructor(currentThemeSetting,terminalTheme,availableThemes,callbacks,onDone){super(),this.callbacks=callbacks,this.availableThemes=availableThemes,this.terminalTheme=terminalTheme,this.onDone=onDone,this.originalThemeSetting=currentThemeSetting;let autoTheme=parseAutoThemeSetting(currentThemeSetting),automaticThemes=defaultAutomaticThemes(currentThemeSetting,availableThemes),fixedTheme=autoTheme||currentThemeSetting.includes("/")?void 0:currentThemeSetting;this.mode=autoTheme?"automatic":"single",this.lightTheme=automaticThemes.lightTheme,this.darkTheme=automaticThemes.darkTheme,this.singleTheme=preferredTheme(availableThemes,fixedTheme??(autoTheme?this.getActiveAutomaticTheme():void 0),SYSTEM_THEME_NAME),this.mode==="automatic"?this.showAutomaticMenu():this.showSingleMenu()}handleInput(data){this.inputComponent?.handleInput?.(data)}setContent(renderComponent,inputComponent=renderComponent){this.clear(),this.addChild(renderComponent),this.inputComponent=inputComponent}showSingleMenu(){this.mode="single";let menu=new SelectSubmenu("Theme","Select a theme, or choose automatic to follow terminal appearance.",singleModeThemeItems(this.availableThemes,this.singleTheme),this.singleTheme,value2=>{if(value2===AUTOMATIC_THEME_VALUE){this.mode="automatic",this.callbacks.onThemePreview?.(this.getThemeSetting()),this.showAutomaticMenu();return}this.singleTheme=value2,this.apply(value2)},()=>this.cancel(),value2=>{this.callbacks.onThemePreview?.(value2===AUTOMATIC_THEME_VALUE?this.getAutomaticThemeSetting():value2)});this.setContent(menu)}showAutomaticMenu(){this.mode="automatic";let content=new Container;content.addChild(new Text(theme.bold(theme.fg("accent","Automatic Theme")),0,0)),content.addChild(new Spacer(1)),content.addChild(new Text(theme.fg("muted","Choose themes for terminal light and dark appearance."),0,0)),content.addChild(new Text(theme.fg("muted","Light/dark detection requires terminal support."),0,0)),content.addChild(new Spacer(1));let items=[{id:"light-theme",label:"Light theme",description:"Theme to use in automatic mode when the terminal is light",currentValue:this.lightTheme,submenu:(currentValue,done)=>this.createThemeSelect("Light Theme","Select the theme to use for light terminal appearance",currentValue,done,value2=>{this.lightTheme=value2,this.callbacks.onThemePreview?.(this.getThemeSetting()),done(value2)})},{id:"dark-theme",label:"Dark theme",description:"Theme to use in automatic mode when the terminal is dark",currentValue:this.darkTheme,submenu:(currentValue,done)=>this.createThemeSelect("Dark Theme","Select the theme to use for dark terminal appearance",currentValue,done,value2=>{this.darkTheme=value2,this.callbacks.onThemePreview?.(this.getThemeSetting()),done(value2)})},{id:"apply",label:"Apply",description:"Save and go back",currentValue:"save and go back",values:["save and go back"]},{id:"single-mode",label:"Change mode",description:"Switch to one theme for light and dark",currentValue:"switch to single theme",values:["switch to single theme"]}],settingsList=new SettingsList(items,Math.min(items.length,10),getSettingsListTheme(),id=>{switch(id){case"single-mode":this.mode="single",this.singleTheme=this.getActiveAutomaticTheme(),this.callbacks.onThemePreview?.(this.singleTheme),this.showSingleMenu();break;case"apply":this.apply(this.getAutomaticThemeSetting());break}},()=>this.cancel());content.addChild(settingsList),this.setContent(content,settingsList)}createThemeSelect(title,description,currentValue,done,onSelect){return new SelectSubmenu(title,description,themeItems(this.availableThemes,currentValue),currentValue,onSelect,()=>{this.callbacks.onThemePreview?.(this.getThemeSetting()),done()},value2=>this.callbacks.onThemePreview?.(value2))}getThemeSetting(){return this.mode==="automatic"?this.getAutomaticThemeSetting():this.singleTheme}getActiveAutomaticTheme(){return this.terminalTheme==="light"?this.lightTheme:this.darkTheme}getAutomaticThemeSetting(){return`${this.lightTheme}/${this.darkTheme}`}apply(themeSetting){this.onDone(themeSetting)}cancel(){this.callbacks.onThemePreview?.(this.originalThemeSetting),this.onDone()}},SettingsSelectorComponent=class extends Container{constructor(config,callbacks){super();let supportsImages=getCapabilities().images,followUpKey=keyDisplayText("app.message.followUp"),currentWarnings={...config.warnings},items=[{id:"autocompact",label:"Auto-compact",description:"Automatically compact context when it gets too large",currentValue:config.autoCompact?"true":"false",values:["true","false"]},{id:"steering-mode",label:"Steering mode",description:"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.",currentValue:config.steeringMode,values:["one-at-a-time","all"]},{id:"follow-up-mode",label:"Follow-up mode",description:`${followUpKey} queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.`,currentValue:config.followUpMode,values:["one-at-a-time","all"]},{id:"transport",label:"Transport",description:"Preferred transport for providers that support multiple transports",currentValue:config.transport,values:["sse","websocket","websocket-cached","auto"]},{id:"http-idle-timeout",label:"HTTP idle timeout",description:"Maximum idle gap while waiting for HTTP headers or body chunks. Disable for local models that pause longer than five minutes.",currentValue:formatHttpIdleTimeoutMs(config.httpIdleTimeoutMs),values:HTTP_IDLE_TIMEOUT_CHOICES.map(choice=>choice.label)},{id:"hide-thinking",label:"Hide thinking",description:"Hide thinking blocks in assistant responses",currentValue:config.hideThinkingBlock?"true":"false",values:["true","false"]},{id:"smooth-streaming",label:"Smooth streaming",description:"Reveal streamed assistant text at a steady pace",currentValue:config.smoothStreaming?"true":"false",values:["true","false"]},{id:"streaming-fps",label:"Streaming fps",description:"Maximum frame rate for smooth streaming",currentValue:String(config.smoothStreamingFps),values:["30","60","90","120"]},{id:"mermaid-rendering",label:"Mermaid diagrams",description:"Render Mermaid code blocks as Unicode diagrams",currentValue:config.mermaidRenderingMode,values:["off","final","streaming"]},{id:"cache-miss-notices",label:"Cache miss notices",description:"Show transcript notices for cache costs and provider recovery diagnostics",currentValue:config.showCacheMissNotices?"true":"false",values:["true","false"]},{id:"collapse-changelog",label:"Collapse changelog",description:"Show condensed changelog after updates",currentValue:config.collapseChangelog?"true":"false",values:["true","false"]},{id:"quiet-startup",label:"Quiet startup",description:"Disable verbose printing at startup (header: keep only the startup header)",currentValue:String(config.quietStartup),values:["true","header","false"]},{id:"install-telemetry",label:"Install telemetry",description:"Send an anonymous version/update ping after changelog-detected updates",currentValue:config.enableInstallTelemetry?"true":"false",values:["true","false"]},{id:"default-project-trust",label:"Default project trust",description:"Fallback behavior when no extension or saved trust decision decides project trust",currentValue:DEFAULT_PROJECT_TRUST_LABELS[config.defaultProjectTrust],values:Object.values(DEFAULT_PROJECT_TRUST_LABELS)},{id:"double-escape-action",label:"Double-escape action",description:"Action when pressing Escape twice with empty editor",currentValue:config.doubleEscapeAction,values:["tree","fork","none"]},{id:"tree-filter-mode",label:"Tree filter mode",description:"Default filter when opening /tree",currentValue:config.treeFilterMode,values:["default","no-tools","user-only","labeled-only","all"]},{id:"warnings",label:"Warnings",description:"Enable or disable individual warnings",currentValue:"configure",submenu:(_currentValue,done)=>new WarningSettingsSubmenu(currentWarnings,warnings=>{currentWarnings=warnings,callbacks.onWarningsChange(warnings)},()=>done())},{id:"thinking",label:"Thinking level",description:"Reasoning depth for thinking-capable models",currentValue:config.thinkingLevel,submenu:(currentValue,done)=>new SelectSubmenu("Thinking Level","Select reasoning depth for thinking-capable models",config.availableThinkingLevels.map(level=>({value:level,label:level,description:THINKING_DESCRIPTIONS[level]})),currentValue,value2=>{callbacks.onThinkingLevelChange(value2),done(value2)},()=>done())},{id:"tui-mode",label:"TUI mode",description:"Interface layout; fullscreen mode is experimental",currentValue:config.tuiMode,values:["regular","fullscreen"]},{id:"terminal-mouse",label:"Terminal mouse",description:"Capture while questions are pending, always, or off (also disables fullscreen mouse)",currentValue:config.terminalMouse??"whilePending",values:[...TERMINAL_MOUSE_MODES]},{id:"fullscreen-exit-output",label:"Fullscreen exit output",description:"Print the transcript or only a session resume hint when exiting fullscreen mode",currentValue:config.fullscreenExitOutput,values:["transcript","resume-hint"]},{id:"fullscreen-scrollbar",label:"Fullscreen scrollbar",description:"Scrollbar behavior in fullscreen mode; has no effect in regular mode",currentValue:config.fullscreenScrollbar,values:["auto","always","hidden"]},{id:"fullscreen-copy-on-select",label:"Fullscreen copy on select",description:"Automatically copy selected text in fullscreen mode; disable to copy selections with Ctrl+X",currentValue:config.fullscreenCopyOnSelect?"true":"false",values:["true","false"]},{id:"fullscreen-wheel-scroll-lines",label:"Fullscreen wheel scrolling",description:"Lines per mouse-wheel event in fullscreen mode; 'auto' speeds up fast wheel spins where the terminal does not",currentValue:String(config.fullscreenWheelScrollLines),values:["auto",...[...new Set([1,2,3,5,10,config.fullscreenWheelScrollLines])].filter(lines=>lines!=="auto").sort((a,b)=>a-b).map(String)]},{id:"theme",label:"Theme",description:"Color theme for the interface",currentValue:config.currentTheme,submenu:(currentValue,done)=>new ThemeSubmenu(currentValue,config.terminalTheme,config.availableThemes,callbacks,done)}];supportsImages&&(items.splice(1,0,{id:"show-images",label:"Show images",description:"Render images inline in terminal",currentValue:config.showImages?"true":"false",values:["true","false"]}),items.splice(2,0,{id:"image-width-cells",label:"Image width",description:"Preferred inline image width in terminal cells",currentValue:String(config.imageWidthCells),values:["60","80","120"]})),items.splice(supportsImages?3:1,0,{id:"auto-resize-images",label:"Auto-resize images",description:"Resize large images to 2000x2000 max for better model compatibility",currentValue:config.autoResizeImages?"true":"false",values:["true","false"]});let autoResizeIndex=items.findIndex(item=>item.id==="auto-resize-images");items.splice(autoResizeIndex+1,0,{id:"block-images",label:"Block images",description:"Prevent images from being sent to LLM providers",currentValue:config.blockImages?"true":"false",values:["true","false"]});let blockImagesIndex=items.findIndex(item=>item.id==="block-images");items.splice(blockImagesIndex+1,0,{id:"skill-commands",label:"Skill commands",description:"Register skills as /skill:name commands",currentValue:config.enableSkillCommands?"true":"false",values:["true","false"]});let skillCommandsIndex=items.findIndex(item=>item.id==="skill-commands");items.splice(skillCommandsIndex+1,0,{id:"show-hardware-cursor",label:"Show hardware cursor",description:"Show the terminal cursor while still positioning it for IME support",currentValue:config.showHardwareCursor?"true":"false",values:["true","false"]});let hardwareCursorIndex=items.findIndex(item=>item.id==="show-hardware-cursor");items.splice(hardwareCursorIndex+1,0,{id:"editor-padding",label:"Editor padding",description:"Horizontal padding for input editor (0-3)",currentValue:String(config.editorPaddingX),values:["0","1","2","3"]});let editorPaddingIndex=items.findIndex(item=>item.id==="editor-padding");items.splice(editorPaddingIndex+1,0,{id:"output-padding",label:"Output padding",description:"Horizontal padding for user messages, assistant messages, and thinking",currentValue:String(config.outputPad),values:["0","1"]});let outputPaddingIndex=items.findIndex(item=>item.id==="output-padding");items.splice(outputPaddingIndex+1,0,{id:"autocomplete-max-visible",label:"Autocomplete max items",description:"Max visible items in autocomplete dropdown (3-20)",currentValue:String(config.autocompleteMaxVisible),values:["3","5","7","10","15","20"]});let autocompleteIndex=items.findIndex(item=>item.id==="autocomplete-max-visible");items.splice(autocompleteIndex+1,0,{id:"clear-on-shrink",label:"Clear on shrink",description:"Clear empty rows when content shrinks (may cause flicker)",currentValue:config.clearOnShrink?"true":"false",values:["true","false"]});let clearOnShrinkIndex=items.findIndex(item=>item.id==="clear-on-shrink");items.splice(clearOnShrinkIndex+1,0,{id:"terminal-progress",label:"Terminal progress",description:"Show OSC 9;4 progress indicators in the terminal tab bar",currentValue:config.showTerminalProgress?"true":"false",values:["true","false"]}),this.addChild(new DynamicBorder),this.settingsList=new SettingsList(items,10,getSettingsListTheme(),(id,newValue)=>{switch(id){case"autocompact":callbacks.onAutoCompactChange(newValue==="true");break;case"show-images":callbacks.onShowImagesChange(newValue==="true");break;case"image-width-cells":callbacks.onImageWidthCellsChange(parseInt(newValue,10));break;case"auto-resize-images":callbacks.onAutoResizeImagesChange(newValue==="true");break;case"block-images":callbacks.onBlockImagesChange(newValue==="true");break;case"skill-commands":callbacks.onEnableSkillCommandsChange(newValue==="true");break;case"steering-mode":callbacks.onSteeringModeChange(newValue);break;case"follow-up-mode":callbacks.onFollowUpModeChange(newValue);break;case"transport":callbacks.onTransportChange(newValue);break;case"http-idle-timeout":{let choice=HTTP_IDLE_TIMEOUT_CHOICES.find(item=>item.label===newValue);choice&&callbacks.onHttpIdleTimeoutMsChange(choice.timeoutMs);break}case"hide-thinking":callbacks.onHideThinkingBlockChange(newValue==="true");break;case"smooth-streaming":callbacks.onSmoothStreamingChange(newValue==="true");break;case"streaming-fps":callbacks.onSmoothStreamingFpsChange(parseInt(newValue,10));break;case"mermaid-rendering":callbacks.onMermaidRenderingModeChange(newValue);break;case"cache-miss-notices":callbacks.onShowCacheMissNoticesChange(newValue==="true");break;case"collapse-changelog":callbacks.onCollapseChangelogChange(newValue==="true");break;case"quiet-startup":callbacks.onQuietStartupChange(newValue==="header"?"header":newValue==="true");break;case"install-telemetry":callbacks.onEnableInstallTelemetryChange(newValue==="true");break;case"default-project-trust":{let defaultProjectTrust=DEFAULT_PROJECT_TRUST_BY_LABEL.get(newValue);defaultProjectTrust&&callbacks.onDefaultProjectTrustChange(defaultProjectTrust);break}case"double-escape-action":callbacks.onDoubleEscapeActionChange(newValue);break;case"tree-filter-mode":callbacks.onTreeFilterModeChange(newValue);break;case"show-hardware-cursor":callbacks.onShowHardwareCursorChange(newValue==="true");break;case"editor-padding":callbacks.onEditorPaddingXChange(parseInt(newValue,10));break;case"output-padding":callbacks.onOutputPadChange(newValue==="0"?0:1);break;case"autocomplete-max-visible":callbacks.onAutocompleteMaxVisibleChange(parseInt(newValue,10));break;case"clear-on-shrink":callbacks.onClearOnShrinkChange(newValue==="true");break;case"terminal-progress":callbacks.onShowTerminalProgressChange(newValue==="true");break;case"terminal-mouse":isTerminalMouseMode(newValue)&&callbacks.onTerminalMouseChange?.(newValue);break;case"tui-mode":callbacks.onTuiModeChange(newValue);break;case"fullscreen-exit-output":callbacks.onFullscreenExitOutputChange(newValue);break;case"fullscreen-scrollbar":callbacks.onFullscreenScrollbarChange(newValue);break;case"fullscreen-copy-on-select":callbacks.onFullscreenCopyOnSelectChange(newValue==="true");break;case"fullscreen-wheel-scroll-lines":callbacks.onFullscreenWheelScrollLinesChange(newValue==="auto"?"auto":parseInt(newValue,10));break;case"theme":callbacks.onThemeChange(newValue);break}},callbacks.onCancel,{enableSearch:!0}),this.addChild(this.settingsList),this.addChild(new DynamicBorder)}getSettingsList(){return this.settingsList}};var SHOW_IMAGES_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ShowImagesSelectorComponent=class extends Container{constructor(currentValue,onSelect,onCancel){super();let items=[{value:"yes",label:"Yes",description:"Show images inline in terminal"},{value:"no",label:"No",description:"Show text placeholder instead"}];this.addChild(new DynamicBorder),this.selectList=new SelectList(items,5,getSelectListTheme(),SHOW_IMAGES_SELECT_LIST_LAYOUT),this.selectList.setSelectedIndex(currentValue?0:1),this.selectList.onSelect=item=>{onSelect(item.value==="yes")},this.selectList.onCancel=()=>{onCancel()},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};var SkillInvocationMessageComponent=class extends Box{constructor(skillBlock,markdownTheme=getMarkdownTheme()){super(1,1,t=>theme.bg("customMessageBg",t)),this.expanded=!1,this.skillBlock=skillBlock,this.markdownTheme=markdownTheme,this.updateDisplay()}getRenderRevision(){return this.childRenderRevision()}setExpanded(expanded){this.expanded=expanded,this.updateDisplay()}invalidate(){super.invalidate(),this.updateDisplay()}updateDisplay(){this.clear();let content=new Container;if(this.expanded){let label3=theme.fg("customMessageLabel","\x1B[1m[skill]\x1B[22m");content.addChild(new Text(label3,0,0));let body=this.skillBlock.skills.map(skill=>`**${skill.name}**
2529
2529
 
2530
2530
  ${skill.content}`).join(`
@@ -2548,7 +2548,7 @@ Rules:
2548
2548
  - Prefer concrete nouns and verbs from the user's task.
2549
2549
  - Do not include quotes, punctuation at the end, markdown, or explanations.
2550
2550
  - If the input is only a greeting, acknowledgement, or too vague to title, return <title>none</title>.
2551
- - Respond only as <title>Session Title</title>.`,LOW_SIGNAL_PROMPTS=new Set(["hi","hello","hey","yo","thanks","thank you","ok","okay","k","yes","no","yep","nope"]),TITLE_MAX_TOKENS=64,REASONING_TITLE_MAX_TOKENS=1024,MAX_TITLE_RETRIES=1,MAX_TITLE_RETRY_DELAY_MS=2e3;function sessionTitleRetryPolicy(settings){return{enabled:settings.enabled,maxRetries:Math.min(settings.maxRetries,MAX_TITLE_RETRIES),baseDelayMs:Math.min(settings.baseDelayMs,MAX_TITLE_RETRY_DELAY_MS)}}function shouldSkipSessionTitle(text2){let normalized2=text2.replace(/\s+/g," ").trim().toLowerCase();return normalized2.length===0||normalized2.startsWith("/")?!0:LOW_SIGNAL_PROMPTS.has(normalized2)}async function generateSessionTitle(options){if(shouldSkipSessionTitle(options.firstPrompt))return;let reasoning=initialTitleReasoning(options.model),response=await requestTitle(options,reasoning),retryReasoning=response.stopReason==="error"?mandatoryReasoningRetryLevel(options.model,reasoning,response.errorMessage):void 0;if(retryReasoning!==void 0&&(response=await requestTitle(options,retryReasoning)),response.stopReason==="error")throw new Error(humanizeProviderError(response.errorMessage??"Session title generation failed"));return parseSessionTitle(response)}function requestTitle(options,reasoning){return retryAssistantCall(()=>completeTitle(options.model,buildTitleContext(options.firstPrompt),buildTitleOptions(options,reasoning),options.streamFn),options.retry,options.signal)}function buildTitleContext(firstPrompt){return{systemPrompt:TITLE_SYSTEM_PROMPT,messages:[{role:"user",content:[{type:"text",text:firstPrompt}],timestamp:Date.now()}]}}function buildTitleOptions(options,reasoning){let titleOptions={...options.baseOptions,sessionId:options.sessionId,cacheRetention:options.model.cacheRetention==="none"?"none":"short",maxTokens:reasoning===void 0?TITLE_MAX_TOKENS:REASONING_TITLE_MAX_TOKENS};return reasoning!==void 0&&(titleOptions.reasoning=reasoning),options.auth.apiKey!==void 0&&(titleOptions.apiKey=options.auth.apiKey),options.auth.headers!==void 0&&(titleOptions.headers=options.auth.headers),options.auth.extraBody!==void 0&&(titleOptions.extraBody=options.auth.extraBody),options.auth.env!==void 0&&(titleOptions.env=options.auth.env),options.signal!==void 0&&(titleOptions.signal=options.signal),titleOptions}async function completeTitle(model,context,options,streamFn){return streamFn===void 0?completeSimple(model,context,options):(await streamFn(model,normalizeContext(context),options)).result()}function parseSessionTitle(message){let rawTitle=message.content.filter(part=>part.type==="text").map(part=>part.text).join("").trim().match(/<title>\s*([\s\S]*?)\s*<\/title>/i)?.[1];if(rawTitle===void 0)return;let title=sanitizeTitle(rawTitle);if(!(!title||title.toLowerCase()==="none"))return title}function humanizeProviderError(raw){let statusPrefix=raw.trim().match(/^(?:.*?\((\d{3})\)|(\d{3}))\s*:\s*(?=\{)/),status=statusPrefix?.[1]??statusPrefix?.[2],bodyText=statusPrefix?raw.trim().slice(statusPrefix[0].length):raw.trim();if(!bodyText.startsWith("{"))return raw;let parsed;try{parsed=JSON.parse(bodyText)}catch{return raw}let body=asRecord3(parsed);if(!body)return raw;let nested=asRecord3(body.error),message=asNonEmptyString(nested?.message)??asNonEmptyString(body.message)??asNonEmptyString(body.error);if(message===void 0)return raw;let details=[],errorType=asNonEmptyString(nested?.type)??asNonEmptyString(body.type);errorType&&errorType!=="error"&&details.push(errorType),status&&details.push(`HTTP ${status}`);let requestId=asNonEmptyString(body.request_id);return requestId&&details.push(`request ${requestId}`),details.length>0?`${message} (${details.join(", ")})`:message}function asRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function asNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function sanitizeTitle(text2){return text2.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g,"").replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\u001b[\u0020-\u002f]*[\u0030-\u007e]/g,"").replace(/[\r\n]+/g," ").replace(/[\u0000-\u001f\u007f-\u009f]+/g," ").replace(/\s+/g," ").replace(/^["'`]+|["'`.!?]+$/g,"").trim().slice(0,80).trim()}function yieldToEventLoop(){return new Promise(resolve46=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve46()},channel.port2.postMessage(void 0)})}var SessionWorkBarrier=class{constructor(){this.activeWork=void 0,this.activeWorkResolve=void 0,this.activeWorkDepth=0}get hasActiveWork(){return this.activeWork!==void 0}begin(){if(!this.activeWork){let resolveWork;if(this.activeWork=new Promise(resolve46=>{resolveWork=resolve46}),!resolveWork)throw new Error("Session work resolver was not initialized");this.activeWorkResolve=resolveWork}this.activeWorkDepth++;let finished=!1;return()=>{if(finished||(finished=!0,this.activeWorkDepth=Math.max(0,this.activeWorkDepth-1),this.activeWorkDepth>0))return;let resolveWork=this.activeWorkResolve;this.activeWork=void 0,this.activeWorkResolve=void 0,resolveWork?.()}}async waitForSettled(getEventQueue){for(let round=0;;round++){let eventQueue=getEventQueue(),work=this.activeWork;if(await eventQueue,work&&await work,getEventQueue()===eventQueue&&!this.activeWork)return;round>=16&&await yieldToEventLoop()}}};function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve46){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve46(requested)}}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._unregisterMemoryReport=()=>{},this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._providerRequiredNoticed=!1,this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._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._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted)throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id)}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state});if(route.state!==void 0&&route.state!==state){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID13(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage,provider:message.provider,model:message.model})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve46=>{this._resolveIdleWait=resolve46})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve46=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve46()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.releaseSettledSessionMemory(),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve46=>{this._retryResolve=resolve46}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage8),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage8}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage8}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed"),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._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 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(`
2551
+ - Respond only as <title>Session Title</title>.`,LOW_SIGNAL_PROMPTS=new Set(["hi","hello","hey","yo","thanks","thank you","ok","okay","k","yes","no","yep","nope"]),TITLE_MAX_TOKENS=64,REASONING_TITLE_MAX_TOKENS=1024,MAX_TITLE_RETRIES=1,MAX_TITLE_RETRY_DELAY_MS=2e3;function sessionTitleRetryPolicy(settings){return{enabled:settings.enabled,maxRetries:Math.min(settings.maxRetries,MAX_TITLE_RETRIES),baseDelayMs:Math.min(settings.baseDelayMs,MAX_TITLE_RETRY_DELAY_MS)}}function shouldSkipSessionTitle(text2){let normalized2=text2.replace(/\s+/g," ").trim().toLowerCase();return normalized2.length===0||normalized2.startsWith("/")?!0:LOW_SIGNAL_PROMPTS.has(normalized2)}async function generateSessionTitle(options){if(shouldSkipSessionTitle(options.firstPrompt))return;let reasoning=initialTitleReasoning(options.model),response=await requestTitle(options,reasoning),retryReasoning=response.stopReason==="error"?mandatoryReasoningRetryLevel(options.model,reasoning,response.errorMessage):void 0;if(retryReasoning!==void 0&&(response=await requestTitle(options,retryReasoning)),response.stopReason==="error")throw new Error(humanizeProviderError(response.errorMessage??"Session title generation failed"));return parseSessionTitle(response)}function requestTitle(options,reasoning){return retryAssistantCall(()=>completeTitle(options.model,buildTitleContext(options.firstPrompt),buildTitleOptions(options,reasoning),options.streamFn),options.retry,options.signal)}function buildTitleContext(firstPrompt){return{systemPrompt:TITLE_SYSTEM_PROMPT,messages:[{role:"user",content:[{type:"text",text:firstPrompt}],timestamp:Date.now()}]}}function buildTitleOptions(options,reasoning){let titleOptions={...options.baseOptions,sessionId:options.sessionId,cacheRetention:options.model.cacheRetention==="none"?"none":"short",maxTokens:reasoning===void 0?TITLE_MAX_TOKENS:REASONING_TITLE_MAX_TOKENS};return reasoning!==void 0&&(titleOptions.reasoning=reasoning),options.auth.apiKey!==void 0&&(titleOptions.apiKey=options.auth.apiKey),options.auth.headers!==void 0&&(titleOptions.headers=options.auth.headers),options.auth.extraBody!==void 0&&(titleOptions.extraBody=options.auth.extraBody),options.auth.env!==void 0&&(titleOptions.env=options.auth.env),options.signal!==void 0&&(titleOptions.signal=options.signal),titleOptions}async function completeTitle(model,context,options,streamFn){return streamFn===void 0?completeSimple(model,context,options):(await streamFn(model,normalizeContext(context),options)).result()}function parseSessionTitle(message){let rawTitle=message.content.filter(part=>part.type==="text").map(part=>part.text).join("").trim().match(/<title>\s*([\s\S]*?)\s*<\/title>/i)?.[1];if(rawTitle===void 0)return;let title=sanitizeTitle(rawTitle);if(!(!title||title.toLowerCase()==="none"))return title}function humanizeProviderError(raw){let statusPrefix=raw.trim().match(/^(?:.*?\((\d{3})\)|(\d{3}))\s*:\s*(?=\{)/),status=statusPrefix?.[1]??statusPrefix?.[2],bodyText=statusPrefix?raw.trim().slice(statusPrefix[0].length):raw.trim();if(!bodyText.startsWith("{"))return raw;let parsed;try{parsed=JSON.parse(bodyText)}catch{return raw}let body=asRecord3(parsed);if(!body)return raw;let nested=asRecord3(body.error),message=asNonEmptyString(nested?.message)??asNonEmptyString(body.message)??asNonEmptyString(body.error);if(message===void 0)return raw;let details=[],errorType=asNonEmptyString(nested?.type)??asNonEmptyString(body.type);errorType&&errorType!=="error"&&details.push(errorType),status&&details.push(`HTTP ${status}`);let requestId=asNonEmptyString(body.request_id);return requestId&&details.push(`request ${requestId}`),details.length>0?`${message} (${details.join(", ")})`:message}function asRecord3(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)?value2:void 0}function asNonEmptyString(value2){return typeof value2=="string"&&value2.length>0?value2:void 0}function sanitizeTitle(text2){return text2.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g,"").replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/\u001b[\u0020-\u002f]*[\u0030-\u007e]/g,"").replace(/[\r\n]+/g," ").replace(/[\u0000-\u001f\u007f-\u009f]+/g," ").replace(/\s+/g," ").replace(/^["'`]+|["'`.!?]+$/g,"").trim().slice(0,80).trim()}function yieldToEventLoop(){return new Promise(resolve46=>{let channel=new MessageChannel;channel.port1.onmessage=()=>{channel.port1.close(),channel.port2.close(),resolve46()},channel.port2.postMessage(void 0)})}var SessionWorkBarrier=class{constructor(){this.activeWork=void 0,this.activeWorkResolve=void 0,this.activeWorkDepth=0}get hasActiveWork(){return this.activeWork!==void 0}begin(){if(!this.activeWork){let resolveWork;if(this.activeWork=new Promise(resolve46=>{resolveWork=resolve46}),!resolveWork)throw new Error("Session work resolver was not initialized");this.activeWorkResolve=resolveWork}this.activeWorkDepth++;let finished=!1;return()=>{if(finished||(finished=!0,this.activeWorkDepth=Math.max(0,this.activeWorkDepth-1),this.activeWorkDepth>0))return;let resolveWork=this.activeWorkResolve;this.activeWork=void 0,this.activeWorkResolve=void 0,resolveWork?.()}}async waitForSettled(getEventQueue){for(let round=0;;round++){let eventQueue=getEventQueue(),work=this.activeWork;if(await eventQueue,work&&await work,getEventQueue()===eventQueue&&!this.activeWork)return;round>=16&&await yieldToEventLoop()}}};function streamedToolCallName(event){let update=event.assistantMessageEvent;if(update.type==="toolcall_end")return update.toolCall.name;if(update.type!=="toolcall_start")return;let block=update.partial.content[update.contentIndex];return block?.type==="toolCall"&&block.name.length>0?block.name:void 0}function withResolvedToolName(event,resolve46){let requested=streamedToolCallName(event);return requested===void 0?event:{...event,resolvedToolName:resolve46(requested)}}var TranscriptWriteFailures=class{constructor(){this.reported=!1,this.refused=new Set}startRun(){this.runFailure=void 0,this.reported=!1}record(message,error2){this.refused.add(message),this.runFailure??={error:error2}}takeReport(){if(!(this.reported||!this.runFailure))return this.reported=!0,this.runFailure}takeRefusedOut(messages){if(this.refused.size===0)return;let refused=this.refused,kept=messages.filter(message=>!refused.has(message));return refused.clear(),kept.length===messages.length?void 0:kept}};var EVAL_ONLY_TOOL_NAMES=new Set(["workflow","monitor"]);function evalHelperCall(name){return name==="bash"||name==="powershell"?`tool.${name}({ command: "..." })`:name==="grep"?'tool.grep({ pattern: "...", path: "..." })':name==="workflow"?`tool.${name}({ action: "..." })`:name==="monitor"?'tool.monitor({ description: "...", command: "...", filter: "..." })':`tool.${name}({ ... })`}var TURN_RETRY_SUPPRESSION_PREFIX3="senpi:no-turn-retry:",OVERFLOW_RECOVERY_RUNGS=2,OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE="Context overflow recovery failed after two compact-and-retry attempts. Try reducing context or switching to a larger-context model.",DEFERRED_RETRY_QUEUE_OWNERS=new WeakSet;function withoutDeletedHeaders(headers){return headers?Object.fromEntries(Object.entries(headers).filter(entry=>entry[1]!==null)):void 0}function isCompactionOwnedPreCompactDiagnostic(message,requestId){if(message.role!=="custom"||message.customType!=="senpi.hook")return!1;let details=message.details;if(!details||typeof details!="object")return!1;let diagnostic2=details;return diagnostic2.event==="PreCompact"&&diagnostic2.compactionRequestId===requestId}function describeCompactionRejection(cause){switch(cause){case"would-overflow":return"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.";case"cancelled-by-extension":return"Compaction rejected: cancelled by an extension.";case"external-owner":return"Compaction rejected: the active provider owns compaction for this session.";case"circuit-breaker":return"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.";case"per-turn-cap":return"Compaction rejected: absolute compaction cap reached for this session.";case"stale-revision":return"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context."}}var CompactionRejectedError=class extends Error{constructor(rejectionCause){super(rejectionCause==="cancelled-by-extension"?"Compaction cancelled":describeCompactionRejection(rejectionCause)),this.name="CompactionRejectedError",this.rejectionCause=rejectionCause}},CompactionCancelledError=class extends Error{constructor(){super("Compaction cancelled"),this.name="CompactionCancelledError"}},CompactionExecutionError=class extends Error{constructor(error2,ownsTerminalTransition,aborted){super(error2 instanceof Error?error2.message:String(error2)),this.name="CompactionExecutionError",this.ownsTerminalTransition=ownsTerminalTransition,this.aborted=aborted}};function compactionExecutionOwnsTerminalTransition(error2){return!(error2 instanceof CompactionExecutionError)||error2.ownsTerminalTransition}function isCompactionExecutionAborted(error2){return error2 instanceof CompactionExecutionError&&error2.aborted||error2 instanceof CompactionCancelledError||error2 instanceof Error&&error2.name==="AbortError"}var ModelNotReadyError=class extends Error{constructor(message){super(message),this.name="ModelNotReadyError"}},RequiredCompactionError=class extends Error{constructor(){super("Context remains above the compaction threshold because compaction did not complete"),this.name="RequiredCompactionError"}},MissingModelAccessError=class extends Error{constructor(){super("AgentSession requires modelRuntime or modelRegistry"),this.name="MissingModelAccessError"}};function estimateMessagesTokens2(messages){let tokens=0;for(let message of messages)tokens+=estimateTokens2(message);return tokens}function isSameOverflowSource(message,model,upstreamModelId){return message.provider!==model.provider?!1:message.model===model.id?!0:message.model===upstreamModelId}var THINKING_LEVELS_WITH_MAX=["off","minimal","low","medium","high","xhigh","max"];function providerRetryWatchdogAbortMessage(retryTimeoutMs,streamStartTimeoutMs){return`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms`+(streamStartTimeoutMs===void 0?" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)":` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)}var AgentSession=class{_resolveRetryProfile(){let providerId=this.model?.provider,declared=providerId!==void 0?this._modelRuntime.getProvider(providerId)?.retryPolicy:void 0;return this.settingsManager.resolveRetryProfile(providerId!==void 0?{id:providerId,retryPolicy:declared}:void 0)}constructor(config){this._unregisterMemoryReport=()=>{},this._eventListeners=[],this._agentEventQueue=Promise.resolve(),this._messageEndsAwaitingPersistence=new Set,this._messageEndPersistence=new WeakMap,this._isAgentRunActive=!1,this._toolExecutionDepth=0,this._toolContextDisposers=new Set,this._promptStartPending=!1,this._nextInputId=0,this._settlementEpoch=0,this._runtimeMessagesTokenized=!1,this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._nextQueuedInputOrder=0,this._supersededCompactionLogAttemptIds=new Set,this._pendingNextTurnMessages=[],this._pendingCustomMessages=[],this.externalAdmission=new ExternalAdmission({isBusy:()=>this._isAgentRunActive||this._promptStartPending,enqueue:(message,lane)=>lane==="steer"?this.agent.steer(message):this.agent.followUp(message),start:message=>this.sendCustomMessage(message,{triggerTurn:!0}).catch(error2=>{this._sessionLogger.warn("external_delivery_start_failed",{error:error2 instanceof Error?error2.message:String(error2)})})}),this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._compactionAbortController=void 0,this._autoCompactionAbortController=void 0,this._pendingCompactionAdmission=void 0,this._compactionLifecycle=new CompactionLifecycleCoordinator,this._sessionWorkBarrier=new SessionWorkBarrier,this._wakeSources=new WakeSourceTracker,this._overflowRecoveryRungs=0,this._compactionSkippedTooSmall=!1,this._transcriptWriteFailures=new TranscriptWriteFailures,this._promptOwnsRun=!1,this._skipNextPostRetryCompactionCheck=!1,this._skipNextPostCompactionAssistantCheck=!1,this._scheduledContinuationRecompacted=!1,this._assistantsPendingAtCompaction=new WeakSet,this._postCompactionUsageExemptAssistants=new WeakSet,this._messageRevision=0,this._branchSummaryAbortController=void 0,this._sessionTitleAbortController=void 0,this._sessionTitlePromise=void 0,this._retryAbortController=void 0,this._retryAttempt=0,this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0,this._retryPromise=void 0,this._retryResolve=void 0,this._userAbortPromise=void 0,this._abortProvenance=new AgentAbortProvenance,this._agentSettledDelivery=new AgentSettledDelivery,this._suppressQueuedContinuationAfterUserAbort=!1,this._userAbortGeneration=0,this._hadClearedQueuedMessages=!1,this._extensionEventSignal=void 0,this._bashAbortControllers=new Set,this._pendingBashMessages=[],this._turnIndex=0,this._entryIdsByMessage=new WeakMap,this._boundaryDispatchedMessages=new WeakSet,this._boundaryRefreshedTurns=new WeakSet,this._lastActivityOutcome="completed",this._isBeforeSettle=!1,this._abortDuringBeforeSettle=!1,this._baseToolDefinitions=new Map,this._usesDefaultTools=!1,this._withheldEvalOnlyToolNames=new Set,this._publishedEvalOnlyHintNames=new Set,this._declaredToolNames=[],this._promptToolNames=[],this._promptDeclaresSessionTools=!1,this._sessionStartSettled=Promise.resolve(),this._promptCachePrefixBuilds=new PromptCachePrefixBuilds,this._extensionMode="print",this._providerRequiredNoticed=!1,this._probeBackLaneSeq=0,this._toolRegistry=new Map,this._lazyToolActivation=new LazyToolActivation({getToolDefinition:name=>this.getToolDefinition(name),getActiveTools:()=>this.getActiveToolNames(),setActiveTools:names=>this.setActiveToolsByName(names)}),this._toolDefinitions=new Map,this._toolPromptSnippets=new Map,this._toolPromptGuidelines=new Map,this._baseSystemPrompt="",this._currentServiceTier=void 0,this._sessionFastMode=!1,this._shownHighReasoningWarningKeys=new Set,this._shownThinkingClampWarningKeys=new Set,this._lastAssistantMessage=void 0,this._handleAgentEvent=(event,signal)=>{if(this._nestedToolCalls)if(event.type==="message_start"&&event.message.role==="toolResult"){let message=event.message,summary=this._nestedToolCalls.takeRecord(message.toolCallId);summary?.calls&&(message.nestedCalls=summary.calls),summary?.usage&&(message.usage=message.usage?combineUsage(message.usage,summary.usage):summary.usage)}else event.type==="agent_end"&&this._nestedToolCalls.clear();if(event.type==="agent_end"){let lastAssistant=this._findLastAssistantInMessages(event.messages);(lastAssistant&&this._getRequiredAutoCompactionReason(lastAssistant)||this._willRetryAfterAgentEnd(event.messages))&&this.agent.suppressQueuedMessageDrain(),this._extensionRunner.hasHandlers("agent_before_settle")&&this.agent.suppressQueuedMessageDrain()}this._createRetryPromiseForAgentEnd(event),event.type==="message_end"&&event.message.role==="assistant"&&this._emitServerFallbackAborted(event.message);let pendingMessage=event.type==="message_end"?event.message:void 0;pendingMessage!==void 0&&this._messageEndsAwaitingPersistence.add(pendingMessage);let processing=this._agentEventQueue.then(()=>this._processAgentEvent(event,signal),()=>this._processAgentEvent(event,signal));this._agentEventQueue=pendingMessage!==void 0?processing.finally(()=>{this._messageEndsAwaitingPersistence.delete(pendingMessage)}):processing;let settled=this._agentEventQueue.catch(()=>{});pendingMessage!==void 0&&this._messageEndPersistence.set(pendingMessage,settled)},this._promptSurface=config.promptSurface,this._browserEngine=config.browserEngine,this.agent=config.agent,this.sessionManager=config.sessionManager,this.settingsManager=config.settingsManager,this._unsubscribeSettingsSource=this.settingsManager.subscribeToSourceSelection(source2=>{this._emit({type:"settings_source_selected",...source2})}),(config.resourceLoader.getExtensions().runtime.flagValues.get("no-model-fallback")===!0||envValue("NO_FALLBACK")==="1")&&this.settingsManager.applyOverrides({retry:{modelFallback:!1}}),config.resourceLoader.getExtensions().runtime.flagValues.get("no-ask-user")===!0&&this.settingsManager.applyOverrides({askUser:{enabled:!1}}),this._scopedModels=config.scopedModels??[],this._favoriteModels=config.favoriteModels??[],this._resourceLoader=config.resourceLoader,this._customTools=config.customTools??[],this._cwd=config.cwd;let modelRuntime=config.modelRuntime??config.modelRegistry?.modelRuntime;if(!modelRuntime)throw new MissingModelAccessError;this._modelRuntime=modelRuntime,this._modelRegistry=config.modelRegistry??new ModelRegistry(modelRuntime),this._agentDir=config.agentDir??getAgentDir();let fallbackLogger=createFallbackLogger(this._agentDir);this._sessionLogger=createSessionLogger(this._agentDir,{context:()=>({sessionId:this.sessionManager.getSessionId(),provider:this.model?.provider,model:this.model?.id})}),this._fallbackValidationWarnings=validateFallbackChains(this.settingsManager.getRawFallbackChains(),this._modelRegistry);let fallbackChainsSource=this.settingsManager.getFallbackChainsScope()??"default";for(let warning of this._fallbackValidationWarnings)fallbackLogger.warn("validation_warning",{warning,source:fallbackChainsSource});this._startupThinkingClamp=getThinkingClampNotice(this.agent.state.thinkingSelection,this.agent.state.model),this._startupThinkingClamp&&this._shownThinkingClampWarningKeys.add(this._thinkingClampWarningKey(this._startupThinkingClamp)),this._fallbackNow=config.fallbackNow??monotonicNow,this._selectorCooldowns=new SelectorCooldowns(this._fallbackNow);let lease=()=>this._fallbackCircuitsLease;this._fallbackCircuits=createFallbackCircuitAccess({get breaker(){return lease().breaker},owner:()=>this.sessionId,now:this._fallbackNow,settings:()=>this.settingsManager.getFallbackCircuitSettings(),logger:fallbackLogger}),this._retryRandom=config.retryRandom??Math.random,this._environmentContextEnabled=config.environmentContext??!0,this._retryFallback=new RetryFallbackController({getSettings:()=>this.settingsManager.getRetryFallbackSettings(),registry:this._modelRegistry,cooldowns:this._selectorCooldowns,circuits:this._fallbackCircuits,logger:fallbackLogger,switchModel:async(model,thinking,reason)=>{await this._switchActiveModel(model,{persistDefault:!1,appendSessionEntry:!0,entryReason:reason,emitModelSelect:!0,modelSelectSource:reason,invalidateCompaction:!0,ephemeralThinkingLevel:thinking,allowDeferral:!1,repairWithSlice:!0})},emit:event=>this._emit(event),getCurrentSelector:()=>this.model?{model:this.model,thinkingLevel:this.thinkingLevel}:void 0,isAuthAvailable:provider=>this._modelRuntime.hasConfiguredAuth(provider)}),this._probeBackScheduler=new ProbeBackScheduler({now:this._fallbackNow}),this._extensionRunnerRef=config.extensionRunnerRef,this._initialActiveToolNames=config.initialActiveToolNames,this._defaultToolNames=config.defaultToolNames?new Set(config.defaultToolNames):void 0,this._usesDefaultTools=config.usesDefaultTools??!1,this._evalOnlyToolNamesOverride=config.evalOnlyToolNames?new Set(config.evalOnlyToolNames):void 0,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._allowedToolNames=config.allowedToolNames?new Set(config.allowedToolNames):void 0,this._excludedToolNames=config.excludedToolNames?new Set(config.excludedToolNames):void 0,this._baseToolsOverride=config.baseToolsOverride,this._sessionStartEvent=config.sessionStartEvent??{type:"session_start",reason:"startup"},this._autoTitleSessions=config.autoTitleSessions??!1;let initialModel=this.agent.state.model;if(initialModel){let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,initialModel));this._currentServiceTier=this._resolveServiceTier(initialModel,config.serviceTier??scopedMatch?.serviceTier)}this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent),this._installAgentToolHooks(),this._installAgentNextTurnRefresh(),this._installAgentRequestProjection(),this._installAgentBoundaryHooks();try{this._buildRuntime({activeToolNames:this._initialActiveToolNames,includeAllExtensionTools:!0}),this._fallbackCircuitsLease=acquireFallbackCircuits(this._agentDir)}catch(error2){throw this._releaseToolSearchService("session construction failed"),error2}this._unregisterMemoryReport=registerMemoryReportSession(this,{sessionId:()=>this.sessionId,sessionFile:()=>this.sessionManager.getSessionFile(),residentStore:()=>this.sessionManager.getResidentStore().size(),reporters:()=>this._extensionRunner.getMemoryReporters()})}get modelRuntime(){return this._modelRuntime}get modelRegistry(){return this._modelRegistry}async _getRequiredRequestAuth(model,signal){let result3;try{result3=await this._modelRuntime.getAuth(model,{signal})}catch(error2){let cause=error2 instanceof Error?error2.cause:void 0;throw cause instanceof Error&&cause.message==="authHeader requires a resolved API key"?new Error(formatNoApiKeyFoundMessage(model.provider)):error2}if(result3&&(result3.auth.apiKey||result3.auth.headers))return{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,env:result3.env};throw this._modelRuntime.isUsingOAuth(model.provider)?new Error(`Authentication failed for "${model.provider}". Credentials may have expired or network is unavailable. Run '/login ${model.provider}' to re-authenticate.`):new Error(formatNoApiKeyFoundMessage(model.provider))}async _getSummarizationRequestAuth(selectedModel,signal){let{model,thinkingLevel}=isVirtualModel(selectedModel)?await this._modelRuntime.resolveModel(selectedModel,convertToLlm(this.messages),{reason:"direct",thinkingLevel:this.thinkingLevel,signal}):{model:selectedModel,thinkingLevel:this.thinkingLevel};if(this.agent.streamFunction===streamSimple)return{...await this._getRequiredRequestAuth(model,signal),thinkingLevel};try{let storedResult=await this._modelRuntime.getAuth(model,{signal}),activeApiKey=await this.agent.getApiKey?.(model.provider),result3=activeApiKey!==void 0&&storedResult?.source!=="OAuth"?await this._modelRuntime.getAuth(model,{apiKey:activeApiKey,signal}):storedResult;return result3?{model:result3.auth.baseUrl?{...model,baseUrl:result3.auth.baseUrl}:model,apiKey:result3.auth.apiKey,headers:withoutDeletedHeaders(result3.auth.headers),env:result3.env,thinkingLevel}:{model,thinkingLevel}}catch(error2){if(signal?.aborted)throw error2;return{model,thinkingLevel}}}_resolveCompactionModel(sessionModel){let override=this._getCompactionSettings().model;if(!override)return sessionModel;let slash=override.indexOf("/");if(slash<=0||slash===override.length-1)return sessionModel;let provider=override.slice(0,slash),modelId=override.slice(slash+1);return this._modelRuntime.getModel(provider,modelId)??sessionModel}async _getCompactionRequestAuth(model){return{...await this._getSummarizationRequestAuth(model),extraBody:this._modelRuntime.getCompatibilityRequestConfig(model).extraBody}}_modelForMessage(message){let model=this.model;return model&&isVirtualModel(model)?this._modelRuntime.getPhysicalModel(message.provider,message.model):model?.provider===message.provider&&model.id===message.model?model:void 0}_recordSelection(){let model=this.model;if(!model)return;let getModel=(provider,modelId)=>this._modelRuntime.getModel(provider,modelId),recorded=getBranchSelection(this.sessionManager.getBranch(),getModel);if(!recorded||recorded.provider===model.provider&&recorded.modelId===model.id)return;let recordedModel=getModel(recorded.provider,recorded.modelId);!isVirtualModel(model)&&!(recordedModel&&isVirtualModel(recordedModel))||this.sessionManager.appendModelChange(model.provider,model.id)}_limitsModel(){return this.routedModel?.model??this.model}_emitServerFallbackAborted(message){let details=message.diagnostics?.find(entry=>entry.type===SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;details!==void 0&&this._emit({type:"server_fallback_aborted",from:typeof details.from=="string"?details.from:message.model,to:typeof details.to=="string"?details.to:message.model,chainConfigured:this._retryFallback.hasConfiguredChain()})}_adoptToolSearchService(extensionLoad){let next=adoptToolSearchServiceForSession(extensionLoad);this._toolSearchService!==next&&this._toolSearchService?.dispose(this.sessionId,"replaced by a reload"),this._toolSearchService=next}_releaseToolSearchService(reason){this._toolSearchService?.dispose(this.sessionId,reason),this._toolSearchService=void 0}_bindToolSearchRemovedHints(){this._toolSearchService?.bindRemovedToolHints(()=>this.agent.removedToolHints)}_installAgentToolHooks(){this.agent.resolveUnknownToolCall=toolName=>{let resolvedName=resolveToolNameAlias(toolName,this._callableToolNames());if(!(resolvedName===void 0||!this._activateLazyTool(resolvedName)))return this.agent.state.tools.find(tool=>tool.name===resolvedName)},this._bindToolSearchRemovedHints(),this.agent.beforeToolCall=async({toolCall,args})=>{this._toolExecutionDepth++;try{let result3=await this.preflightToolCall(toolCall,args);return result3?.block&&this._toolExecutionDepth--,result3}catch(err2){throw this._toolExecutionDepth--,err2}},this.agent.afterToolCall=async({toolCall,args,result:result3,isError})=>{try{return await this._emitAfterToolCallHooks(toolCall,args,result3,isError)}finally{this._toolExecutionDepth--}}}async preflightToolCall(toolCall,args,options={}){options.waitForEventQueue!==!1&&await this._agentEventQueue;let runner=this._extensionRunner;if(runner.hasHandlers("tool_call"))try{return await runner.emitToolCall({type:"tool_call",toolName:toolCall.name,toolCallId:toolCall.id,...options.parentToolCallId?{parentToolCallId:options.parentToolCallId}:{},input:args})}catch(err2){throw err2 instanceof Error?err2:new Error(`Extension failed, blocking execution: ${String(err2)}`)}}async _emitAfterToolCallHooks(toolCall,args,result3,isError,parentToolCallId){let runner=this._extensionRunner,hookResult=runner.hasHandlers("tool_result")?await runner.emitToolResult({type:"tool_result",toolName:toolCall.name,toolCallId:toolCall.id,...parentToolCallId?{parentToolCallId}:{},input:args,content:result3.content,details:result3.details,...result3.structuredContent===void 0?{}:{structuredContent:result3.structuredContent},isError,usage:result3.usage}):void 0,content=hookResult?.content??result3.content??[],resizeOptions=this._limitsModel()?.inputLimits?.images?.resize,normalizedContent=await normalizeToolResultImages(content,{autoResizeImages:this.settingsManager.getImageAutoResize(),...resizeOptions?{resizeOptions}:{}});if(!(!hookResult&&normalizedContent===content))return{content:normalizedContent,details:hookResult?.details,structuredContent:hookResult?hookResult.structuredContent:result3.structuredContent,isError:hookResult?.isError??isError,usage:hookResult?.usage}}_getCallableTools(active=new Set(this.getActiveToolNames())){return[...this._toolRegistry.values()].filter(tool=>{let exposure=this._getToolExposure(tool.name);return exposure==="search"||exposure==="eval"||exposure==="direct"&&active.has(tool.name)})}async _executeNestedToolCall(parentToolCallId,name,args,options){return this._nestedToolCalls??=new NestedToolCallRunner({getTools:()=>this._getCallableTools(),isSequential:()=>this.agent.toolExecution==="sequential",runToolCall:(toolCall,parentId,signal,onUpdate)=>{let assistantMessage=this._findLastAssistantMessage();return assistantMessage?runToolCall(toolCall,{tools:this._getCallableTools(),assistantMessage,context:{messages:this.agent.state.messages,tools:this.agent.state.tools},beforeToolCall:({toolCall:call,args:callArgs})=>this.preflightToolCall(call,callArgs,{waitForEventQueue:!1,parentToolCallId:parentId}),afterToolCall:({toolCall:call,args:callArgs,result:result3,isError})=>this._emitAfterToolCallHooks(call,callArgs,result3,isError,parentId),signal,onUpdate}):Promise.resolve({toolCall,result:{content:[{type:"text",text:"No assistant message issued this call"}],details:{}},isError:!0})},emit:async event=>{await this._extensionRunner.emit(event),this._emit(event)}}),this._nestedToolCalls.execute(parentToolCallId,name,args,options)}_installAgentRequestProjection(){let previousPrepareRequest=this.agent.prepareRequest;this.agent.prepareRequest=async(request2,signal)=>{let failed=this._failedResponse;this._failedResponse=void 0;let previous=await previousPrepareRequest?.(request2,signal)??void 0,model=previous?.model??this.agent.state.model,thinkingLevel=previous?.thinkingLevel??this.agent.state.thinkingLevel;if(!isVirtualModel(model))return request2.model===model?previous:{...previous,model,thinkingLevel};let context=previous?.context??request2.context,lastResponse=context.messages.findLastIndex(message=>message.role==="assistant"),userTurn=context.messages.slice(lastResponse+1).some(message=>message.role==="user"),state=getVirtualModelState(this.sessionManager.getBranch(),model.provider,model.id),route=await this._modelRuntime.resolveModel(model,convertToLlm(context.messages),{reason:failed?"retry":userTurn?"user":"continuation",thinkingLevel,signal,failed,state});if(route.state!==void 0&&route.state!==state){let data={provider:model.provider,modelId:model.id,state:route.state};this._emitEntryAppended(this.sessionManager.appendCustomEntry(VIRTUAL_MODEL_STATE_ENTRY,data))}return{...previous,context,model:route.model,thinkingLevel:route.thinkingLevel}}}async _dispatchTurnEndBoundary(message,toolResults){this._lastActivityOutcome=message.stopReason==="aborted"?"aborted":message.stopReason==="error"?"error":"completed";let messageEntryId=this._findPersistedMessageEntryId(message);if(!this._extensionRunner.hasHandlers("turn_end"))return!1;if(!messageEntryId)return this._extensionRunner.emitError({extensionPath:"<boundary>",event:"turn_end",error:"turn_end could not resolve the persisted assistant entry ID"}),!1;let toolResultEntryIds=toolResults.flatMap(result3=>{let entryId=this._findPersistedMessageEntryId(result3);return entryId?[entryId]:[]}),boundary=await this._extensionRunner.emitBoundary({type:"turn_end",turnIndex:this._turnIndex,message,toolResults,messageEntryId,toolResultEntryIds,outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"turn_end"));return this._commitBoundaryDrafts(boundary.entries),boundary.entries.length>0&&this._boundaryRefreshedTurns.add(message),boundary.continue&&!this._buildBoundaryContext([],"turn_end").canContinue?(this._reportInvalidBoundaryContinuation("turn_end"),!1):boundary.continue}_installAgentBoundaryHooks(){let previousFinishTurn=this.agent.finishTurn;this.agent.finishTurn=async(turn,signal)=>{this._boundaryDispatchedMessages.add(turn.message),await Promise.all([turn.message,...turn.toolResults].map(message=>this._messageEndPersistence.get(message)));let extensionContinue=await this._dispatchTurnEndBoundary(turn.message,turn.toolResults),previousDecision=await previousFinishTurn?.(turn,signal);if(previousDecision?.action==="end")return previousDecision;if(extensionContinue||previousDecision?.action==="continue")return{action:"continue"}}}_applyObservedCursorContextWindow(model){let observed=getCursorContextLimit2(model.id);if(observed===void 0||observed<=0||observed===model.contextWindow)return;let previous=model.contextWindow;model.contextWindow=observed,this._sessionLogger.info("cursor_context_window_observed",{modelId:model.id,previous,observed})}_installAgentNextTurnRefresh(){let previousPrepareNextTurnWithContext=this.agent.prepareNextTurnWithContext??(this.agent.prepareNextTurn?async(_turn,signal)=>await this.agent.prepareNextTurn?.(signal):void 0),previousTransformContext=this.agent.transformContext;this.agent.transformContext=async(messages,signal)=>{this.sessionManager.getResidentStore().materializeInPlace(messages);let transformed=previousTransformContext?await previousTransformContext(messages,signal):messages,model=this.model;if(model?.provider!=="cursor"&&model?.provider!=="cursor-cli-oauth")return transformed;this._applyObservedCursorContextWindow(model);let budgetBytes=cursorAdmissionBudgetBytes(model.contextWindow),admission=admitCursorHistory({messages:transformed,budgetBytes,convert:candidate=>this.agent.convertToLlm(candidate)});return admission.blankedToolResults>0&&this._sessionLogger.info("cursor_admission_truncated",{blankedToolResults:admission.blankedToolResults,bytesBefore:admission.bytesBefore,bytesAfter:admission.bytesAfter,budgetBytes}),admission.overBudget&&this._sessionLogger.warn("cursor_admission_over_budget",{bytes:admission.bytesAfter,budgetBytes}),admission.messages??transformed},this.agent.prepareNextTurnWithContext=async(turn,signal)=>{this._runtimeMessages();let compactBeforeNextAdmission=async()=>{let provider=this.model?.provider;if(provider==="cursor"||provider==="cursor-cli-oauth"||turn.toolResults.length===0&&!this.agent.hasQueuedMessages()||(await this._agentEventQueue,turn.toolResults.length===0&&!this.agent.hasQueuedMessages()))return!1;try{return await this._enforceCompactionBeforeProvider(turn.message,!0,"threshold")}catch(error2){throw error2 instanceof RequiredCompactionError&&(this._requiredCompactionTurnError=error2,this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=error2)),error2}},compactedBeforeCallback=await compactBeforeNextAdmission(),boundaryRefreshed=this._boundaryRefreshedTurns.delete(turn.message),messages=compactedBeforeCallback||boundaryRefreshed?this.agent.state.messages.slice():turn.context.messages,postCompactionTurn={...turn,context:{...turn.context,messages}},previousSnapshot=await previousPrepareNextTurnWithContext?.(postCompactionTurn,signal),previousContext=previousSnapshot?.context??postCompactionTurn.context,compactedAfterCallback=!1;if(compactedBeforeCallback||(compactedAfterCallback=await compactBeforeNextAdmission()),compactedAfterCallback){let postLateCompactionTurn={...turn,context:{...turn.context,messages:this.agent.state.messages.slice()}},postLateCompactionSnapshot=await previousPrepareNextTurnWithContext?.(postLateCompactionTurn,signal);previousSnapshot={...previousSnapshot,...postLateCompactionSnapshot,context:postLateCompactionSnapshot?.context??postLateCompactionTurn.context},previousContext=previousSnapshot.context??postLateCompactionTurn.context}return this._refreshToolDeclarationsForModel(),{...previousSnapshot,context:{...previousContext,messages:previousContext.messages,systemPrompt:this._systemPromptOverride??this._baseSystemPrompt,tools:this.agent.state.tools.slice(),declaredTools:this.agent.state.declaredTools?.slice()},model:this.agent.state.model,thinkingLevel:this.agent.state.thinkingLevel,thinkingSelection:this.agent.state.thinkingSelection??null,abortServerSideFallback:this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain()}}}_refreshFinalizedContext(){let projection=this.sessionManager.buildSessionProjection();for(let entry of projection.entries)for(let message of entry.messages)this._entryIdsByMessage.set(message,entry.sourceEntry.id);this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()}_applyBoundaryDrafts(manager,drafts){let appended=[];for(let draft of drafts){let entryId;switch(draft.type){case"custom":entryId=manager.appendCustomEntry(draft.customType,draft.data);break;case"custom_message":entryId=manager.appendCustomMessageEntry(draft.customType,draft.content,draft.display,draft.details);break;case"context_edit":entryId=manager.appendContextEdit(draft.targetId,draft.replacement);break;case"compaction":{let tokensBefore=estimateProjectedContextTokens(manager.buildSessionProjection(),manager.getBranch()).tokens;entryId=manager.appendCompaction(draft.summary,draft.firstKeptEntryId,tokensBefore,draft.details,!0,draft.usage);break}}let entry=manager.getEntry(entryId);entry&&appended.push(entry)}return appended}_createBoundaryPreviewManager(drafts){let header2=this.sessionManager.getHeader();if(!header2)throw new Error("Session header is missing");let manager=SessionManager.inMemory(this._cwd,void 0,[header2,...this.sessionManager.getBranch()]);return this._applyBoundaryDrafts(manager,drafts),manager}_getPendingBoundaryMessages(){return[...this.agent.peekQueuedMessages(),...this._pendingCustomMessages]}_buildBoundaryContext(drafts,boundary){let projection=drafts.length===0?this.sessionManager.buildSessionProjection():this._createBoundaryPreviewManager(drafts).buildSessionProjection(),pendingMessages=this._getPendingBoundaryMessages(),llmMessages=convertToLlm(projection.messages),finalRole=llmMessages[llmMessages.length-1]?.role,contextCanContinue=llmMessages.some(message=>message.role!=="system")&&finalRole!=="assistant",pendingCustomContext=this._pendingCustomMessages.length>0;return{contextEntries:projection.entries,contextMessages:projection.messages,llmMessages,pendingMessages,canContinue:contextCanContinue||pendingCustomContext||(boundary==="turn_end"?this.agent.hasQueuedMessages():finalRole==="assistant"&&this.agent.hasQueuedMessages())}}_commitBoundaryDrafts(drafts){if(drafts.length===0)return;let appended=this._applyBoundaryDrafts(this.sessionManager,drafts);this._refreshFinalizedContext();for(let entry of appended)this._emitEntryAppended(entry.id)}async _runBeforeSettleBoundary(heldQueue=!1){if(!this._extensionRunner.hasHandlers("agent_before_settle"))return!heldQueue&&this.agent.hasQueuedMessages();this._isBeforeSettle=!0,this._abortDuringBeforeSettle=!1;try{let result3=await this._extensionRunner.emitBoundary({type:"agent_before_settle",outcome:this._lastActivityOutcome},entries=>this._buildBoundaryContext(entries,"agent_before_settle"));this._commitBoundaryDrafts(result3.entries),this._flushPendingCustomMessages();let finalContext=this._buildBoundaryContext([],"agent_before_settle");if(this._abortDuringBeforeSettle)return!1;let shouldContinue=result3.continue||!heldQueue&&this.agent.hasQueuedMessages();return shouldContinue&&!finalContext.canContinue?(result3.continue&&this._reportInvalidBoundaryContinuation("agent_before_settle"),!1):shouldContinue}finally{this._isBeforeSettle=!1}}_reportInvalidBoundaryContinuation(event){this._extensionRunner.emitError({extensionPath:"<boundary>",event,error:`${event} requested continuation without runnable model context`})}_emitEntryAppended(entryId){if(this._extensionMode!=="rpc")return;let entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})}appendSessionEntry(entry){this.sessionManager.appendEntry(entry),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._emitEntryAppended(entry.id)}_emit(event){this._logSessionEvent(event);for(let l of[...this._eventListeners])l(event)}async _emitSessionCompactFailed(event){this._extensionRunner.hasHandlers("session_compact_failed")&&await this._extensionRunner.emit({type:"session_compact_failed",...event})}_logSessionEvent(event){if(event.type==="compaction_start"){let previousAttempt=this._activeCompactionLogAttempt;if(previousAttempt){let tokensAfter=this._estimateCompactionLogTokens("persisted");this._sessionLogger.info("compaction_decision",{attemptId:previousAttempt.id,reason:previousAttempt.reason,mode:previousAttempt.reason==="manual"?"manual":"auto",action:"compact",disposition:"superseded",accepted:!1,skipped:!0,aborted:!0,willRetry:!1,tokensBefore:previousAttempt.tokensBefore,tokensAfter}),this._supersededCompactionLogAttemptIds.add(previousAttempt.id)}let attempt2={id:event.requestId??randomUUID13(),reason:event.reason,tokensBefore:this._estimateCompactionLogTokens("persisted")};this._activeCompactionLogAttempt=attempt2,this._sessionLogger.info("compaction_start",{attemptId:attempt2.id,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:"compact",tokensBefore:attempt2.tokensBefore});return}if(event.type==="compaction_end"){if(event.requestId&&this._supersededCompactionLogAttemptIds.delete(event.requestId))return;let activeAttempt=this._activeCompactionLogAttempt,attempt2=event.requestId!==void 0&&activeAttempt?.id===event.requestId?activeAttempt:void 0,accepted=event.accepted??event.result!==void 0,rejected=event.rejectionCause!==void 0,skipped2=!accepted&&(attempt2===void 0||!rejected&&!event.aborted&&!event.errorMessage),disposition=accepted?"committed":attempt2===void 0?"skipped":rejected?"rejected":event.aborted?"aborted":event.errorMessage?"failed":"skipped",tokensAfter=this._estimateCompactionLogTokens(accepted?"active":"persisted");this._sessionLogger.info("compaction_decision",{attemptId:attempt2?.id??event.requestId,reason:event.reason,mode:event.reason==="manual"?"manual":"auto",action:accepted||attempt2?"compact":"none",disposition,accepted,skipped:skipped2,aborted:event.aborted,willRetry:event.willRetry,rejectionCause:event.rejectionCause,error:event.errorMessage,tokensBefore:attempt2?.tokensBefore??tokensAfter,tokensAfter}),attempt2&&(this._activeCompactionLogAttempt=void 0);return}if(event.type==="message_end"&&event.message.role==="assistant"){let message=event.message;if(message.stopReason!=="error")return;let kind=isProviderStreamStallError(message)?"stall":isProviderTimeoutError(message)?"timeout":"error";this._sessionLogger.warn("provider_error",{kind,error:message.errorMessage,provider:message.provider,model:message.model})}}_estimateCompactionLogTokens(source2){try{let messages=source2==="active"?this._runtimeMessages():this.sessionManager.buildSessionContext().messages;return estimateMessagesTokens2(messages)}catch{return}}_createToolContext(signal){let context=this._extensionRunner.createContext(),controller=new AbortController,cancellation=signal??context.signal,unsubscribe=this.subscribe(event=>{event.type==="queue_update"&&event.steering.length>0&&controller.abort()}),dispose=()=>{unsubscribe(),cancellation?.removeEventListener("abort",dispose),this._toolContextDisposers.delete(dispose)};return this._toolContextDisposers.add(dispose),cancellation?.addEventListener("abort",dispose,{once:!0}),cancellation?.aborted?dispose():this._steeringMessages.length>0&&controller.abort(),Object.defineProperty(context,"steeringSignal",{value:controller.signal,enumerable:!0}),{context,dispose}}_emitQueueUpdate(){this._emit({type:"queue_update",steering:[...this._steeringMessages],followUp:[...this._followUpMessages],ordered:[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder)})}_incrementMessageRevision(){this._messageRevision++,this._releaseBlockedPostCompactionAdmissionIfReduced()}_runtimeMessages(){return this._runtimeMessagesTokenized&&(this._runtimeMessagesTokenized=!1,this.sessionManager.getResidentStore().materializeInPlace(this.agent.state.messages)),this.agent.state.messages}_blockedAdmissionContentTokens(){return estimateMessagesTokens2(this._runtimeMessages())}_releaseBlockedPostCompactionAdmissionIfReduced(){let blocked=this._blockedPostCompactionAssistant;blocked!==void 0&&this._blockedAdmissionContentTokens()<blocked.contentTokens&&(this._blockedPostCompactionAssistant=void 0)}_releaseBlockedPostCompactionAdmission(){this._blockedPostCompactionAssistant=void 0}getMessageRevision(){return this._messageRevision}get agentDir(){return this._agentDir}get cwd(){return this._cwd}async _waitForSettledSessionWork(){await this._sessionWorkBarrier.waitForSettled(()=>this._agentEventQueue)}async waitForSettledSessionWork(){await this._waitForSettledSessionWork();let titlePromise=this._sessionTitlePromise;titlePromise!==void 0&&await titlePromise,await this._waitForSettledSessionWork()}_modelSelectionChangesContext(previousModel,nextModel){return!modelsAreEqual(previousModel,nextModel)||previousModel?.contextWindow!==nextModel.contextWindow?!0:previousModel?.api!==nextModel.api}_invalidateCompactionForModelSelection(){this.abortCompaction(),this.abortBranchSummary(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision()}_modelChangeWouldExhaustContext(model){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings(),projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:this._getDownswitchLiveContextTokens(model),compaction,includeSpeculationLead:!1,admission:this._modelSwitchAdmission()});if(!projection.usable&&!(compaction.enabled&&projection.verdict==="fits-after-compaction"))return projection}_getIdleWaitPromise(){return this._idleWaitPromise||(this._idleWaitPromise=new Promise(resolve46=>{this._resolveIdleWait=resolve46})),this._idleWaitPromise}_resolveIdleWaitIfIdle(){if(this._isAgentRunActive||!this._resolveIdleWait)return;let resolve46=this._resolveIdleWait;this._idleWaitPromise=void 0,this._resolveIdleWait=void 0,resolve46()}async _emitAgentSettled(){if(this.agent.state.isStreaming&&await this.agent.waitForIdle(),!this._isAgentRunActive){this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle();return}this._isAgentRunActive=!1,this.externalAdmission.observeRunSettled();let deferredActions=[],deferredTurnClaims=[];this._agentSettledDelivery.begin(this._userAbortGeneration);let settlementEpoch=++this._settlementEpoch;try{await this._extensionRunner.emit({type:"agent_settled"}),this._emit({type:"agent_settled"}),this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),{actions:deferredActions,turnClaims:deferredTurnClaims}=this._agentSettledDelivery.finish(this._userAbortGeneration)}finally{this._agentSettledDelivery.cancel(),this._abortProvenance.closeAgentEndBoundary(),this._resolveIdleWaitIfIdle()}for(let action of deferredActions)action();queueMicrotask(()=>{this._emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims)})}releaseSettledSessionMemory(){this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.sessionManager.holdsMaterializedHistory()&&this.sessionManager.dropMaterializedCaches(),(this.sessionManager.getResidentStoreStats().evictedCount??0)>0&&(this.sessionManager.dropMaterializedCaches(),this.sessionManager.getResidentStore().externalizeInPlace(this.agent.state.messages),this._runtimeMessagesTokenized=!0))}async _emitAgentIdleAfterDeferredTurns(settlementEpoch,deferredTurnClaims){let dispositions=await Promise.all(deferredTurnClaims.map(claim=>claim.disposition));dispositions.includes("started")||((dispositions.includes("delegated")||this._sessionWorkBarrier.hasActiveWork)&&await this._waitForSettledSessionWork(),settlementEpoch===this._settlementEpoch&&(this._isAgentRunActive||this._sessionWorkBarrier.hasActiveWork||(this.releaseSettledSessionMemory(),this._emit({type:"agent_idle"}))))}async _promptAgent(messages,deferredTurnClaim,onQueuedInput){if(deferredTurnClaim?.resolve("started"),this._isAgentRunActive||this.externalAdmission.beginTurn(),this._isAgentRunActive=!0,this._failedResponse=void 0,this._recordSelection(),this._requiredCompactionAdmissionError=void 0,this._transcriptWriteFailures.startRun(),this._promptOwnsRun=!0,!this.agent.state.isStreaming){let withoutRefused=this._transcriptWriteFailures.takeRefusedOut(this.agent.state.messages);withoutRefused&&(this.agent.state.messages=withoutRefused,this._incrementMessageRevision())}this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain();try{await this.agent.prompt(messages),await this._agentEventQueue,this._promptOwnsRun=!1;let requiredCompactionError=this._requiredCompactionAdmissionError;this._requiredCompactionAdmissionError=void 0;let transcriptWriteFailure=this._transcriptWriteFailures.takeReport();if(requiredCompactionError)throw this._sessionLogger.warn("prompt_rejected",{stage:"admission",error:"RequiredCompactionError"}),requiredCompactionError;if(transcriptWriteFailure)throw transcriptWriteFailure.error}catch(error2){if(this._promptOwnsRun=!1,error2 instanceof Error&&error2.message==="Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion."){let queuedMessages=Array.isArray(messages)?messages:[messages],userMessage2=queuedMessages.find(message=>message.role==="user"),prepared=userMessage2?.role==="user"?{...readClientMessageIdentity(userMessage2),text:this._extractUserMessageText(userMessage2.content),images:typeof userMessage2.content=="string"?void 0:userMessage2.content.filter(part=>part.type==="image"),mode:"steer",enqueueOrder:this.reserveQueuedInputOrder()}:void 0;prepared&&onQueuedInput?.(prepared);for(let message of queuedMessages)this.agent.steer(message);prepared&&(this._steeringMessages.push(prepared.text),this._recordQueuedInput(prepared.text,"steer",prepared),this._emitQueueUpdate());return}throw await this._emitAgentSettled(),error2}}_extractUserMessageText(content){return typeof content=="string"?content:content.filter(part=>part.type==="text").map(part=>part.text).join("")}_createRetryPromiseForAgentEnd(event){if(event.type!=="agent_end"||this._retryPromise||!this.settingsManager.getRetrySettings().enabled)return;let lastAssistant=this._findLastAssistantInMessages(event.messages);!lastAssistant||!this._isRetryableError(lastAssistant)&&!this._isHardErrorFallbackEligible(lastAssistant)&&!isCursorZeroTokenResourceExhausted(lastAssistant)&&!isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0)||(this._retryPromise=new Promise(resolve46=>{this._retryResolve=resolve46}),this.agent.suppressQueuedMessageDrain())}_findLastAssistantInMessages(messages){for(let i=messages.length-1;i>=0;i--){let message=messages[i];if(message.role==="assistant")return message}}_getRequiredAutoCompactionReason(message){let reason=this._getAutoCompactionReason(message);if(reason==="overflow"&&message.stopReason==="stop"&&this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(reason==="overflow")return reason;if(this._hasPendingPostCompactionUsageExemption(message))return"threshold";if(!(reason==="threshold"&&(this._skipNextPostRetryCompactionCheck||this._postCompactionUsageExemptAssistants.has(message))))return reason}_resolveThresholdContextTokens(directContextTokens){let messages=this._runtimeMessages();return resolveThresholdContextTokens(directContextTokens,estimateMessagesTokens2(messages))}_getAutoCompactionReason(message){let settings=this._getCompactionSettings();if(message.stopReason==="aborted")return;let model=this.model;if(!model||this._isAssistantFromBeforeLatestCompaction(message)&&!this._exceedsPolicyByContentEstimate())return;let sameModel=isSameOverflowSource(message,model,this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId),contextUsage=this.getContextUsage(),currentContextNeedsCompaction=contextUsage!==void 0&&contextUsage.tokens!==null&&shouldCompact2(contextUsage.tokens,contextUsage.contextWindow,settings);if(isContextOverflow(message,model.contextWindow)&&(sameModel||currentContextNeedsCompaction)||this._isCursorPayloadOverflow(message))return settings.enabled||isTurnStuckOnContextOverflow(message,model.contextWindow)?"overflow":void 0;if(!settings.enabled)return;let contextTokens,directContextTokens=message.usage?calculateContextTokens2(message.usage):0;if(message.stopReason!=="error"&&directContextTokens!==0)contextTokens=this._resolveThresholdContextTokens(directContextTokens);else{let messages=this._runtimeMessages(),estimate=estimateContextTokens3(messages);if(estimate.lastUsageIndex===null){if(!this._isRequiredCompactionError(message))return}else{let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch()),usageMessage=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)){let contentTokens=estimateMessagesTokens2(messages);return shouldCompact2(contentTokens,model.contextWindow,settings)?"threshold":void 0}}contextTokens=estimate.tokens}return shouldCompact2(contextTokens,model.contextWindow,settings)?"threshold":void 0}_exceedsPolicyByContentEstimate(){let model=this.model;if(!model)return!1;let settings=this._getCompactionSettings(),contextTokens=estimateMessagesTokens2(this._runtimeMessages());return shouldCompact2(contextTokens,model.contextWindow,settings)}_hasPendingPostCompactionUsageExemption(message){return this._skipNextPostCompactionAssistantCheck&&!this._assistantsPendingAtCompaction.has(message)&&this._overflowRecoveryRungs===0}_isPostCompactionUsageExempt(message){return this._postCompactionUsageExemptAssistants.has(message)||this._hasPendingPostCompactionUsageExemption(message)}_consumePostCompactionUsageExemption(message){return this._postCompactionUsageExemptAssistants.has(message)?!0:this._isPostCompactionUsageExempt(message)?(this._skipNextPostCompactionAssistantCheck=!1,this._postCompactionUsageExemptAssistants.add(message),!0):!1}_agentEndAllowsQueuedContinuation(messages){let lastAssistantIndex=-1;for(let index=messages.length-1;index>=0;index--)if(messages[index]?.role==="assistant"){lastAssistantIndex=index;break}if(lastAssistantIndex===-1)return!1;let lastAssistant=messages[lastAssistantIndex];if(lastAssistant?.role!=="assistant"||lastAssistant.stopReason==="aborted"||lastAssistant.stopReason==="error"||this._getRequiredAutoCompactionReason(lastAssistant))return!1;for(let index=lastAssistantIndex+1;index<messages.length;index++){let message=messages[index];if(message?.role==="toolResult"&&message.isError&&message.content.some(content=>content.type==="text"&&/\babort(?:ed)?\b/i.test(content.text)))return!1}return!0}_willRetryAfterAgentEnd(messages){if(this._suppressQueuedContinuationAfterUserAbort)return!1;let lastAssistant=this._lastAssistantMessage??this._findLastAssistantInMessages(messages);if(!lastAssistant)return!1;if(this._isRequiredCompactionError(lastAssistant)&&this._getRequiredAutoCompactionReason(lastAssistant)!==void 0)return!0;if(!this.settingsManager.getRetrySettings().enabled)return!1;let turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,retryableError=this._isRetryableError(lastAssistant);if(isCursorZeroTokenResourceExhausted(lastAssistant))return!0;if(isCursorQuotaResourceExhausted(lastAssistant,this.model?.contextWindow??0))return this._retryFallback.canTryFallback();if(!retryableError&&this._isHardErrorFallbackEligible(lastAssistant))return!0;if(!retryableError)return!1;if(isClassifierRefusal(lastAssistant))return this._retryAttempt+1<=turnMaxRetries&&this._retryFallback.canTryFallback();if(this._retryAttempt+1>turnMaxRetries)return this._retryFallback.canTryFallback();let errorMessage8=lastAssistant.errorMessage||"Unknown error",providerDelayMs=this._getProviderRetryDelayMs(errorMessage8);return providerDelayMs===void 0||providerDelayMs<=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs?!0:this._retryFallback.canTryFallback()}_isRequiredCompactionError(message){return this._requiredCompactionTurnError!==void 0&&message.stopReason==="error"&&message.errorMessage===this._requiredCompactionTurnError.message}async _processAgentEvent(event,signal){if(event.type==="agent_start"&&(this._requiredCompactionTurnError=void 0,this._armCircuitProbeWatchdog()),event.type==="message_start"&&event.message.role==="user"){this._overflowRecoveryRungs=0,this._retryFallback.resetTurn();let messageText=contentText(event.message.content,"");if(messageText){let{clientMessageId}=readClientMessageIdentity(event.message),queued=clientMessageId===void 0?void 0:this._queuedInputOrder.find(input=>input.clientMessageId===clientMessageId),steeringIndex=clientMessageId===void 0||queued?.mode==="steer"?this._steeringMessages.indexOf(messageText):-1;if(steeringIndex!==-1)this._steeringMessages.splice(steeringIndex,1),this._removeQueuedInput(messageText,"steer",clientMessageId),this._emitQueueUpdate();else{let followUpIndex=clientMessageId===void 0||queued?.mode==="followUp"?this._followUpMessages.indexOf(messageText):-1;followUpIndex!==-1&&(this._followUpMessages.splice(followUpIndex,1),this._removeQueuedInput(messageText,"followUp",clientMessageId),this._emitQueueUpdate())}}}let agentEndWillRetry=event.type==="agent_end"&&this._willRetryAfterAgentEnd(event.messages);this._extensionEventSignal=signal;try{await this._emitExtensionEvent(event,agentEndWillRetry)}finally{this._extensionEventSignal=void 0}if(event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),this._emit(event.type==="agent_end"?{...event,willRetry:agentEndWillRetry}:event.type==="message_update"?withResolvedToolName(event,name=>this.resolveToolCallName(name)):event),event.type==="agent_end"&&this._abortProvenance.takeLateUserJoin()&&await this._emitSessionAbort(),event.type==="message_update"&&event.message.role==="assistant"&&this._acceptCircuitProbeOnProgress(event.message,event.assistantMessageEvent),event.type==="message_end"){let entryId;try{event.message.role==="custom"?(entryId=this.sessionManager.appendCustomMessageEntry(event.message.customType,event.message.content,event.message.display,event.message.details),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message)):(event.message.role==="user"||event.message.role==="assistant"||event.message.role==="toolResult")&&(entryId=this.sessionManager.appendMessage(event.message),this._emitEntryAppended(entryId),this._incrementMessageRevision(),this.externalAdmission.observePersisted(event.message))}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:String(error2);this.externalAdmission.observeRefused(event.message,errorMessage8),this._sessionLogger.warn("transcript_write_failed",{role:event.message.role,error:errorMessage8}),this._transcriptWriteFailures.record(event.message,error2),this._emit({type:"transcript_write_failed",role:event.message.role,errorMessage:errorMessage8}),this._promptOwnsRun||this._reportContinuationTranscriptFailure()}if(entryId&&this._entryIdsByMessage.set(event.message,entryId),event.message.role==="assistant"){this._lastAssistantMessage=event.message;let assistantMsg=event.message,succeeded=!assistantMsg.errorMessage&&assistantMsg.stopReason!=="error"&&assistantMsg.stopReason!=="aborted"&&!isClassifierRefusal(assistantMsg);if(succeeded&&this._retryFallback.probes.accept(`${assistantMsg.provider}/${assistantMsg.model}`),succeeded&&assistantMsg.stopReason!=="length"&&(this._overflowRecoveryRungs=0),succeeded&&this._retryAttempt>0){let fallback=this._retryFallback.activeState;fallback&&this._emit({type:"retry_fallback_succeeded",model:this.model?`${this.model.provider}/${this.model.id}`:"",chainKey:fallback.chainKey}),this._emit({type:"auto_retry_end",success:!0,attempt:this._retryAttempt}),this._retryAttempt=0,this._resetHintTierState()}}}let launchedContinuation=!1,retryContinuationBlocked=!1,retryExhaustionAllowsQueuedContinuation=!1,allowsPostCompactionUsageExemptContinuation=!1,userAbortSuppressedQueuedContinuation=event.type==="agent_end"&&this._suppressQueuedContinuationAfterUserAbort;userAbortSuppressedQueuedContinuation&&(this._suppressQueuedContinuationAfterUserAbort=!1);let allowsQueuedContinuation=event.type==="agent_end"&&!userAbortSuppressedQueuedContinuation?this._agentEndAllowsQueuedContinuation(event.messages):!1;if(event.type==="agent_end"&&this._lastAssistantMessage){let msg=this._lastAssistantMessage;this._lastAssistantMessage=void 0,this._skipNextPostRetryCompactionCheck=!1,this._clearCircuitProbeWatchdog(),msg.stopReason==="error"&&isHealthExhaustionFailure(msg.errorMessage)&&this.model&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage});let requiredAutoCompaction=this._getRequiredAutoCompactionReason(msg),retryAfterRequiredCompaction=requiredAutoCompaction!==void 0&&this._isRequiredCompactionError(msg),retryableError=this._isRetryableError(msg),hardErrorFallbackEligible=this._isHardErrorFallbackEligible(msg),cursorZeroTokenRe=isCursorZeroTokenResourceExhausted(msg),cursorQuotaRe=isCursorQuotaResourceExhausted(msg,this.model?.contextWindow??0),claudeSdkSameModelRemint=this._isClaudeSdkSameModelRemintError(msg),retryCanAdmitProvider=!userAbortSuppressedQueuedContinuation&&this.settingsManager.getRetrySettings().enabled&&(retryableError||hardErrorFallbackEligible||cursorZeroTokenRe||cursorQuotaRe||claudeSdkSameModelRemint),compactedBeforeRetry=!1;retryCanAdmitProvider&&requiredAutoCompaction&&!(requiredAutoCompaction==="threshold"&&this._hasPendingPostCompactionUsageExemption(msg))&&(this._retireFailedRetryAssistant(msg),compactedBeforeRetry=await this._runPrePromptCompaction(msg,!0,requiredAutoCompaction,!0),retryContinuationBlocked=!compactedBeforeRetry&&!this._isCompactionDelegated()&&!cursorQuotaRe&&!hardErrorFallbackEligible);let retryOutcome="not-handled",retryOwnedDeferredQueue=DEFERRED_RETRY_QUEUE_OWNERS.has(this);if(DEFERRED_RETRY_QUEUE_OWNERS.delete(this),!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(cursorZeroTokenRe?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):cursorQuotaRe?(this._retireFailedRetryAssistant(msg),retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0})):claudeSdkSameModelRemint?retryOutcome=await this._handleRetryableError(msg,{sameModelRemint:!0}):retryableError?retryOutcome=await this._handleRetryableError(msg):hardErrorFallbackEligible&&(retryOutcome=await this._handleRetryableError(msg,{hardErrorFallback:!0}))),retryOutcome==="continued"){this._abortProvenance.closeAgentEndBoundary();return}if(msg.stopReason==="error"&&this.model&&this._isRetryableError(msg)&&this._isCircuitProbeOnCurrentModel()&&this._retryFallback.noteHealthFailure(this.model,this.thinkingLevel,{errorMessage:msg.errorMessage}),this._retryFallback.probes.release(),retryExhaustionAllowsQueuedContinuation=!userAbortSuppressedQueuedContinuation&&retryOwnedDeferredQueue&&retryOutcome==="not-handled"&&(msg.stopReason==="error"||msg.stopReason==="aborted"),retryOutcome==="not-handled"&&cursorQuotaRe&&msg.errorMessage&&(msg.errorMessage=`${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`),retryOutcome==="not-handled"&&msg.stopReason==="error"&&msg.errorMessage){let rejectedImages=rejectedImageSources(this.agent.state.messages,msg);rejectedImages.length>0&&(msg.errorMessage=`${msg.errorMessage} (the rejected image from ${rejectedImages.join(", ")} is left out of later requests; send your next message to continue)`)}if(retryOutcome==="not-handled"&&this._retryAttempt>0&&msg.errorMessage){let attempt2=this._retryAttempt;this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:userAbortSuppressedQueuedContinuation?"Retry cancelled":msg.errorMessage})}this._resolveRetry(),retryContinuationBlocked||=retryOutcome==="blocked",!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&(compactedBeforeRetry&&this.agent.hasQueuedMessages()?(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0):(launchedContinuation=await this._checkCompaction(msg,!0,void 0,retryAfterRequiredCompaction),launchedContinuation&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0),allowsPostCompactionUsageExemptContinuation=this._postCompactionUsageExemptAssistants.has(msg),allowsPostCompactionUsageExemptContinuation&&this._flushPostCompactionDeferredMessages(),requiredAutoCompaction&&!launchedContinuation&&this.agent.hasQueuedMessages()&&this._getRequiredAutoCompactionReason(msg)!==void 0&&(this._requiredCompactionAdmissionError=new RequiredCompactionError)))}event.type==="agent_end"&&(this._flushPendingBashMessages(),!launchedContinuation&&!retryContinuationBlocked&&(allowsQueuedContinuation||allowsPostCompactionUsageExemptContinuation||retryExhaustionAllowsQueuedContinuation)&&this.agent.hasQueuedMessages()&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),!launchedContinuation&&!retryContinuationBlocked&&!userAbortSuppressedQueuedContinuation&&this._extensionRunner.hasHandlers("agent_before_settle")&&await this._runBeforeSettleBoundary(this.agent.hasQueuedMessages())&&(this._requiredCompactionAdmissionError=void 0,this._scheduleContinuationAfterCurrentEvent(),launchedContinuation=!0),launchedContinuation?this._abortProvenance.closeAgentEndBoundary():await this._emitAgentSettled())}_resolveRetry(){this._retryResolve&&(this._retryResolve(),this._retryResolve=void 0,this._retryPromise=void 0)}_resetHintTierState(){this._probePhase="idle",this._hintDeadlineMs=void 0,this._cumulativeHintedWaitMs=0}_isCircuitProbeOnCurrentModel(){let model=this.model;return model!==void 0&&this._retryFallback.probes.holds(formatSelector(model))}_acceptCircuitProbeOnProgress(message,event){let probing=this._retryFallback.probes.probing;probing===void 0||`${message.provider}/${message.model}`!==probing||!((event.type==="text_delta"||event.type==="thinking_delta"||event.type==="toolcall_delta")&&event.delta.length>0)||(this._retryFallback.probes.accept(probing),this._clearCircuitProbeWatchdog())}_armCircuitProbeWatchdog(){this._clearCircuitProbeWatchdog();let probing=this._retryFallback.probes.probing;if(probing===void 0||this.agent.streamStartTimeoutMs!==void 0)return;let timeoutMs=DEFAULT_STREAM_START_TIMEOUT_MS;this._circuitProbeWatchdog=setTimeout(()=>{this._circuitProbeWatchdog=void 0,this._retryFallback.probes.probing===probing&&this.agent.abort(new ProviderRetryWatchdogAbortError(`Circuit probe of ${probing} sent no response within ${timeoutMs}ms`))},timeoutMs)}_clearCircuitProbeWatchdog(){this._circuitProbeWatchdog!==void 0&&(clearTimeout(this._circuitProbeWatchdog),this._circuitProbeWatchdog=void 0)}async _emitSessionAbort(){await this._extensionRunner.emit({type:"session_abort"}),this._emit({type:"session_abort"})}_armProbeBackForDemotedSelector(selector,hintMs){if(!selector)return;let currentModel=this.model;if(currentModel&&formatSelector(currentModel)===selector)return;let parts=selector.split("/");if(parts.length<2)return;let provider=parts[0];if(!this._modelRuntime.hasConfiguredAuth(provider))return;let now2=this._fallbackNow(),schedule=probeBackSchedule(hintMs,now2),modelId=parts.slice(1).join("/"),demotedModel=this._modelRuntime.getModel(provider,modelId);demotedModel&&this._probeBackScheduler.arm({selector,firstAtMs:schedule.firstAtMs,deadlineMs:schedule.deadlineMs,authAvailable:()=>this._modelRuntime.hasConfiguredAuth(provider),runProbe:async signal=>{let admission=this._fallbackCircuits.admit(selector,`probe-back:${++this._probeBackLaneSeq}`);if(admission.kind==="open")return!1;try{let result3=await this._modelRuntime.completeSimple(demotedModel,{systemPrompt:"Reply with OK.",messages:[{role:"user",content:[{type:"text",text:"OK"}],timestamp:now2}]},{maxTokens:1,signal}),ok2=result3.stopReason!=="error"&&result3.stopReason!=="aborted";return!ok2&&result3.stopReason==="error"&&admission.kind==="probe"&&this._fallbackCircuits.noteFailure(selector,{errorMessage:result3.errorMessage}),ok2}catch{return!1}finally{admission.kind==="probe"&&this._fallbackCircuits.release(admission.token)}},onCleared:sel=>{this._selectorCooldowns.clear(sel),this._fallbackCircuits.close(sel)},emit:event=>{event.type==="retry_probe_scheduled"?this._emit({type:"retry_probe_scheduled",selector:event.selector,atMs:event.atMs,probeIndex:event.probeIndex}):this._emit({type:"retry_probe_result",selector:event.selector,ok:event.ok,errorMessage:event.errorMessage})}})}_findPersistedMessageEntryId(message){let mapped=this._entryIdsByMessage.get(message);if(mapped)return mapped;for(let entry of[...this.sessionManager.getBranch()].reverse())if(entry.type==="message"&&entry.message===message)return entry.id;let messageIndex=this.agent.state.messages.indexOf(message);if(messageIndex<0)return;let projection=this.sessionManager.buildSessionProjection(),projectedIndex=0;for(let entry of projection.entries)for(let i=0;i<entry.messages.length;i++){if(projectedIndex===messageIndex)return this._entryIdsByMessage.set(message,entry.sourceEntry.id),entry.sourceEntry.id;projectedIndex++}}_findLastAssistantMessage(){let messages=this.agent.state.messages;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg.role==="assistant")return msg}}_retireFailedRetryAssistant(message){let position=this.sessionManager.getMessageEntryPosition(message);if(!position||this.sessionManager.getLeafId()!==position.entryId)return;let entry=this.sessionManager.getEntry(position.entryId);if(entry?.type!=="message")return;entry.parentId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(entry.parentId);let messageIndex=this.agent.state.messages.lastIndexOf(message);messageIndex!==-1&&(this.agent.state.messages=this.agent.state.messages.slice(0,messageIndex)),this._incrementMessageRevision()}_isAssistantFromBeforeLatestCompaction(assistantMessage){let compactionEntry=getLatestCompactionEntry(this.sessionManager.getBranch());if(compactionEntry===null||this._messageEndsAwaitingPersistence.has(assistantMessage))return!1;let messagePosition=this.sessionManager.getMessageEntryPosition(assistantMessage),compactionOrder=this.sessionManager.getEntryOrder(compactionEntry.id);return messagePosition!==void 0&&compactionOrder!==void 0?messagePosition.order<=compactionOrder:assistantMessage.timestamp<=new Date(compactionEntry.timestamp).getTime()}_replaceMessageInPlace(target,replacement){if(target!==replacement){for(let key of Object.keys(target))Reflect.deleteProperty(target,key);Object.assign(target,replacement)}}async _emitExtensionEvent(event,agentEndWillRetry=!1){if(event.type==="agent_start")this._turnIndex=0,await this._extensionRunner.emit({type:"agent_start"});else if(event.type==="agent_end"){let extensionEvent=this._abortProvenance.beginAgentEnd(event.messages,agentEndWillRetry,this._findLastAssistantInMessages(event.messages)?.stopReason==="aborted");try{await this._extensionRunner.emit(extensionEvent)}finally{this._abortProvenance.endAgentEnd(extensionEvent)}}else if(event.type==="turn_start"){let extensionEvent={type:"turn_start",turnIndex:this._turnIndex,timestamp:Date.now()};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="turn_end")event.message.role==="assistant"&&!this._boundaryDispatchedMessages.delete(event.message)&&await this._dispatchTurnEndBoundary(event.message,event.toolResults),this._turnIndex++,this._flushPendingCustomMessages();else if(event.type==="message_start"){let extensionEvent={type:"message_start",message:event.message};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_update"){let extensionEvent={type:"message_update",message:event.message,assistantMessageEvent:event.assistantMessageEvent};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="message_end"){let extensionEvent={type:"message_end",message:event.message},replacement=await this._extensionRunner.emitMessageEnd(extensionEvent);if(replacement){let normalized2=(replacement.role==="user"||replacement.role==="assistant"||replacement.role==="toolResult"||replacement.role==="custom")&&replacement.content==null?{...replacement,content:[]}:replacement;this._replaceMessageInPlace(event.message,normalized2)}}else if(event.type==="tool_execution_start"){let extensionEvent={type:"tool_execution_start",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_update"){let extensionEvent={type:"tool_execution_update",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,partialResult:event.partialResult};await this._extensionRunner.emit(extensionEvent)}else if(event.type==="tool_execution_end"){let extensionEvent={type:"tool_execution_end",toolCallId:event.toolCallId,toolName:event.toolName,result:event.result,isError:event.isError};await this._extensionRunner.emit(extensionEvent)}}subscribe(listener){this._eventListeners.push(listener),this._resumeCompactionRequirement!==void 0&&listener({type:"resume_compaction_required",projection:this._resumeCompactionRequirement.projection,notice:this._resumeCompactionRequirement.notice}),this._resumeSlice!==void 0&&listener(this._resumeSliceEvent(this._resumeSlice));for(let source2 of this.settingsManager.getSelectedSettingsSources())listener({type:"settings_source_selected",...source2});return()=>{let index=this._eventListeners.indexOf(listener);index!==-1&&this._eventListeners.splice(index,1)}}_disconnectFromAgent(){this._unsubscribeAgent&&(this._unsubscribeAgent(),this._unsubscribeAgent=void 0)}_reconnectToAgent(){this._unsubscribeAgent||(this._unsubscribeAgent=this.agent.subscribe(this._handleAgentEvent))}dispose(){for(let dispose of this._toolContextDisposers)dispose();try{this._probeBackScheduler.cancel("dispose"),this._clearCircuitProbeWatchdog(),this._retryFallback.probes.releaseAll(),this._fallbackCircuitsLease.release(),this.abortRetry(),this.abortCompaction(),this.abortBranchSummary(),this.abortSessionTitleGeneration(),this.abortBash(),this.agent.abort()}catch{}this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."),this._releaseToolSearchService("session disposed"),this._disconnectFromAgent(),this._unsubscribeSettingsSource?.(),this._unsubscribeSettingsSource=void 0,this._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(`
2552
2552
 
2553
2553
  `):void 0};let basePrompt=loaderSystemPrompt??buildDynamicSystemPrompt(this._baseSystemPromptOptions),prompt=loaderAppendSystemPrompt.length>0?`${basePrompt}
2554
2554
 
@@ -2559,7 +2559,7 @@ ${loaderAppendSystemPrompt.join(`
2559
2559
  ${sentences.join(`
2560
2560
 
2561
2561
  `)}`:prompt}async _runInputHandlers(text2,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text2,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text2,images,source2,streamingBehavior,inputId);if(inputResult.action==="handled"){await this._emitInputDisposition(inputId,"handled");return}return inputResult.action==="transform"?{text:inputResult.text,images:inputResult.images??images,inputId}:{text:text2,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text2,options){let hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text2,options),submittedByCommand:options?.source==="extension"});try{await this._prompt(text2,{...options,promptDisposition:disposition=>{hold.accepted(),options?.promptDisposition?.(disposition)}})}finally{hold.end()}}_isExtensionCommandText(text2,options){if(!(options?.expandPromptTemplates??!0)||!text2.startsWith("/"))return!1;let spaceIndex=text2.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex))!==void 0}async _prompt(text2,options){let throwIfCancelled=()=>{if(!options?.signal?.aborted)return;let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2};throwIfCancelled();let userAbortPromise=this._userAbortPromise;userAbortPromise&&(await userAbortPromise,throwIfCancelled());try{if((options?.expandPromptTemplates??!0)&&text2.startsWith("/")){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text2);if(throwIfCancelled(),handled){options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}}}}catch(error2){throw options?.preflightResult?.(!1),error2}if(options?.source!=="extension"&&this._compactionAbortController!==void 0)throw options?.preflightResult?.(!1),new Error("Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.");let ownsPromptStart=!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior===void 0;ownsPromptStart&&(this._promptStartPending=!0);let shouldWaitForSessionWork=!0,pendingCompactionAdmissionAtExtensionAdmission=options?.source==="extension"?this._pendingCompactionAdmission:void 0,compactionGenerationAtExtensionAdmission=options?.source==="extension"&&this._sessionWorkBarrier.hasActiveWork&&this._compactionLifecycle.state.status!=="idle"?this._compactionLifecycle.state.generation:void 0,canQueueWhileStreaming=(this.isStreaming||this._promptStartPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!this._promptStartPending&&options?.streamingBehavior!==void 0;if(shouldWaitForSessionWork&&!canQueueWhileStreaming&&!canQueueDuringAutoCompaction&&(!this.isStreaming||this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),options?.onSessionWorkReady?.()),!this.isStreaming)try{await this._maybeRestoreFallbackPrimary()}catch(error2){throw ownsPromptStart&&(this._promptStartPending=!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,inputId,pendingCommandInvocation,emitPendingCommandInvocation=()=>{pendingCommandInvocation&&(this._emit({type:"command_invocation",command:pendingCommandInvocation}),pendingCommandInvocation=void 0)},emitInputDisposition=async disposition=>{inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})};try{if(isManualContinueSubmission({text:text2,hasMessages:this.agent.state.messages.length>0,hasImages:(options?.images?.length??0)>0})){let accepted=!1,reportAccepted=()=>{accepted||(accepted=!0,promptDisposition?.("handled"),preflightResult?.(!0))},turnStarted=!1,turnClaim=new DeferredTurnClaim;turnClaim.disposition.then(disposition=>{disposition==="delegated"?reportAccepted():disposition==="started"&&(turnStarted=!0)});let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&turnStarted&&reportAccepted()});try{await this.sendCustomMessage({customType:MANUAL_CONTINUE_CUSTOM_TYPE,content:MANUAL_CONTINUE_DIRECTIVE,display:!1},{triggerTurn:!0,deliverAs:options?.streamingBehavior==="followUp"?"followUp":"steer"},turnClaim)}finally{unsubscribe()}reportAccepted();return}let currentText=text2,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){expandedText=this._expandSkillCommand(expandedText);let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text2)&&this._rejectUnknownCommand(currentText),templateExpansion.template&&(pendingCommandInvocation={name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"})}if(titlePrompt=options?.sessionTitlePrompt===!1?void 0:options?.sessionTitlePrompt??text2,this.isStreaming){if(!options?.streamingBehavior)throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");if(options.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueDuringAutoCompaction&&!this.isStreaming){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(canQueueWhileStreaming&&shouldWaitForSessionWork&&(this.isCompacting||this._sessionWorkBarrier.hasActiveWork)&&(await this._waitForSettledSessionWork(),throwIfCancelled(),this.isStreaming)){if(options?.thinkingLevel!==void 0)throw new Error("Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.");options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}if(pendingCompactionAdmissionAtExtensionAdmission!==void 0&&pendingCompactionAdmissionAtExtensionAdmission.outcome!=="completed"||compactionGenerationAtExtensionAdmission!==void 0&&this._compactionLifecycle.state.generation===compactionGenerationAtExtensionAdmission&&(this._compactionLifecycle.state.status==="failed"||this._compactionLifecycle.state.status==="aborted")){options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}this._flushPendingBashMessages(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let userContent=[{type:"text",text:expandedText}];currentImages&&userContent.push(...currentImages),messages.push({role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)}),consumedNextTurnMessages=this._pendingNextTurnMessages,this._pendingNextTurnMessages=[];for(let msg of consumedNextTurnMessages)messages.push(msg);this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(expandedText,currentImages,this._baseSystemPrompt,this._baseSystemPromptOptions);this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{ownsPromptStart&&(this._promptStartPending=!1)}messages&&(promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,void 0,options?.onQueuedInput),await this.waitForRetry(),await this.waitForIdle(),options?.onSessionWorkReady?await this.agent.waitForIdle():shouldWaitForSessionWork?await this._waitForSettledSessionWork():await this.agent.waitForIdle(),titlePrompt!==void 0&&this._startSessionTitleGeneration(titlePrompt))}_applyBeforeAgentStartResult(messages,result3){if(result3?.messages)for(let msg of result3.messages)messages.push({role:"custom",customType:msg.customType,content:msg.content??[],display:msg.display,details:msg.details,timestamp:Date.now()});result3?.systemPrompt!==void 0?(this._systemPromptOverride=result3.systemPrompt,this.agent.state.systemPrompt=result3.systemPrompt):(this._systemPromptOverride=void 0,this.agent.state.systemPrompt=this._baseSystemPrompt)}async _tryExecuteExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex),args=spaceIndex===-1?"":text2.slice(spaceIndex+1),command=this._extensionRunner.getCommand(commandName);if(!command)return!1;this._emit({type:"command_invocation",command:{name:commandName,source:"extension",sourceInfo:command.sourceInfo,syntax:"slash"}});let ctx=this._extensionRunner.createCommandContext();try{return await command.handler(args,ctx),!0}catch(err2){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err2 instanceof Error?err2.message:String(err2)}),!0}}_rejectUnknownCommand(text2){if(commandShapedName(text2)===void 0)return;let promptCommands=new Set([...this._extensionRunner.getRegisteredCommands().map(command=>command.invocationName),...this.promptTemplates.map(template=>template.name),...this.resourceLoader.getSkills().skills.map(skill=>`skill:${skill.name}`)]),interactiveCommands=new Set(BUILTIN_SLASH_COMMANDS.map(command=>command.name)),rejection=findUnknownCommand(text2,{promptCommands,interactiveCommands});if(rejection)throw rejection}_expandSkillCommand(text2){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text2,{knownSkillNames:new Set(skills.map(skill=>skill.name))});if(invocationTokens.length===0)return text2;let maxExpansions=this.settingsManager.getMaxSkillExpansionsPerPrompt(),expandedSkillNames=new Set,skillBlocks=[],invocationMetadata=[],removedTokens=[],unloadedTokens=new Set,skippedSkillNames=[];for(let token of invocationTokens){let skill=skills.find(candidate=>candidate.name===token.name);if(!skill){if(token.position==="leading")break;continue}if(expandedSkillNames.has(skill.name)){removedTokens.push(token),this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:`Skipped duplicate skill invocation: ${skill.name}`});continue}if(skillBlocks.length>=maxExpansions){removedTokens.push(token),unloadedTokens.add(token),skippedSkillNames.includes(skill.name)||skippedSkillNames.push(skill.name);continue}removedTokens.push(token);try{let content=readFileSync46(skill.filePath,"utf-8"),body=stripFrontmatter(content).trim();skillBlocks.push({name:skill.name,filePath:skill.filePath,baseDir:skill.baseDir,body}),expandedSkillNames.add(skill.name),invocationMetadata.push({name:skill.name,path:skill.filePath,syntax:token.syntax})}catch(err2){return this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err2 instanceof Error?err2.message:String(err2)}),text2}}if(skippedSkillNames.length>0){let count=skippedSkillNames.length;this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Skipped ${count} skill${count===1?"":"s"} (${skippedSkillNames.join(", ")}): at most ${maxExpansions} skills load per prompt. Raise maxSkillExpansionsPerPrompt to load more.`})}if(skillBlocks.length===0)return text2;let userRequest=removeSkillInvocationTokens(text2,removedTokens,unloadedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}async _queueUserInput(text2,images,behavior,options){text2.startsWith("/")&&this._throwIfExtensionCommand(text2);let processedInput=await this._runInputHandlers(text2,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return"handled";let expandedText=this._expandSkillCommand(processedInput.text),templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);return expandedText=templateExpansion.text,behavior==="steer"?await this._queueSteer(expandedText,processedInput.images,options):await this._queueFollowUp(expandedText,processedInput.images,options),await this._emitInputDisposition(processedInput.inputId,"queued"),templateExpansion.template&&this._emit({type:"command_invocation",command:{name:templateExpansion.template.name,source:"prompt",sourceInfo:templateExpansion.template.sourceInfo,syntax:"slash"}}),"queued"}async steer(text2,images,options){return this._queueUserInput(text2,images,"steer",options)}async followUp(text2,images,options){return this._queueUserInput(text2,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"steer"})}async _queueFollowUp(text2,images,options){this._enqueuePreparedInput({...options,text:text2,images,mode:"followUp"})}async restoreQueuedInput(input){this._enqueuePreparedInput(input)}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text),this._recordQueuedInput(input.text,input.mode,prepared),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length}),this._emitQueueUpdate();let message={role:"user",content:[{type:"text",text:input.text},...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};if(this._promptStartPending&&this._skipNextPostCompactionAssistantCheck){(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message);return}switch(input.mode){case"steer":this.agent.steer(message);break;case"followUp":this.agent.followUp(message);break}}_flushPostCompactionDeferredMessages(){for(let message of this._postCompactionDeferredSteeringMessages)this.agent.steer(message);this._postCompactionDeferredSteeringMessages=[];for(let message of this._postCompactionDeferredFollowUpMessages)this.agent.followUp(message);this._postCompactionDeferredFollowUpMessages=[]}_throwIfExtensionCommand(text2){let spaceIndex=text2.indexOf(" "),commandName=spaceIndex===-1?text2.slice(1):text2.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName))throw new Error(`Extension command "/${commandName}" cannot be queued. Use prompt() or execute the command when not streaming.`)}async sendCustomMessage(message,options,deferredTurnClaim){let userAbortGeneration=this._userAbortGeneration,appMessage={role:"custom",customType:message.customType,content:message.content??[],display:message.display,details:message.details,timestamp:Date.now()},waitForExistingSessionWork=options?.triggerTurn===!0&&options.deliverAs!=="nextTurn"&&!this.isStreaming&&this._sessionWorkBarrier.hasActiveWork&&this._extensionBindingPromptReadiness===void 0,pendingCompactionAdmission=this._pendingCompactionAdmission,activeCompactionGeneration=this._compactionLifecycle.state.status==="running"?this._compactionLifecycle.state.generation:void 0,finishSessionWork;try{if(waitForExistingSessionWork){if(await this._waitForSettledSessionWork(),userAbortGeneration!==this._userAbortGeneration)return;finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1)deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn===!0&&(pendingCompactionAdmission!==void 0&&pendingCompactionAdmission.outcome!=="completed"||activeCompactionGeneration!==void 0&&this._compactionLifecycle.state.generation===activeCompactionGeneration&&this._compactionLifecycle.state.status!=="completed"))deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),this._refreshToolDeclarationsForModel(),this._promptCachePrefixBuilds.cancelAll();let result3=await this._extensionRunner.emitBeforeAgentStart(contentText(appMessage.content,""),void 0,this._baseSystemPrompt,this._baseSystemPromptOptions,{trigger:deliveryIdOf(appMessage)===void 0?"extension":"delivery"});if(userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}if(this._applyBeforeAgentStartResult(messages,result3),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}await this._promptAgent(messages,deferredTurnClaim)}else this.isStreaming?this._pendingCustomMessages.push(appMessage):this._appendCustomMessage(appMessage)}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage),this._emitEntryAppended(this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details)),this._incrementMessageRevision(),this._emit({type:"message_start",message:appMessage}),this._emit({type:"message_end",message:appMessage})}_flushPendingCustomMessages(){let pending=this._pendingCustomMessages;this._pendingCustomMessages=[];for(let message of pending)this._appendCustomMessage(message)}async sendUserMessage(content,options,deferredTurnClaim){let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve46=>{resolveBindingPromptReadiness=resolve46});bindingPromptReadiness.add(readiness)}let text2,images;try{if(typeof content=="string")text2=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text2=textParts.join(`
2562
- `),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,options){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order,...clientMessageIdentity(options)})}_removeQueuedInput(text2,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text2:message.clientMessageId===clientMessageId);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}_resumeRequirementStillBlocks(model,settings){let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;return!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable}_clearResumeCompactionRequirementIfFits(){let model=this.model;this._resumeCompactionRequirement===void 0||!model||this._resumeRequirementStillBlocks(model,this._getCompactionSettings(model))||(this._resumeCompactionRequirement=void 0)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy),await this._retryFallback.rerouteAroundOpenCircuit()}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,effectiveSelection=selection?{...selection,level:effectiveLevel}:void 0,selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}if(requestedLevel??=model.defaultThinkingLevel,requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"})}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:selection?{...selection,level}:void 0}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason,thinkingLevel){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual4(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual4(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=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)}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID13(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&&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)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID13();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_reportContinuationTranscriptFailure(){let failure2=this._transcriptWriteFailures.takeReport();if(!failure2)return;let message=failure2.error instanceof Error?failure2.error.message:String(failure2.error);this._emit({type:"continuation_error",errorMessage:`The session file did not save this run: ${message}`})}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry,options={}){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let{keepRecentTokensOverride}=options,model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID13();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),endStarted()),endStarted=()=>(reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryRungs=0),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1),isSuperseded=()=>this._autoCompactionAbortController!==autoCompactionController;try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model,{signal:autoCompactionController.signal})}catch(error2){if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();if(this._emit({type:"compaction_start",reason,requestId}),isSuperseded())return!1;throw new CompactionExecutionError(error2,!0,!1)}if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();let resolvedSettings=this._getCompactionSettings(model);return prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:keepRecentTokensOverride},model?.provider,reason),reason==="overflow")?(this._emit({type:"compaction_start",reason,requestId}),isSuperseded()?!1:autoCompactionController.signal.aborted?endStarted():(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart,keepRecentTokensOverride})).accepted?(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry?(this._stripTrailingFailedAssistants(),this._scheduleContinuationAfterCurrentEvent(),!0):this.pendingMessageCount>0?(this._scheduleContinuationAfterCurrentEvent(),!0):this.agent.hasQueuedMessages()?(this._scheduleContinuationAfterCurrentEvent(),!0):!1):(reason==="overflow"&&(this._overflowRecoveryRungs=0),!1)):endBeforeExecution()}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryRungs=0);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve46=>{settle=resolve46}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source2="user")=>{if(source2==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getBrowserEngine:()=>this._browserEngine,getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID13();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options),executeTool:(callerId,name,args,options)=>this._executeNestedToolCall(callerId,name,args,options),getCallableTools:()=>this._getCallableTools()},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()},registerVirtualModel:definition=>{this._modelRuntime.registerVirtualModel(definition),this._refreshCurrentModelFromRegistry()},unregisterVirtualModel:(provider,id)=>{this._modelRuntime.unregisterVirtualModel(provider,id),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path15){return path15.startsWith("<builtin:")||path15.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path15)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${name}`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${definition.name}`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>this._isActivatedOnRegistration(name),nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});for(let name of options?.addedToolNames??[])isAllowedTool(name)&&nextActiveToolNames.push(name);if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&this._getToolExposure(toolName)!=="hidden"&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._adoptToolSearchService(extensionsResult.runtime),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds,addedToolNames:options.addedToolNames})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;if(this._promptStartPending)return this.checkReloadVeto();let finishReloadWork=this._sessionWorkBarrier.begin();try{return await this._rebuildRuntimeForReload(options)}finally{finishReloadWork()}}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]);await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let addedDefaultTools=(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]).filter(name=>!previousDefaultTools.has(name));this._defaultToolNames&&addedDefaultTools.length>0&&(this._defaultToolNames=new Set([...this._defaultToolNames,...addedDefaultTools]));let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source2})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishRetryAttempt=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishRetryAttempt(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishRetryAttempt(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve46=>{this._retryResolve=resolve46}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else if(this._isCircuitProbeOnCurrentModel()&&this._retryFallback.canTryFallback()){if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),!switchedFallback)return this._resolveRetry(),"not-handled";this._retryAttempt=1}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._failedResponse=message,this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
2562
+ `),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text2,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,source:"extension",promptDisposition:nextDisposition=>{disposition=nextDisposition,nextDisposition==="started"?deferredTurnClaim?.resolve("started"):nextDisposition==="queued"&&deferredTurnClaim?.resolve("delegated"),resolveBindingPromptReadiness?.()},onSessionWorkReady:waitForExistingSessionWork?()=>{finishSessionWork??=this._sessionWorkBarrier.begin()}:void 0,sessionTitlePrompt:!1})}catch(error2){throw disposition===void 0&&(options?.deliverAs==="steer"?await this._queueSteer(text2,images):await this._queueFollowUp(text2,images)),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text2,mode,options){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order),this._queuedInputOrder.push({text:text2,mode,enqueueOrder:order,...clientMessageIdentity(options)})}_removeQueuedInput(text2,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text2:message.clientMessageId===clientMessageId);index!==-1&&this._queuedInputOrder.splice(index,1)}clearQueue(options={abortWillFollow:!1}){let steering=[...this._steeringMessages],followUp=[...this._followUpMessages],ordered=[...this._queuedInputOrder].sort((a,b)=>a.enqueueOrder-b.enqueueOrder);options.abortWillFollow&&(steering.length>0||followUp.length>0)&&(this._hadClearedQueuedMessages=!0),this._steeringMessages=[],this._followUpMessages=[],this._queuedInputOrder=[],this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this.agent.clearAllQueues(),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}get resourceLoader(){return this._resourceLoader}async abort(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._triggerTurnAdmissionAbortGeneration===this._userAbortGeneration,hadCompactionOrPending=!this.isStreaming&&(this.isCompacting||this.pendingMessageCount>0||hasPendingTriggerTurnAdmission),hadClearedQueues=this._hadClearedQueuedMessages,joinedAgentEndBoundary=this._abortProvenance.hasOpenAgentEndBoundary;this._hadClearedQueuedMessages=!1;let shouldEmitAbort=!joinedAgentEndBoundary&&!wasMidRun&&(hadRetryBackoff||hadCompactionOrPending||hadClearedQueues);if(this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user"),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model){return this._setModel(model,!0)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault){let pending=createPendingModelSwitch({model,projection,persistDefault});this._pendingModelSwitch=pending,this._emit({type:"model_change_pending",model,contextWindow:projection.contextWindow,liveContextTokens:projection.liveContextTokens,requiredTokens:projection.requiredTokens,shortfallTokens:projection.shortfallTokens,notice:pending.notice})}_reduceForSwitchTarget(model,liveContextTokens){if(!this._getCompactionSettings().enabled)return liveContextTokens;let projection=this._projectSwitchFit(model);if(projection.usable||projection.verdict!=="fits-after-compaction")return liveContextTokens;let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});return plan?(this.applyResumeSlice(plan),this._projectSwitchFit(model).liveContextTokens):liveContextTokens}_projectSwitchFit(model){let liveContextTokens=this.sessionManager.buildSessionContext().messages.reduce((total,message)=>total+estimateTokens2(message),0);return projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:!1,admission:"switch"})}async _applyPendingModelSwitch(assistantMessage,skipAbortedCheck,inlineReason){let pending=this._pendingModelSwitch;if(pending===void 0)return!1;if(!this.model)throw new RequiredCompactionError;await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,!1,!1,pendingSwitchKeepRecentTokens(pending.projection));let projection=this._projectSwitchFit(pending.model);if(!projection.usable){let plan=planResumeSlice({entries:this.sessionManager.getBranch(),projection});plan&&(this.applyResumeSlice(plan),projection=this._projectSwitchFit(pending.model))}if(this._pendingModelSwitch=void 0,!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._recordRejectedModelChange(pending.model,error2),error2}return await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1}),!0}_resumeRequirementStillBlocks(model,settings){let currentContext=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;return!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable}_clearResumeCompactionRequirementIfFits(){let model=this.model;this._resumeCompactionRequirement===void 0||!model||this._resumeRequirementStillBlocks(model,this._getCompactionSettings(model))||(this._resumeCompactionRequirement=void 0)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model){return this._setModel(model,!1)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new Error(`No API key for ${model.provider}/${model.id}`);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0})}async _maybeRestoreFallbackPrimary(){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy),await this._retryFallback.rerouteAroundOpenCircuit()}catch(error2){this._retryFallback.clear(),console.error("fallback revert failed; cleared fallback state",error2)}}async _onCompactionContextChanged(){this._retryFallback.notifyCompactionApplied()&&!this.isStreaming&&await this._maybeRestoreFallbackPrimary()}async _switchActiveModel(model,opts){let previousModel=this.model;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel),liveContextTokens=this._getDownswitchLiveContextTokens(model),previousReasoningBaseline=this.agent.state.reasoningBaseline,previousAbortServerSideFallback=this.agent.abortServerSideFallback;this.agent.state.model=model,supportsConfigurationUpdate(model)||(this.agent.state.reasoningBaseline=void 0);let scopedMatch=this._scopedModels.find(sm=>modelsAreEqual(sm.model,model)),previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive(),previousThinkingLevel=this.agent.state.thinkingLevel,previousThinkingSelection=this.agent.state.thinkingSelection;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection),this._emitHighReasoningWarningIfNeeded();let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=opts.emitModelSelect?await this._emitModelSelect(model,previousModel,opts.modelSelectSource):void 0,deferral=opts.allowDeferral===!1?void 0:this._projectSwitchDeferral(model,liveContextTokens);if(deferral!==void 0){previousModel&&(this.agent.state.model=previousModel),this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault);return}let admittedLiveContextTokens=opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens;return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward"){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2)}async _cycleFavoriteModel(direction,favoriteModels2){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry=>!modelsAreEqual(entry.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,!0):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection);let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,!0),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),this.sessionManager.appendModelChange(next.model.provider,next.model.id),this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._pendingModelSwitch=void 0,this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle"}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level){this._setThinkingLevel(level,!0,{level,source:"explicit"})}setSessionThinkingLevel(level){this._setThinkingLevel(level,!1,{level,source:"explicit"})}_setThinkingLevel(level,updateGlobalDefault,selection){let availableLevels=this.getAvailableThinkingLevels(),effectiveLevel=availableLevels.includes(level)?level:this._clampThinkingLevel(level,availableLevels),previousLevel=this.agent.state.thinkingLevel,previousSelection=this.agent.state.thinkingSelection,incoming=selection,requestedLevel=incoming?.requested!==void 0&&incoming.level===level?incoming.requested:level,effectiveSelection=clampThinkingSelection(selection,requestedLevel,effectiveLevel,this.model),selectionChanged=previousSelection?.level!==effectiveSelection?.level||previousSelection?.source!==effectiveSelection?.source||previousSelection?.legacyVariantId!==effectiveSelection?.legacyVariantId||previousSelection?.requested!==effectiveSelection?.requested,isChanging=effectiveLevel!==previousLevel;if((isChanging||selectionChanged)&&this._retryFallback.noteManualThinkingLevel(),this.agent.state.thinkingLevel=effectiveLevel,this.agent.state.thinkingSelection=effectiveSelection,updateGlobalDefault){let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection);let model=this.model;isChanging&&model!==void 0&&supportsConfigurationUpdate(model)&&(this.agent.state.reasoningBaseline??=previousLevel,this.sessionManager.appendConfigurationUpdate(effectiveLevel),this.agent.state.messages=this.sessionManager.buildSessionContext().messages),updateGlobalDefault&&(this.supportsThinking()||effectiveLevel!=="off")&&this.settingsManager.setDefaultThinkingLevel(effectiveLevel),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded(),this._emitThinkingClampWarningIfNeeded()}}_emitHighReasoningWarningIfNeeded(){let model=this.model,level=this.thinkingLevel;if(!model||!shouldWarnHighReasoning(model,level))return;let key=`${model.provider}/${model.id}`;this._shownHighReasoningWarningKeys.has(key)||(this._shownHighReasoningWarningKeys.add(key),this._emit({type:"high_reasoning_warning",modelId:model.id,provider:model.provider,thinkingLevel:level}))}_emitThinkingClampWarningIfNeeded(){let notice2=getThinkingClampNotice(this.thinkingSelection,this.model);if(!notice2)return;let key=this._thinkingClampWarningKey(notice2);this._shownThinkingClampWarningKeys.has(key)||(this._shownThinkingClampWarningKeys.add(key),this._emit({type:"thinking_level_clamped",...notice2}))}_thinkingClampWarningKey(notice2){return`${notice2.provider}/${notice2.modelId}:${notice2.requestedLevel}`}cycleThinkingLevel(){if(!this.supportsThinking())return;let levels=this.getAvailableThinkingLevels(),nextIndex=(levels.indexOf(this.thinkingLevel)+1)%levels.length,nextLevel=levels[nextIndex];return this.setThinkingLevel(nextLevel),nextLevel}getAvailableThinkingLevels(){let model=this.model;return model?getSupportedThinkingLevels2(model):["off"]}supportsXhighThinking(){return this.model?supportsXhigh(this.model):!1}supportsMaxThinking(){return this.model?supportsMax(this.model):!1}supportsThinking(){return!!this.model?.reasoning}_getThinkingForModelSwitch(model,explicitLevel,explicitSelection){let requestedLevel=explicitLevel,selection=explicitSelection;if(requestedLevel!==void 0&&!selection&&(selection={level:requestedLevel,source:"explicit"}),requestedLevel===void 0){let remembered=this.settingsManager.getModelThinkingLevel(model.provider,model.id);remembered!==void 0&&(requestedLevel=remembered,selection={level:remembered,source:"explicit"})}requestedLevel??=model.defaultThinkingLevel;let fromGlobalDefault=!1;if(requestedLevel===void 0){let configuredDefault=this.settingsManager.getDefaultThinkingLevel();configuredDefault!==void 0&&(requestedLevel=configuredDefault,selection={level:configuredDefault,source:"explicit"},fromGlobalDefault=!0)}requestedLevel??=DEFAULT_THINKING_LEVEL;let level=this._clampThinkingLevel(requestedLevel,getSupportedThinkingLevels2(model));return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requestedLevel,level,model)}}_clampThinkingLevel(level,availableLevels){let available=new Set(availableLevels),requestedIndex=THINKING_LEVELS_WITH_MAX.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let index=requestedIndex;index<THINKING_LEVELS_WITH_MAX.length;index++){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}for(let index=requestedIndex-1;index>=0;index--){let candidate=THINKING_LEVELS_WITH_MAX[index];if(candidate&&available.has(candidate))return candidate}return availableLevels[0]??"off"}syncQueueModesFromSettings(){this.agent.steeringMode=this.settingsManager.getSteeringMode(),this.agent.followUpMode=this.settingsManager.getFollowUpMode()}setSteeringMode(mode){this.agent.steeringMode=mode,this.settingsManager.setSteeringMode(mode),this._emitSessionSettingsChanged()}setFollowUpMode(mode){this.agent.followUpMode=mode,this.settingsManager.setFollowUpMode(mode),this._emitSessionSettingsChanged()}_claimCompactionController(controller,owner){(this._compactionAbortController!==void 0&&this._compactionAbortController!==controller||this._autoCompactionAbortController!==void 0&&this._autoCompactionAbortController!==controller)&&this._compactionLifecycle.abort(this._messageRevision),this._compactionAbortController&&this._compactionAbortController!==controller&&(this._compactionAbortController.abort(),this._compactionAbortController=void 0),this._autoCompactionAbortController&&this._autoCompactionAbortController!==controller&&(this._autoCompactionAbortController.abort(),this._autoCompactionAbortController=void 0),owner==="auto"?this._autoCompactionAbortController=controller:this._compactionAbortController=controller}_ownsCompactionController(controller,owner){return!controller.signal.aborted&&(owner==="auto"?this._autoCompactionAbortController===controller:this._compactionAbortController===controller)}_releaseCompactionController(signal){this._compactionAbortController?.signal===signal&&(this._compactionAbortController=void 0),this._autoCompactionAbortController?.signal===signal&&(this._autoCompactionAbortController=void 0)}_claimPendingCompactionAdmission(){let priorAdmission=this._pendingCompactionAdmission;priorAdmission&&(priorAdmission.controller.abort(),priorAdmission.outcome="aborted",priorAdmission.finishSessionWork());let controller=new AbortController,admission={controller,finishSessionWork:this._sessionWorkBarrier.begin()};return this._pendingCompactionAdmission=admission,this._claimCompactionController(controller,"compaction"),admission}_releasePendingCompactionAdmission(admission,outcome){admission.outcome=outcome,this._pendingCompactionAdmission===admission&&(this._pendingCompactionAdmission=void 0,admission.finishSessionWork())}_recordUserAbort(){this._suppressQueuedContinuationAfterUserAbort=!0,this._userAbortGeneration+=1}async _abortActiveAgentAndRetry(source2){if(this.abortRetry(),this.abortBranchSummary(),this._userAbortPromise===void 0){let boundaryJoin=this._abortProvenance.joinOpenBoundary(source2);if(boundaryJoin!==void 0){boundaryJoin.userOwned&&this._recordUserAbort();return}}if(this._userAbortPromise){let joined=this._abortProvenance.join(source2,this.isStreaming);joined.userOwned&&this._recordUserAbort(),joined.abortCurrentAgent&&this.agent.abort(),await this._userAbortPromise;return}this.isStreaming&&this._abortProvenance.begin(source2)&&this._recordUserAbort();let abortPromise=(async()=>{this.agent.abort(),await this.waitForIdle()})();this._userAbortPromise=abortPromise;try{await abortPromise}finally{this._userAbortPromise===abortPromise&&(this._userAbortPromise=void 0)}}async _runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,customInstructions,signal,env,reason,thinkingLevel){let cacheFriendly;if(areExperimentalFeaturesEnabled()){let systemPrompt=this.agent.state.systemPrompt,tools=this.agent.state.tools.slice(),buildSourceContext=messages=>this.agent.buildProviderContext({systemPrompt,messages:messages.slice(),tools:tools.slice()},signal),fullContext=await buildSourceContext(this.agent.state.messages),isExactPrefix=candidate=>candidate.messages.length>0&&candidate.messages.length<=fullContext.messages.length&&isDeepStrictEqual4(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual4(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact2(preparation,requestModel,apiKey,headers,customInstructions,signal,extraBody,thinkingLevel,this.agent.streamFunction,env,this.agent.transformContext,this.settingsManager.getRetrySettings(),this._summarizationRetryCallbacks({source:"compaction",reason}),this.sessionManager.getSessionId(),cacheFriendly)}async compact(customInstructions){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());this._releaseBlockedPostCompactionAdmission();let pathEntries=this.sessionManager.getBranch(),settings=cursorOverflowCompactionSettings(this._getCompactionSettings(model),model.provider,"manual");if(!prepareCompaction2(pathEntries,settings)){let requestId2=randomUUID13(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage8=`Compaction failed: ${error2.message}`;throw this._emit({type:"compaction_start",reason:"manual",requestId:requestId2}),this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted:!1,willRetry:!1,requestId:requestId2,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID13(),outcome="failed",disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"manual",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"manual",requestId,customInstructions,willRetry:!1});if(!execution.accepted)throw new CompactionRejectedError(execution.rejectionCause);return outcome="completed",this._clearResumeCompactionRequirementIfFits(),execution.result}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",error2 instanceof CompactionRejectedError)throw new Error(error2.message);if(!compactionExecutionOwnsTerminalTransition(error2))throw error2;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2),errorMessage8=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage8}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage8,aborted,willRetry:!1,fromExtension:!1}),error2}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),outcome==="completed"&&this._resumeQueuedMessagesAfterCompaction()}}async applyCompaction(precomputed,options){if(options.signal!==void 0&&options.signal!==this._compactionAbortController?.signal)return{applied:!1,reason:"stale"};if(options.expectedRevision!==void 0&&options.expectedRevision!==this._messageRevision)return{applied:!1,reason:"stale"};if(options.expectedWarmAnchor!==void 0&&!isWarmSummaryAnchorValid(options.expectedWarmAnchor,this.sessionManager.getBranch()))return{applied:!1,reason:"stale"};let ownsController=this._compactionAbortController===void 0,lifecycleState=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState.status==="running"&&lifecycleState.stage==="feedback"?lifecycleState.operationId:randomUUID13();ownsController&&(this._claimCompactionController(new AbortController,"compaction"),this._emit({type:"compaction_start",reason:options.reason,requestId}));let controller=this._compactionAbortController;if(!controller)return{applied:!1,reason:"rejected"};this._claimCompactionController(controller,"compaction");try{return(await this._executeCompaction({controller,owner:"compaction",reason:options.reason,requestId,willRetry:!1,precomputed})).accepted?(this._clearResumeCompactionRequirementIfFits(),this._resumeQueuedMessagesAfterCompaction(),{applied:!0,reason:"ok"}):{applied:!1,reason:"rejected"}}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return{applied:!1,reason:"rejected"};let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`}),{applied:!1,reason:"rejected"}}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}_beginExtensionCompactionFeedback(reason){let controller=new AbortController;this._claimCompactionController(controller,"compaction");let model=this.model,requestId=randomUUID13();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal)}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID13(),operationId=this._compactionLifecycle.begin({operationId:requestId,stage:"execution",reason:request2.reason,model:{provider:model.provider,id:model.id},startedRevision:this._messageRevision},controller),finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=request2.agentMessagesAtStart??this.agent.state.messages.slice(),compactionOwnedDiagnosticMessages=new Set,signal=controller.signal;try{if(signal.aborted)throw new CompactionCancelledError;let pathEntries=this.sessionManager.getBranch(),resolvedSettings=this._getCompactionSettings(),settings=cursorOverflowCompactionSettings(request2.keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:request2.keepRecentTokensOverride},this.model?.provider,request2.reason),compactionResult=request2.precomputed,fromExtension=request2.precomputed!==void 0;if(!compactionResult){let preparation=prepareCompaction2(pathEntries,settings,request2.reason==="overflow",request2.allowSummaryOnly);if(!preparation)throw pathEntries[pathEntries.length-1]?.type==="compaction"?new Error("Already compacted"):new Error("Nothing to compact (session too small)");if(this._extensionRunner.hasHandlers("session_before_compact")){let messagesBeforeExtension=new Set(this.agent.state.messages),extensionResult=await this._extensionRunner.emit({type:"session_before_compact",reason:request2.reason,willRetry:request2.willRetry,requestId,preparation,branchEntries:pathEntries,customInstructions:request2.customInstructions,signal});for(let message of this.agent.state.messages)!messagesBeforeExtension.has(message)&&isCompactionOwnedPreCompactDiagnostic(message,requestId)&&compactionOwnedDiagnosticMessages.add(message);if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;if(extensionResult?.cancel)return await this._rejectCompaction(request2,requestId,operationId,extensionResult.rejectionCause??"cancelled-by-extension",!0,extensionResult.reason);extensionResult?.compaction&&(compactionResult=extensionResult.compaction,fromExtension=!0)}if(!compactionResult){let compactionModel=this._resolveCompactionModel(model),{model:requestModel,apiKey,headers,extraBody,env,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel);compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&&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)return await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}}return!1}_isCompactionOnCooldown(){let state=this._compactionLifecycle.state;return state.status==="failed"&&state.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID13();this._claimCompactionController(controller,"compaction"),this._emit({type:"compaction_start",reason,requestId});try{let execution=await this._executeCompaction({controller,owner:"compaction",reason,requestId,willRetry,lastAssistantMessage:lastAssistantMessage2,skipAbortedCheck,allowSummaryOnly,keepRecentTokensOverride});return!execution.accepted&&lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0),execution.accepted}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;lastAssistantMessage2&&isContextOverflow(lastAssistantMessage2,this.model?.contextWindow??0)&&(this._overflowRecoveryRungs=0);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage8);let aborted=isCompactionExecutionAborted(error2);return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Pre-prompt compaction failed: ${errorMessage8}`}),!1}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0)}}async _revalidateScheduledContinuationAdmission(){let model=this.model,settings=this._getCompactionSettings();if(!model||!settings.enabled)return;let canonicalMessages=this.sessionManager.buildSessionContext().messages,estimate=estimateContextTokens3(canonicalMessages),usageMessage=estimate.lastUsageIndex===null?void 0:canonicalMessages[estimate.lastUsageIndex],contextTokens=usageMessage?.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMessage)?estimateMessagesTokens2(canonicalMessages):estimate.tokens,atHardLimit=shouldCompact2(contextTokens,model.contextWindow,settings),overProactiveThreshold=shouldTriggerCompaction({tokens:contextTokens,contextWindow:model.contextWindow,percent:model.contextWindow>0?contextTokens/model.contextWindow*100:0},model.contextWindow,settings);if(!atHardLimit&&!overProactiveThreshold)return;if(!await this._runPrePromptCompaction(this._findLastAssistantMessage(),!0,"pre_prompt")){if(!atHardLimit||this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return;throw new RequiredCompactionError}this._scheduledContinuationRecompacted=!0}async _continueAgentAfterCurrentRun(options={},retryTimeoutMs){await this.agent.waitForIdle();try{return this.agent.state.isStreaming||(await this._maybeRestoreFallbackPrimary(),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),await runBoundedRetryContinuation({continueRun:async()=>{if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1}}_resumeQueuedMessagesAfterCompaction(){(this.pendingMessageCount>0||this.agent.hasQueuedMessages())&&this._scheduleContinuationAfterCurrentEvent()}_reportContinuationTranscriptFailure(){let failure2=this._transcriptWriteFailures.takeReport();if(!failure2)return;let message=failure2.error instanceof Error?failure2.error.message:String(failure2.error);this._emit({type:"continuation_error",errorMessage:`The session file did not save this run: ${message}`})}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry,options={}){if(!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let{keepRecentTokensOverride}=options,model=this.model,finishCompactionWork=this._sessionWorkBarrier.begin(),agentMessagesAtStart=this.agent.state.messages.slice(),autoCompactionController=new AbortController,requestId=randomUUID13();this._claimCompactionController(autoCompactionController,"auto");let endBeforeExecution=()=>(this._emit({type:"compaction_start",reason,requestId}),endStarted()),endStarted=()=>(reason==="overflow"&&this._autoCompactionAbortController===autoCompactionController&&(this._overflowRecoveryRungs=0),this._autoCompactionAbortController!==autoCompactionController||this._emit({type:"compaction_end",reason,result:void 0,aborted:autoCompactionController.signal.aborted,willRetry:!1,requestId}),!1),isSuperseded=()=>this._autoCompactionAbortController!==autoCompactionController;try{if(!this.model)return endBeforeExecution();try{await this._modelRuntime.getAuth(this.model,{signal:autoCompactionController.signal})}catch(error2){if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();if(this._emit({type:"compaction_start",reason,requestId}),isSuperseded())return!1;throw new CompactionExecutionError(error2,!0,!1)}if(isSuperseded())return!1;if(autoCompactionController.signal.aborted)return endBeforeExecution();let resolvedSettings=this._getCompactionSettings(model);return prepareCompaction2(this.sessionManager.getBranch(),cursorOverflowCompactionSettings(keepRecentTokensOverride===void 0?resolvedSettings:{...resolvedSettings,keepRecentTokens:keepRecentTokensOverride},model?.provider,reason),reason==="overflow")?(this._emit({type:"compaction_start",reason,requestId}),isSuperseded()?!1:autoCompactionController.signal.aborted?endStarted():(await this._executeCompaction({controller:autoCompactionController,owner:"auto",reason,requestId,willRetry,agentMessagesAtStart,keepRecentTokensOverride})).accepted?(this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),willRetry?(this._stripTrailingFailedAssistants(),this._scheduleContinuationAfterCurrentEvent(),!0):this.pendingMessageCount>0?(this._scheduleContinuationAfterCurrentEvent(),!0):this.agent.hasQueuedMessages()?(this._scheduleContinuationAfterCurrentEvent(),!0):!1):(reason==="overflow"&&(this._overflowRecoveryRungs=0),!1)):endBeforeExecution()}catch(error2){if(!compactionExecutionOwnsTerminalTransition(error2))return!1;reason==="overflow"&&(this._overflowRecoveryRungs=0);let errorMessage8=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage8}`:`Auto-compaction failed: ${errorMessage8}`;return this._emit({type:"compaction_end",reason,result:void 0,aborted,willRetry:!1,requestId,errorMessage:formattedErrorMessage}),await this._emitSessionCompactFailed({reason,errorMessage:formattedErrorMessage,aborted,willRetry:!1,fromExtension:!1}),!1}finally{this._autoCompactionAbortController===autoCompactionController&&(this._autoCompactionAbortController=void 0),finishCompactionWork()}}setAutoCompactionEnabled(enabled){this._autoCompactionSessionOverride=enabled,this._emitSessionSettingsChanged()}_getCompactionSettings(forModel=this.model){let settings=this.settingsManager.getCompactionSettings(forModel);return this._autoCompactionSessionOverride===void 0?settings:{...settings,enabled:this._autoCompactionSessionOverride}}_emitSessionSettingsChanged(){this._emit({type:"session_settings_changed",steeringMode:this.steeringMode,followUpMode:this.followUpMode,autoCompactionEnabled:this.autoCompactionEnabled})}get autoCompactionEnabled(){return this._autoCompactionSessionOverride??this.settingsManager.getCompactionEnabled()}async bindExtensions(bindings2){let finishBindingWork=this._sessionWorkBarrier.begin(),settleSessionStart=this._beginSessionStartSettlement(),bindingPromptReadiness=new Set;this._extensionBindingPromptReadiness=bindingPromptReadiness;try{bindings2.uiContext!==void 0&&(this._extensionUIContext=bindings2.uiContext),bindings2.mode!==void 0&&(this._extensionMode=bindings2.mode),bindings2.commandContextActions!==void 0&&(this._extensionCommandContextActions=bindings2.commandContextActions),bindings2.abortHandler!==void 0&&(this._extensionAbortHandler=bindings2.abortHandler),bindings2.shutdownHandler!==void 0&&(this._extensionShutdownHandler=bindings2.shutdownHandler),bindings2.onError!==void 0&&(this._extensionErrorListener=bindings2.onError),this._applyExtensionBindings(this._extensionRunner),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit(this._sessionStartEvent),this._enforceConfiguredDefaultTools(),await this.extendResourcesFromExtensions(this._sessionStartEvent.reason==="reload"?"reload":"startup")}finally{this._extensionBindingPromptReadiness===bindingPromptReadiness&&(this._extensionBindingPromptReadiness=void 0),finishBindingWork(),Promise.allSettled(bindingPromptReadiness).then(settleSessionStart)}await Promise.all(bindingPromptReadiness)}_beginSessionStartSettlement(){let settle;return this._sessionStartSettled=new Promise(resolve46=>{settle=resolve46}),settle}async extendResourcesFromExtensions(reason){if(!this._extensionRunner.hasHandlers("resources_discover"))return;let{skillPaths,promptPaths,themePaths,hookPaths}=await this._extensionRunner.emitResourcesDiscover(this._cwd,reason);if(skillPaths.length===0&&promptPaths.length===0&&themePaths.length===0&&hookPaths.length===0)return;let extensions=this._resourceLoader.getExtensions().extensions,extensionPaths={skillPaths:resolveDiscoveredResourcePaths(skillPaths,extensions),promptPaths:resolveDiscoveredResourcePaths(promptPaths,extensions),themePaths:resolveDiscoveredResourcePaths(themePaths,extensions),hookPaths:resolveDiscoveredResourcePaths(hookPaths,extensions)};this._resourceLoader.extendResources(extensionPaths),(skillPaths.length>0||promptPaths.length>0||themePaths.length>0)&&(this._baseSystemPrompt=this._rebuildSystemPrompt(this._toolDeclarationNames(this.getActiveToolNames())),this.agent.state.systemPrompt=this._baseSystemPrompt)}_applyExtensionBindings(runner){runner.setUIContext(this._extensionUIContext,this._extensionMode),runner.setToolHookLifecycleObserver(event=>{this._emit(event)}),runner.bindCommandContext(this._extensionCommandContextActions),this._extensionErrorUnsubscriber?.(),this._extensionErrorUnsubscriber=this._extensionErrorListener?runner.onError(this._extensionErrorListener):void 0}_refreshCurrentModelFromRegistry(){this._delegatedCompactionKey=void 0;let currentModel=this.model;if(!currentModel)return;let refreshedModel=this._modelRuntime.getModel(currentModel.provider,currentModel.id);!refreshedModel||refreshedModel===currentModel||(this.agent.state.model=refreshedModel)}_bindExtensionCore(runner){this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data));let getCommands=()=>{let extensionCommands=runner.getRegisteredCommands().map(command=>({name:command.invocationName,description:command.description,source:"extension",sourceInfo:command.sourceInfo})),templates=this.promptTemplates.map(template=>({name:template.name,description:template.description,source:"prompt",sourceInfo:template.sourceInfo})),skills=this._resourceLoader.getSkills().skills.map(skill=>({name:`skill:${skill.name}`,description:skill.description,source:"skill",sourceInfo:skill.sourceInfo}));return[...extensionCommands,...templates,...skills]};runner.bindCore({sendMessage:(message,options)=>{let reportError=err2=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err2 instanceof Error?err2.message:String(err2)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendCustomMessage(message,options,claim).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendUserMessage:(content,options)=>{let reportError=err2=>{if(err2 instanceof ModelNotReadyError){this._noticeProviderRequired(err2.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err2 instanceof Error?err2.message:String(err2)})};this._agentSettledDelivery.deferTriggerTurn(claim=>{this.sendUserMessage(content,options,claim).catch(reportError)})||this.sendUserMessage(content,options).catch(reportError)},appendEntry:(customType,data)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data),entry=this.sessionManager.getEntry(entryId);entry&&this._emit({type:"entry_appended",entry})},setSessionName:name=>{this.setSessionName(name)},getSessionName:()=>this.sessionManager.getSessionName(),setLabel:(entryId,label3)=>{this.sessionManager.appendLabelChange(entryId,label3)},executeTool:(toolName,params,options)=>this.executeTool(toolName,params,options),getActiveTools:()=>this.getActiveToolNames(),getAllTools:()=>this.getAllTools(),getSettings:()=>this.settingsManager.getSettings(),setActiveTools:toolNames=>this.setActiveToolsByName(toolNames),refreshTools:()=>this._refreshToolRegistry(),registerRemovedToolHint:(name,hint)=>{this.agent.removedToolHints[name]=hint},registerLazyToolActivator:activator=>{this._lazyToolActivation.register(activator)},getCommands,setModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async model=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl:createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost})},{getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,getAgentDir:()=>this._agentDir,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),getSignal:()=>this._extensionEventSignal??this.agent.signal,abort:(source2="user")=>{if(source2==="system")return void this._abortActiveAgentAndRetry("system");if(this._extensionAbortHandler)return this._extensionAbortHandler();this.abort()},hasPendingMessages:()=>this.pendingMessageCount>0,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project=this.settingsManager.getProjectSettings().lookAt;return{enabled:project?.enabled??global?.enabled??!0,models:project?.models??global?.models}},getAskUserSettings:()=>this.settingsManager.getAskUserSettings(),getBrowserEngine:()=>this._browserEngine,getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:{getRetryFallbackSettings:()=>this.settingsManager.getRetryFallbackSettings(),setFallbackChain:async(key,entries)=>{this.settingsManager.setFallbackChain(key,[...entries]),await this.settingsManager.flush()},removeFallbackChain:async key=>{this.settingsManager.removeFallbackChain(key),await this.settingsManager.flush()},setModelFallbackEnabled:async enabled=>{this.settingsManager.setModelFallbackEnabled(enabled),await this.settingsManager.flush()},setFallbackRevertPolicy:async policy=>{this.settingsManager.setFallbackRevertPolicy(policy),await this.settingsManager.flush()},reload:()=>this.settingsManager.reload(),getFallbackStatus:()=>{let active=this._retryFallback.activeState;if(active)return{active:!0,currentModel:this.model?`${this.model.provider}/${this.model.id}`:void 0,originalSelector:active.originalSelector,pinned:active.pinned}}},compact:options=>{let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID13();(async()=>{let outcome="failed",compactionCompleted=!1,disconnected=!1;try{await this._abortActiveAgentAndRetry("system"),this._disconnectFromAgent(),disconnected=!0,this._emit({type:"compaction_start",reason:"extension",requestId});let execution=await this._executeCompaction({controller,owner:"compaction",reason:"extension",requestId,customInstructions:options?.customInstructions,willRetry:!1});execution.accepted?(outcome="completed",compactionCompleted=!0,options?.onComplete?.(execution.result)):(outcome="failed",options?.onError?.(new CompactionRejectedError(execution.rejectionCause)))}catch(error2){if(outcome=isCompactionExecutionAborted(error2)?"aborted":"failed",!compactionExecutionOwnsTerminalTransition(error2))return;let message=error2 instanceof Error?error2.message:String(error2),aborted=isCompactionExecutionAborted(error2);this._emit({type:"compaction_end",reason:"extension",result:void 0,aborted,willRetry:!1,requestId,errorMessage:aborted?void 0:`Compaction failed: ${message}`});let err2=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err2)}finally{this._compactionAbortController===controller&&this._compactionLifecycle.state.status!=="running"&&(this._compactionAbortController=void 0),this._releasePendingCompactionAdmission(admission,outcome),disconnected&&!this.isCompacting&&this._reconnectToAgent(),compactionCompleted&&this._resumeQueuedMessagesAfterCompaction()}})()},beginCompaction:options=>this._beginExtensionCompactionFeedback(options.reason),updateCompaction:options=>this._updateExtensionCompactionFeedback(options),endCompaction:options=>this._endExtensionCompactionFeedback(options),getMessageRevision:()=>this.getMessageRevision(),applyCompaction:(precomputed,options)=>this.applyCompaction(precomputed,options),getSystemPrompt:()=>this.systemPrompt,getLoadedHookSources:()=>this._resourceLoader.getLoadedHookSources?.()??{agentDir:this._cwd,cwd:this._cwd,globalHookSourcePaths:[],globalHooksPath:`${this._cwd}/hooks.json`,preSessionHookSourcePaths:[],projectHookSourcePaths:[],projectHooksPath:`${this._cwd}/.senpi/hooks.json`,runtimeHookSourcePaths:[]},getSystemPromptOptions:()=>this._baseSystemPromptOptions,getPromptCachePrefixRequest:options=>this._promptCachePrefixBuilds.build({agent:this.agent,runner:this._extensionRunner,modelRuntime:this._modelRuntime,ready:this._sessionStartSettled,getServiceTier:()=>this.effectiveServiceTier,getBaseSystemPrompt:()=>this._baseSystemPrompt,getBaseSystemPromptOptions:()=>this._baseSystemPromptOptions},options),executeTool:(callerId,name,args,options)=>this._executeNestedToolCall(callerId,name,args,options),getCallableTools:()=>this._getCallableTools()},{registerProvider:(name,config)=>{this._modelRuntime.registerProvider(name,config),this._refreshCurrentModelFromRegistry()},registerNativeProvider:provider=>{this._modelRuntime.registerNativeProvider(provider),this._refreshCurrentModelFromRegistry()},unregisterProvider:name=>{this._modelRuntime.unregisterProvider(name),this._refreshCurrentModelFromRegistry()},registerVirtualModel:definition=>{this._modelRuntime.registerVirtualModel(definition),this._refreshCurrentModelFromRegistry()},unregisterVirtualModel:(provider,id)=>{this._modelRuntime.unregisterVirtualModel(provider,id),this._refreshCurrentModelFromRegistry()}}),this._bindToolSearchRemovedHints()}get fallbackValidationWarnings(){return this._fallbackValidationWarnings}_isBuiltinExtensionPath(path15){return path15.startsWith("<builtin:")||path15.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path15)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry=this._toolDefinitions.get(name);return entry!==void 0&&!this._isBuiltinExtensionPath(entry.sourceInfo.path)&&entry.sourceInfo.source!=="builtin"}))}_refreshToolRegistry(options){let previousRegistryNames=new Set(this._toolRegistry.keys()),previousActiveToolNames=this.getActiveToolNames(),allowedToolNames=this._allowedToolNames,excludedToolNames=this._excludedToolNames,isAllowedTool=name=>(!allowedToolNames||allowedToolNames.has(name))&&!excludedToolNames?.has(name),registeredTools=this._extensionRunner.getAllRegisteredTools(),defaultToolNames=this._defaultToolNames,isConfiguredBuiltinTool=tool=>tool.sourceInfo.source!=="builtin"&&!this._isBuiltinExtensionPath(tool.sourceInfo.path)||defaultToolNames===void 0||defaultToolNames.has(tool.definition.name),allCustomTools=[...registeredTools.filter(isConfiguredBuiltinTool),...this._customTools.map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`<sdk:${definition.name}>`,{source:"sdk"})}))].filter(tool=>isAllowedTool(tool.definition.name)),definitionRegistry=new Map(Array.from(this._baseToolDefinitions.entries()).filter(([name])=>isAllowedTool(name)).map(([name,definition])=>[name,{definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${name}`,{source:"builtin"})}]));for(let tool of allCustomTools)definitionRegistry.set(tool.definition.name,{definition:tool.definition,sourceInfo:tool.sourceInfo});this._toolDefinitions=definitionRegistry,this._toolPromptSnippets=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let snippet=this._normalizePromptSnippet(definition.promptSnippet);return snippet?[definition.name,snippet]:void 0}).filter(entry=>entry!==void 0)),this._toolPromptGuidelines=new Map(Array.from(definitionRegistry.values()).map(({definition})=>{let guidelines=this._normalizePromptGuidelines(definition.promptGuidelines);return guidelines.length>0?[definition.name,guidelines]:void 0}).filter(entry=>entry!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext),wrappedBuiltInTools=wrapRegisteredTools(Array.from(this._baseToolDefinitions.values()).filter(definition=>isAllowedTool(definition.name)).map(definition=>({definition,sourceInfo:createSyntheticSourceInfo(`${BUILTIN_PATH_PREFIX}${definition.name}`,{source:"builtin"})})),runner,createToolContext),toolRegistry=new Map(wrappedBuiltInTools.map(tool=>[tool.name,tool]));for(let tool of wrappedExtensionTools)toolRegistry.set(tool.name,tool);this._toolRegistry=toolRegistry,this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this._publishEvalOnlyToolHints();let isDirectlyExposed=name=>this._isActivatedOnRegistration(name),nextActiveToolNames=(options?.activeToolNames?[...options.activeToolNames]:[...this._requestedActiveToolNames??previousActiveToolNames]).filter(name=>{if(!isAllowedTool(name))return!1;let previousRegistrationIds=options?.previousActiveToolRegistrationIds;if(!previousRegistrationIds)return!0;let current=this._toolDefinitions.get(name);return current!==void 0&&previousRegistrationIds.get(name)===deriveExtensionRegistrationId(current.sourceInfo,name)});for(let name of options?.addedToolNames??[])isAllowedTool(name)&&nextActiveToolNames.push(name);if(allowedToolNames)for(let toolName of this._toolRegistry.keys())allowedToolNames.has(toolName)&&this._getToolExposure(toolName)!=="hidden"&&nextActiveToolNames.push(toolName);else if(options?.includeAllExtensionTools)for(let tool of wrappedExtensionTools)isDirectlyExposed(tool.name)&&nextActiveToolNames.push(tool.name);else if(!options?.activeToolNames)for(let toolName of this._toolRegistry.keys())!previousRegistryNames.has(toolName)&&isDirectlyExposed(toolName)&&nextActiveToolNames.push(toolName);this.setActiveToolsByName([...new Set(nextActiveToolNames)])}_getToolExposure(name){let entry=this._toolDefinitions.get(name);return entry?normalizeToolExposure(entry.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry=this._toolDefinitions.get(name);if(!entry)return!1;let exposure=normalizeToolExposure(entry.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry.definition.defaultActive!==!1}_buildRuntime(options){this._delegatedCompactionKey=void 0,this._lazyToolActivation.reset();let autoResizeImages=this.settingsManager.getImageAutoResize(),shellCommandPrefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),extensionsResult=this._resourceLoader.getExtensions(),filesystemPolicy=composeFilesystemPolicies(extensionsResult.extensions.flatMap(extension=>extension.filesystemPolicies??[])),baseToolDefinitions=this._baseToolsOverride?Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name,tool])=>[name,createToolDefinitionFromAgentTool(tool)])):createAllToolDefinitions(this._cwd,{read:{autoResizeImages,filesystemPolicy},bash:{commandPrefix:shellCommandPrefix,shellPath},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value2]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value2);this._extensionRunner=new ExtensionRunner(extensionsResult.extensions,extensionsResult.runtime,this._cwd,this.sessionManager,this._modelRegistry,extensionsResult.eventBus),this._adoptToolSearchService(extensionsResult.runtime),this._extensionRunnerRef&&(this._extensionRunnerRef.current=this._extensionRunner),this._bindExtensionCore(this._extensionRunner),this._applyExtensionBindings(this._extensionRunner);let defaultActiveToolNames=this._baseToolsOverride?Object.keys(this._baseToolsOverride):["read","bash","edit","write","grep"],baseActiveToolNames=options.activeToolNames??defaultActiveToolNames;this._refreshToolRegistry({activeToolNames:baseActiveToolNames,includeAllExtensionTools:options.includeAllExtensionTools,previousActiveToolRegistrationIds:options.previousActiveToolRegistrationIds,addedToolNames:options.addedToolNames})}async reload(options){let veto=await this.checkReloadVeto();if(veto.cancelled)return veto;if(this._promptStartPending)return this.checkReloadVeto();let finishReloadWork=this._sessionWorkBarrier.begin();try{return await this._rebuildRuntimeForReload(options)}finally{finishReloadWork()}}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousFlagValues=oldExtensionRunner.getFlagValues(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry=this._toolDefinitions.get(name);entry&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry.sourceInfo,name))}await emitSessionShutdownEvent(oldExtensionRunner,{type:"session_shutdown",reason:"reload"}),time("shutdown","reload");let previousDefaultTools=new Set(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]);await this.settingsManager.reload(),this._delegatedCompactionKey=void 0;let addedDefaultTools=(this._usesDefaultTools?this.settingsManager.getDefaultTools()??DEFAULT_TOOL_NAMES:[]).filter(name=>!previousDefaultTools.has(name));this._defaultToolNames&&addedDefaultTools.length>0&&(this._defaultToolNames=new Set([...this._defaultToolNames,...addedDefaultTools]));let requestedActiveToolNamesBeforeRebuild=[...this._requestedActiveToolNames??this.getActiveToolNames()];this._evalOnlyToolNames=this._resolveEvalOnlyToolNames(),this.syncQueueModesFromSettings(),resetApiProviders(),time("settings","reload"),await this._modelRuntime.reloadConfig();let refreshedModels=this._modelRuntime.hasFreshAvailabilitySnapshot()?{getAvailable:async()=>this._modelRuntime.getAvailableSnapshot()}:this._modelRuntime;this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({legacyEnabledPatterns:this.settingsManager.getEnabledModels()}),refreshedModels)),this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels()??[],refreshedModels)),time("models","reload"),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager}),time("resources","reload");try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:previousFlagValues,includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{settleSessionStart()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isCursorPayloadOverflow(message){return isCursorPayloadResourceExhausted(message,0)}_truncateAgentMessagesToLastUserTurn(){let messages=this.agent?.state?.messages;if(!Array.isArray(messages)||messages.length===0)return!1;let lastUser=-1;for(let i=messages.length-1;i>=0;i--)if(messages[i]?.role==="user"){lastUser=i;break}return lastUser<=0?!1:(this.agent.state.messages=messages.slice(lastUser),!0)}_isClaudeSdkSessionLockError(message){return(message.errorMessage??"").includes("Lock file is already being held")}_isClaudeSdkInvalidRequestError(message){return message.errorMessage==="invalid_request"}_isClaudeSdkSameModelRemintError(message){return this.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID?!1:this._isClaudeSdkSessionLockError(message)||this._isClaudeSdkInvalidRequestError(message)}_isClaudeSdkAuthMissError(message){return this.model?.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.errorMessage===providerNotConfiguredMessage(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID)}_isHardErrorFallbackEligible(message){return!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}_takeNativeToolSearchInjectionFailure(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage8){let markerMs=parseRetryAfterMsMarker(errorMessage8);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage8})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage8)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage8})},onRetryAttemptStart:()=>{this._emit({type:"summarization_retry_attempt_start",...source2})},onRetryFinished:()=>{this._emit({type:"summarization_retry_finished"})}}}_terminalFailureText(message,attempts){let model=this.model?`${this.model.provider}/${this.model.id}`:void 0;return describeProviderFailureForUser(message.errorMessage,{attempts,model,recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8){let settings=this.settingsManager.getRetrySettings(),turnMaxRetries=this._resolveRetryProfile().turn.maxRetries,hintSettings=this.settingsManager.getHintPolicySettings(),finishRetryAttempt=(attempt2,finalError)=>{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry()},degraded=degradeWithoutFallback(tier,hintMs,this._retryAttempt+1,settings.baseDelayMs,hintSettings.hintedWaitCapMs);if(degraded.kind==="fail"){let waitSeconds=Math.ceil(degraded.hintMs/1e3);finishRetryAttempt(this._retryAttempt,`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage??""}`);return}if(this._retryAttempt++,this._retryAttempt>turnMaxRetries){finishRetryAttempt(this._retryAttempt-1,message.errorMessage);return}return degraded.delayMs}async _handleRetryableError(message,options={}){let settings=this.settingsManager.getRetrySettings();if(!settings.enabled)return this._resolveRetry(),"not-handled";let retryProfile=this._resolveRetryProfile();this._retryPromise||(this._retryPromise=new Promise(resolve46=>{this._retryResolve=resolve46}));let errorMessage8=message.errorMessage||"Unknown error",isRefusal=isClassifierRefusal(message),hardErrorFallback=options.hardErrorFallback===!0,sameModelRemint=options.sameModelRemint===!0,switchedFallback=!1,sameModelNativeRecovery=!1,is429TierRouted=!1,hintTierDelayMs,tryFallback=async(reason,failure2)=>{try{return await this._retryFallback.tryFallback(reason,failure2)}catch(error2){if(error2 instanceof ModelUsabilityBudgetError)return this._resolveRetry(),!1;throw error2}};if(sameModelRemint){if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)return this._retryAttempt>1&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else if(hardErrorFallback)if(this._takeNativeToolSearchInjectionFailure()!==null)sameModelNativeRecovery=!0,this._retryAttempt=1;else{let reason=isBillingErrorMessage(errorMessage8)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage8}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else if(isRefusal){if(this._retryAttempt+1>retryProfile.turn.maxRetries)return this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";if(switchedFallback=await tryFallback("refusal",{}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt++}else if(this._isCircuitProbeOnCurrentModel()&&this._retryFallback.canTryFallback()){if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),!switchedFallback)return this._resolveRetry(),"not-handled";this._retryAttempt=1}else{let is429Class=!isProviderStreamStallError(message)&&/rate.?limit|(?:^429(?=\s+\{)|(?:\bHTTP\/1\.[01]\s+|\bHTTP\s+|\bstatus(?:\s+code)?\s+|\berror\s+|\bcode\s+)429\b)|too many requests|resource.?exhausted/i.test(errorMessage8);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else if(is429Class){let hintMs=this._getProviderRetryDelayMs(errorMessage8),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}else if(tier==="tier1-in-turn")if(this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}else{let inTurnResult=nextInTurnDelayMs({probePhase:this._probePhase,hintDeadlineMs:this._hintDeadlineMs,attempt:this._retryAttempt,cumulativeHintedWaitMs:this._cumulativeHintedWaitMs},hintMs,settings.baseDelayMs,hintSettings.hintedWaitCapMs,Date.now());if(this._probePhase=inTurnResult.probePhase,this._hintDeadlineMs=inTurnResult.hintDeadlineMs,this._cumulativeHintedWaitMs=inTurnResult.cumulativeHintedWaitMs,inTurnResult.demoteToProbeBack){let remainingHintMs=Math.max(0,(this._hintDeadlineMs??Date.now())-Date.now());if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:message.errorMessage}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}else hintTierDelayMs=inTurnResult.delayMs}else{let remainingHintMs=hintMs??0;if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:remainingHintMs}),switchedFallback){if(this._retryAttempt=1,tier==="tier2-fallback-probe-back"){let selector=this._retryFallback.activeState?.originalSelector??"";this._armProbeBackForDemotedSelector(selector,remainingHintMs)}}else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage8);if(degradedDelayMs===void 0)return"not-handled";hintTierDelayMs=degradedDelayMs}}}if(is429TierRouted||this._retryAttempt++,!is429TierRouted&&this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:this._getProviderRetryDelayMs(errorMessage8)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage8}),this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt-1,finalError:this._terminalFailureText(message,this._retryAttempt-1)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}}let providerDelayMs=isRefusal||hardErrorFallback?void 0:this._getProviderRetryDelayMs(errorMessage8),maxRetryDelayMs=this.settingsManager.getProviderRetrySettings().maxRetryDelayMs,effectiveMaxRetryDelayMs=(retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:maxRetryDelayMs)??Number.MAX_SAFE_INTEGER;if(!is429TierRouted&&providerDelayMs!==void 0&&providerDelayMs>effectiveMaxRetryDelayMs&&(switchedFallback||(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage8,retryAfterMs:providerDelayMs}),switchedFallback&&(this._retryAttempt=1)),!switchedFallback))return this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:`Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled";let nonTierProviderDelayMs=providerDelayMs===0?void 0:providerDelayMs,localExponentialMs=retryBackoffDelayMs(retryProfile.turn.backoff,this._retryAttempt,this._retryRandom()),plannedDelayMs=switchedFallback||sameModelNativeRecovery?0:is429TierRouted?hintTierDelayMs??providerDelayMs??localExponentialMs:nonTierProviderDelayMs??localExponentialMs,profileTurnCeilingMs=retryProfile.turn.serverHint.mode==="override"?retryProfile.turn.serverHint.ceiling.maxDelayMs:void 0,agentCeilingMs=(this.settingsManager.isRetryMaxAgentDelayMsConfigured?.()??!1)||profileTurnCeilingMs===void 0?settings.maxAgentDelayMs:profileTurnCeilingMs,delayMs=Math.min(plannedDelayMs,agentCeilingMs??Number.MAX_SAFE_INTEGER);this._retryAbortController=new AbortController,this._emit({type:"auto_retry_start",attempt:this._retryAttempt,maxAttempts:retryProfile.turn.maxRetries,delayMs,errorMessage:errorMessage8});let messages=this.agent.state.messages;messages.length>0&&messages[messages.length-1].role==="assistant"&&(this.agent.state.messages=messages.slice(0,-1),this._incrementMessageRevision());try{await sleep(delayMs,this._retryAbortController.signal)}catch{let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._retryAbortController=void 0,await this._emitAgentSettled(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:"Retry cancelled"}),this._resolveRetry(),"cancelled"}this._retryAbortController=void 0,await this._maybeRestoreFallbackPrimary();let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=estimateContextTokens3(this.sessionManager.buildSessionContext().messages).tokens;if(compactionSettings.enabled&&model&&shouldCompact2(contextTokens,model.contextWindow,compactionSettings)){if(!await this._runPrePromptCompaction(message,!0,"threshold",!0,!0)&&!this._isCompactionOnCooldown()&&!this._isCompactionDelegated()&&!this._hasSupersedingCompactionClaim()){let attempt2=this._retryAttempt;return this._retryAttempt=0,this._resetHintTierState(),this._emit({type:"auto_retry_end",success:!1,attempt:attempt2,finalError:new RequiredCompactionError().message}),this._resolveRetry(),"blocked"}this._skipNextPostRetryCompactionCheck=!0}let continuation=createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs:this.settingsManager.getProviderStreamRetryTimeoutMs(),timeoutMs:this.agent.timeoutMs,streamStartTimeoutMs:this.agent.streamStartTimeoutMs});return continuation.options.deferQueuedMessages===!0?DEFERRED_RETRY_QUEUE_OWNERS.add(this):DEFERRED_RETRY_QUEUE_OWNERS.delete(this),this.agent.suppressQueuedMessageDrain(),this._failedResponse=message,this._scheduleContinuationAfterCurrentEvent(continuation.options,!0,continuation.watchdogTimeoutMs),"continued"}abortRetry(){this._retryAbortController?.abort(),this._resolveRetry()}async waitForRetry(){this._retryPromise&&(await this._retryPromise,await this.agent.waitForIdle())}get isRetrying(){return this._retryPromise!==void 0}get autoRetryEnabled(){return this.settingsManager.getRetryEnabled()}setAutoRetryEnabled(enabled){this.settingsManager.setRetryEnabled(enabled)}async executeBash(command,onChunk,options){let abortController=new AbortController;this._bashAbortControllers.add(abortController);let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
2563
2563
  ${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??createLocalBashOperations({shellPath}),{onChunk:delta=>{let callbackResult=onChunk?.(delta);return this._emit({type:"bash_execution_update",id:options?.id,delta}),callbackResult},signal:abortController.signal});return this.recordBashResult(command,result3,options),result3}finally{this._bashAbortControllers.delete(abortController)}}recordBashResult(command,result3,options){let bashMessage={role:"bashExecution",command,output:result3.output,exitCode:result3.exitCode,cancelled:result3.cancelled,truncated:result3.truncated,fullOutputPath:result3.fullOutputPath,timestamp:Date.now(),excludeFromContext:options?.excludeFromContext};this.isStreaming?this._pendingBashMessages.push(bashMessage):(this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision())}abortBash(){for(let abortController of[...this._bashAbortControllers])abortController.abort()}async cleanupBashOutput(path15){await rm10(path15,{force:!0})}get isBashRunning(){return this._bashAbortControllers.size>0}get hasPendingBashMessages(){return this._pendingBashMessages.length>0}_flushPendingBashMessages(){if(this._pendingBashMessages.length!==0){for(let bashMessage of this._pendingBashMessages)this.agent.state.messages.push(bashMessage),this.sessionManager.appendMessage(bashMessage),this._incrementMessageRevision();this._pendingBashMessages=[]}}setSessionName(name){this.sessionManager.appendSessionInfo(name);let event={type:"session_info_changed",name:this.sessionManager.getSessionName()};this._emit(event),this._extensionRunner.emit(event)}async navigateTree(targetId,options={}){return this._navigateTree(targetId,options)}async continueFromLeaf(){if(this.isStreaming)throw new ContinueFromLeafError("streaming");if(this.agent.state.messages.length===0)throw new ContinueFromLeafError("nothing_to_continue");if(this.agent.state.messages[this.agent.state.messages.length-1]?.role!=="assistant")throw new ContinueFromLeafError("leaf_not_assistant");let turnClaim=new DeferredTurnClaim,admission=trackTurnAdmission({disposition:turnClaim.disposition,subscribe:listener=>this.subscribe(event=>{event.type==="agent_start"&&listener({type:"agent_start"})})}),run2=this.sendCustomMessage({customType:CONTINUE_FROM_LEAF_CUSTOM_TYPE,content:CONTINUE_FROM_LEAF_DIRECTIVE,display:!1},{triggerTurn:!0},turnClaim);try{await Promise.race([admission.promise,run2])}finally{admission.dispose()}run2.catch(()=>{})}async editAssistantMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="assistant")throw new AssistantEditError("not-assistant",`Entry ${entryId} is not an assistant message`);let replacement=buildEditedAssistantMessage(targetEntry.message,text2);return assistantTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async editUserMessage(entryId,text2,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,this.sessionManager.getLeafId());let targetEntry=this.sessionManager.getEntry(entryId);if(!targetEntry)throw new UserEditError("not-found",`Entry ${entryId} not found`);if(targetEntry.type!=="message"||targetEntry.message.role!=="user")throw new UserEditError("not-user",`Entry ${entryId} is not a user message`);let replacement=buildEditedUserMessage(targetEntry.message,text2);return userTextEquals(targetEntry.message,text2)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async _navigateTree(targetId,options,replacement){if(this.isStreaming)throw new SessionStreamingError;if(this.isCompacting)throw new Error("Wait for the current compaction or tree navigation to finish before navigating the session tree.");let oldLeafId=this.sessionManager.getLeafId();if(assertExpectedLeaf(options.expectedLeafId,oldLeafId),options.summarize&&!this.model)throw new Error("No model available for summarization");let targetEntry=this.sessionManager.getEntry(targetId);if(!targetEntry)throw new AssistantEditError("not-found",`Entry ${targetId} not found`);let{entries:entriesToSummarize,commonAncestorId}=collectEntriesForBranchSummary2(this.sessionManager,oldLeafId,targetId),customInstructions=options.customInstructions,replaceInstructions=options.replaceInstructions,label3=options.label,preparation={targetId,oldLeafId,commonAncestorId,entriesToSummarize,userWantsSummary:options.summarize??!1,customInstructions,replaceInstructions,label:label3};this._branchSummaryAbortController=new AbortController;try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label3=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model),branchSummarySettings=this.settingsManager.getBranchSummarySettings(),result3=await generateBranchSummary2(entriesToSummarize,{model:requestModel,apiKey,headers,extraBody,env,signal:this._branchSummaryAbortController.signal,customInstructions,replaceInstructions,reserveTokens:branchSummarySettings.reserveTokens,streamFn:this.agent.streamFunction,retry:this.settingsManager.getRetrySettings(),callbacks:this._summarizationRetryCallbacks({source:"branchSummary"})});if(result3.aborted)return{cancelled:!0,aborted:!0};if(result3.error)throw new Error(result3.error);summaryText=result3.summary,summaryUsage=result3.usage,summaryDetails={readFiles:result3.readFiles||[],modifiedFiles:result3.modifiedFiles||[]}}else extensionSummary&&(summaryText=extensionSummary.summary,summaryDetails=extensionSummary.details,summaryUsage=extensionSummary.usage);let resume=options.intent==="resume"&&!replacement,newLeafId,editorText;replacement?newLeafId=targetEntry.parentId:resume?newLeafId=targetId:targetEntry.type==="message"&&targetEntry.message.role==="user"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.message.content,"")):targetEntry.type==="custom_message"?(newLeafId=targetEntry.parentId,editorText=contentText(targetEntry.content,"")):newLeafId=targetId;let summaryEntry;if(summaryText){let summaryId=this.sessionManager.branchWithSummary(newLeafId,summaryText,summaryDetails,fromExtension,summaryUsage);summaryEntry=this.sessionManager.getEntry(summaryId),label3&&this.sessionManager.appendLabelChange(summaryId,label3)}else newLeafId===null?this.sessionManager.resetLeaf():this.sessionManager.branch(newLeafId);let editedEntryId=replacement?this.sessionManager.appendMessage(replacement):void 0;return label3&&!summaryText&&this.sessionManager.appendLabelChange(editedEntryId??targetId,label3),resume&&(summaryText||label3)&&this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._delegatedCompactionKey=void 0,this._incrementMessageRevision(),await this._extensionRunner.emit({type:"session_tree",newLeafId:this.sessionManager.getLeafId(),oldLeafId,summaryEntry,fromExtension:summaryText?fromExtension:void 0}),resume&&this.sessionManager.getLeafId()!==targetId&&(this.sessionManager.branch(targetId),this._restoreAgentMessagesFromSession(),this._incrementMessageRevision()),{editorText,cancelled:!1,summaryEntry,entryId:editedEntryId}}finally{this._branchSummaryAbortController=void 0}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="user")continue;let text2=contentText(entry.message.content,"");text2&&result3.push({entryId:entry.id,text:text2})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry of this.sessionManager.getEntries()){entry.type==="usage"?addUsageToTotals(usageTotals,entry.usage):(entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage&&addUsageToTotals(usageTotals,entry.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),entry.type!=="message")continue;totalMessages++;let message=entry.message;if(message.role==="user")userMessages++;else if(message.role==="toolResult")toolResults++,message.usage&&addUsageToTotals(usageTotals,message.usage);else if(message.role==="assistant"){assistantMessages++;let assistantMsg=message;Array.isArray(assistantMsg.content)&&(toolCalls+=assistantMsg.content.filter(c=>c.type==="toolCall").length),addUsageToTotals(usageTotals,assistantMsg.usage)}}return{sessionFile:this.sessionFile,sessionId:this.sessionId,userMessages,assistantMessages,toolCalls,toolResults,totalMessages,tokens:{input:usageTotals.input,output:usageTotals.output,cacheRead:usageTotals.cacheRead,cacheWrite:usageTotals.cacheWrite,total:usageTotals.input+usageTotals.output+usageTotals.cacheRead+usageTotals.cacheWrite},cost:usageTotals.cost,contextUsage:this.getContextUsage(),failures:computeSessionFailureReport(this.sessionManager.getEntries())}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project=this.settingsManager.getProjectSettings().promptCache,merged=global||project?{...global,...project}:void 0;return resolvePromptCacheSafeWaitSeconds(this.model,merged,process.env)}syncPromptCacheSafeWaitEnv(){let budget=this.resolvePromptCacheSafeWaitSeconds();budget===void 0?delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV]:process.env[PROMPT_CACHE_SAFE_WAIT_ENV]=String(budget)}getContextUsage(){let model=this._limitsModel(),runtimeMessages=this.messages,key={messages:runtimeMessages,length:runtimeMessages.length,last:runtimeMessages.at(-1),lastFingerprint:messageFingerprint(runtimeMessages.at(-1)),leafId:this.sessionManager.getLeafId(),contextWindow:model?.contextWindow},cached=this._contextUsageCache;if(cached!==void 0&&cached.key.messages===key.messages&&cached.key.length===key.length&&cached.key.last===key.last&&cached.key.lastFingerprint===key.lastFingerprint&&cached.key.leafId===key.leafId&&cached.key.contextWindow===key.contextWindow)return cached.usage;let usage3=this._computeContextUsage(model);return this._contextUsageCache={key,usage:usage3},usage3}_computeContextUsage(model){if(!model)return;let contextWindow=model.contextWindow??0;if(contextWindow<=0)return;let messages=this.messages,branchEntries=this.sessionManager.getBranch(),latestCompaction2=getLatestCompactionEntry(branchEntries);if(latestCompaction2){let compactionIndex=branchEntries.lastIndexOf(latestCompaction2),hasPostCompactionUsage=!1;for(let i=branchEntries.length-1;i>compactionIndex;i--){let entry=branchEntries[i];if(entry.type==="message"&&entry.message.role==="assistant"){let assistant=entry.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens2(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens2(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=branchEntries.some(entry=>entry.type==="context_edit")?estimateProjectedContextTokens(this.sessionManager.buildSessionProjection(),branchEntries):estimateContextTokens3(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){let themeName=[options.themeName,this.settingsManager.getTheme()].find(candidate=>candidate!==void 0&&getThemeByName(candidate)!==void 0),toolRenderer=createToolHtmlRenderer({getToolDefinition:name=>this.getToolDefinition(name),theme,cwd:this.sessionManager.getCwd()});return await exportSessionToHtml(this.sessionManager,this.state,{outputPath,themeName,toolRenderer})}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname51(filePath);existsSync48(dir)||mkdirSync26(dir,{recursive:!0});let header2={type:"session",version:CURRENT_SESSION_VERSION,id:this.sessionManager.getSessionId(),timestamp:new Date().toISOString(),cwd:this.sessionManager.getCwd()},branchEntries=this.sessionManager.getBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry of branchEntries){let linear={...entry,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry.id}return writeFileSync24(filePath,`${lines.join(`
2564
2564
  `)}
2565
2565
  `),filePath}getLastAssistantText(){let lastAssistant=this.messages.slice().reverse().find(m=>{if(m.role!=="assistant")return!1;let msg=m;return!(msg.stopReason==="aborted"&&msg.content.length===0)});if(!lastAssistant)return;let text2="";for(let content of lastAssistant.content)content.type==="text"&&(text2+=content.text);return text2.trim()||void 0}createReplacedSessionContext(){let context=Object.defineProperties({},Object.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()));return context.sendMessage=(message,options)=>this.sendCustomMessage(message,options),context.sendUserMessage=(content,options)=>this.sendUserMessage(content,options),context}hasExtensionHandlers(eventType){return this._extensionRunner.hasHandlers(eventType)}get extensionRunner(){return this._extensionRunner}};function messageFingerprint(message){if(message===void 0)return"";let content=message.content,size=0;if(typeof content=="string")size=content.length;else if(Array.isArray(content))for(let part of content)size+=1,typeof part.text=="string"&&(size+=part.text.length),typeof part.thinking=="string"&&(size+=part.thinking.length);let usage3=message.usage;return`${size}:${usage3?.input??""}:${usage3?.output??""}:${usage3?.totalTokens??""}`}function detectMiss(prev,message,models){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!prev||promptTokens<=0||usage3.cacheRead+usage3.cacheWrite===0&&!prev.reportedCache)return;let missedTokens=Math.min(prev.promptTokens,promptTokens)-usage3.cacheRead;if(missedTokens<=1024)return;let paidTokens=usage3.input+usage3.cacheWrite,paidPerToken=paidTokens>0?(usage3.cost.input+usage3.cost.cacheWrite)/paidTokens:0,readPerToken=usage3.cacheRead>0?usage3.cost.cacheRead/usage3.cacheRead:(models.getModel(message.provider,message.model)?.cost.cacheRead??0)/1e6;return{missedTokens,missedCost:missedTokens*Math.max(0,paidPerToken-readPerToken),idleMs:Math.max(0,message.timestamp-prev.timestamp),modelChanged:`${message.provider}/${message.model}`!==prev.modelKey}}function asPreviousRequest(message,reportedCache){let usage3=message.usage,promptTokens=usage3.input+usage3.cacheRead+usage3.cacheWrite;if(!(promptTokens<=0))return{promptTokens,modelKey:`${message.provider}/${message.model}`,timestamp:message.timestamp,reportedCache:reportedCache||usage3.cacheRead+usage3.cacheWrite>0}}function scan(entries,models){let prev,totals2={missedTokens:0,missedCost:0,missCount:0},misses=new Map;for(let entry of entries){if(entry.type==="compaction"||entry.type==="branch_summary"){prev=void 0;continue}if(entry.type==="usage"&&entry.kind==="cache_warm"){let promptTokens=entry.usage.input+entry.usage.cacheRead+entry.usage.cacheWrite;promptTokens>0&&(prev={promptTokens,modelKey:`${entry.provider}/${entry.model}`,timestamp:Date.parse(entry.timestamp),reportedCache:!0})}else if(entry.type==="message"&&entry.message.role==="assistant"){let miss=detectMiss(prev,entry.message,models);miss&&(totals2.missedTokens+=miss.missedTokens,totals2.missedCost+=miss.missedCost,totals2.missCount+=1,misses.set(entry.message,miss)),prev=asPreviousRequest(entry.message,prev?.reportedCache??!1)??prev}}return{prev,totals:totals2,misses}}function computeCacheWaste(entries,models){return scan(entries,models).totals}function collectCacheMisses(entries,models){return scan(entries,models).misses}function detectCacheMiss(entries,message,models){return detectMiss(scan(entries,models).prev,message,models)}function brandSource(brand){let configured=brand.changelog;return configured?{id:brand.name.toLowerCase(),path:configured.path,version:configured.version,rewriteLinks:!1}:{id:brand.name.toLowerCase(),path:getChangelogPath(),version:void 0,rewriteLinks:!1}}function resolveChangelogSource(){return BRAND?brandSource(BRAND):{id:"engine",path:getChangelogPath(),version:VERSION,rewriteLinks:!0}}var MAX_AGE=10080*60*1e3;function normalizeStackPath(value2){return value2.replace(/\\/g,"/").replace(/\/+$/u,"")}function stackContainsPath(stack,targetPath,includeDescendants){let target=normalizeStackPath(targetPath);if(!target||isSyntheticPath(target))return!1;let caseInsensitive=/^[a-z]:\//iu.test(target),haystack=caseInsensitive?stack.toLowerCase():stack,needle=caseInsensitive?target.toLowerCase():target;if(includeDescendants)return haystack.includes(`${needle}/`);let index=haystack.indexOf(needle);for(;index!==-1;){let next=haystack[index+needle.length];if(next===void 0||next===":"||next===")"||/\s/u.test(next))return!0;index=haystack.indexOf(needle,index+needle.length)}return!1}function findExtensionStackMatches(stack,extensions){if(!stack)return[];let normalizedStack=stack.split(`
@@ -2588,7 +2588,7 @@ ${codeSpan(styledWarning)}
2588
2588
  `)}function getScopeAutocompleteTag(scope){switch(scope){case"user":return"u";case"project":return"p";case"temporary":return"t";case"system":return"s";default:return assertNever5(scope)}}function getDisplaySourceInfo(sourceInfo){let source2=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";return scope==="system"?{label:"system",color:"muted"}:source2==="local"?scope==="user"?{label:"user",color:"muted"}:scope==="project"?{label:"project",color:"muted"}:{label:"path",scopeLabel:"temp",color:"muted"}:source2==="cli"?{label:"path",scopeLabel:scope==="temporary"?"temp":void 0,color:"muted"}:{label:source2,scopeLabel:scope==="user"?"user":scope==="project"?"project":"temp",color:"accent"}}function assertNever5(value2){throw new Error(`Unexpected resource scope: ${String(value2)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage7(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage7(error2);return error2 instanceof CredentialSynchronizationError?{level:"error",message:`${method==="oauth"?`Logged in to ${providerName}`:`Saved API key for ${providerName}`}, but local model state could not be synchronized: ${message}`}:{level:"error",message:`${method==="oauth"?`Failed to login to ${providerName}`:`Failed to save API key for ${providerName}`}: ${message}`}}function errorMessage7(error2){return error2 instanceof Error?error2.message:String(error2)}var envelope=external_exports.object({type:external_exports.literal("error").optional(),error:external_exports.object({type:external_exports.string(),message:external_exports.string()})}),networkFailure=/network error|service unavailable|connection (?:error|lost|reset)|fetch failed|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|socket hang up|overloaded/i,otherFailure=/auth|api.?key|permission|quota|credit|billing|rate.?limit|too many requests|429/i;function isNetworkProviderError(raw,envelopeOnly=!1){if(!raw||otherFailure.test(raw))return!1;if(!envelopeOnly)return networkFailure.test(raw);try{let parsed=envelope.safeParse(JSON.parse(raw));return parsed.success&&networkFailure.test(parsed.data.error.message)}catch(error2){if(error2 instanceof SyntaxError)return!1;throw error2}}function isRetryableProviderError(raw){return raw?isNetworkProviderError(raw)?!0:isRetryableErrorMessage(raw):!1}function isNetworkProviderMessage(message){return(message.stopReason==="error"||message.stopReason==="aborted")&&isNetworkProviderError(message.errorMessage)}var ProviderFailureNotice=class{constructor(){this.details=new Set,this.expanded=!1,this.summary="The model provider may be having trouble."}add(raw){this.details.add(raw)}setExpanded(expanded){this.expanded=expanded}setSummary(summary){this.summary=summary}render(width){let lines=[];if(this.summary&&lines.push(...new Text(theme.fg("warning",`${this.summary} (${keyText("app.tools.expand")} for details)`),1,0).render(width)),this.expanded)for(let raw of this.details)lines.push(...new Text(theme.fg("dim",sanitizeTuiErrorMessage(raw)),1,0).render(width));return lines}invalidate(){}},ProviderErrorPresentation=class{constructor(chat){this.pending=!1,this.retryAwaitingFinish=!1,this.chat=chat}record(raw,expanded=!1){this.pending=!0,this.retryAwaitingFinish=!0,this.notice||(this.notice=new ProviderFailureNotice,this.notice.setExpanded(expanded),this.chat.addChild(this.notice)),this.notice.add(raw)}retrying(raw,expanded){this.record(raw,expanded),this.notice?.setSummary(void 0)}clear(){this.pending=!1,this.retryAwaitingFinish=!1,this.notice?.setSummary(void 0)}clearTransient(){this.pending=!1,this.notice?.setSummary(void 0)}get hasActiveRetry(){return this.pending}get awaitingRetryFinish(){return this.retryAwaitingFinish}finish(raw,attempts){if(raw&&this.record(raw),!this.pending)return;this.pending=!1,this.retryAwaitingFinish=!1;let count=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count}. Try again or choose another model with /model.`)}newTurn(){this.finish(),this.notice=void 0}};function replayAssistantTools(message,host){let firstToolIndex=message.content.findIndex(block=>block.type==="toolCall");if(host.addMessage(firstToolIndex<0?message:{...message,content:message.content.slice(0,firstToolIndex+1)}),firstToolIndex<0)return;let index=firstToolIndex;for(;index<message.content.length;){let content=message.content[index];if(content.type!=="toolCall"){let start=index;for(;index<message.content.length&&message.content[index].type!=="toolCall";)index++;host.addMessage({...message,content:message.content.slice(start,index)});continue}index++;let component=host.createTool(content.name,content.id,content.arguments);if(component.setExpanded(host.expanded),host.addChild(component),message.stopReason==="aborted"||message.stopReason==="error"){let errorMessage8=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0})}else host.pending.set(content.id,component)}}function sharedSessionDir(source2){return source2.usesDefaultSessionDir()?{}:{sessionDir:source2.getSessionDir()}}function currentScopeSessions(source2,onProgress,signal){let cwd=source2.getCwd();return withMovedSessions(SessionManager.list(cwd,source2.getSessionDir(),onProgress,signal),cwd,sharedSessionDir(source2))}async function allScopeSessions(source2,onProgress,signal){let sessions2=source2.usesDefaultSessionDir()?await SessionManager.listAll(onProgress,signal):await SessionManager.listAll(source2.getSessionDir(),onProgress,signal);return markMovedSessions(sessions2,source2.getCwd())}async function chooseResumePath(sessionPath,source2,ui){let cwd=source2.getCwd();try{return(await resolveResumeTarget({sessionPath,cwd,...sharedSessionDir(source2),confirm:sessionCwd=>ui.confirm(REBIND_PROMPT,`Session found in different project: ${sessionCwd}
2589
2589
  This directory is the same git repository: ${cwd}
2590
2590
  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 existsSync50,mkdirSync as mkdirSync28,readFileSync as readFileSync51,realpathSync as realpathSync10,writeFileSync as writeFileSync25}from"node:fs";import{join as join89}from"node:path";var SKIP_RUNTIME_NOTICE_ENV_SUFFIX="SKIP_RUNTIME_NOTICE";function runtimePinEnvName(env){return env.OMO_NATIVE==="1"?"OMO_RUNTIME":RUNTIME_ENV_VAR}function runtimeNoticeSkipReason(gate){if(gate.versions.bun!==void 0)return"bun-runtime";if(gate.env[runtimePinEnvName(gate.env)]==="node")return"node-pinned";if(gate.hasInheritedInspectorOption)return"inspector";if(gate.skipRequested)return"skip-requested";if(gate.shownVersion===gate.engineVersion)return"already-shown"}function reinstallTarget(brand,packageName){if(brand===void 0)return{packageName,installSpec:packageName,ignoreScripts:!0};let update=brand.update;if(update===void 0)return;let installSpec=update.distTag==="latest"?update.packageName:`${update.packageName}@${update.distTag}`;return{packageName:update.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync51(join89(agentDir,RUNTIME_NOTICE_STATE_FILE),"utf8"))}catch{return}if(!(typeof parsed!="object"||parsed===null||!("shownVersion"in parsed)))return typeof parsed.shownVersion=="string"?parsed.shownVersion:void 0}function recordShownVersion(agentDir,version){try{mkdirSync28(agentDir,{recursive:!0}),writeFileSync25(join89(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
2591
- `)}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(existsSync50,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-THEF3K7M.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=`
2591
+ `)}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(existsSync50,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-DOIW7IBF.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=`
2592
2592
  ${theme.bold("Failures")}
2593
2593
  `;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
2594
2594
  `,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
@@ -2607,7 +2607,7 @@ ${compactOnboarding()}
2607
2607
  ${onboarding()}`,()=>`${logo()}
2608
2608
  ${expandedInstructions()}
2609
2609
 
2610
- ${onboarding()}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.headerContainer,this.builtInHeader,tipLine)}else this.builtInHeader=new Text("",0,0),this.headerContainer.addChild(this.builtInHeader);this.ui.requestRender();let[fdPath]=await Promise.all([ensureTool("fd",status=>this.showManagedToolStatus(status)),ensureTool("rg",status=>this.showManagedToolStatus(status))]);this.fdPath=fdPath,time("ensureTools","tui"),this.setupKeyHandlers(),this.setupEditorSubmitHandler(),this.sessionControlHost?.attachEditor(this.defaultEditor,()=>this.composerHold()!==void 0),this.ui.requestRender(),time("keyHandlers","tui"),await this.rebindCurrentSession(),time("rebindSession","tui"),this.renderInitialMessages(),this.session.releaseSettledSessionMemory(),time("renderInitial","tui"),onThemeChange(()=>{this.ui.invalidate(),this.updateEditorBorderColor(),this.ui.requestRender()}),this.footerDataProvider.onBranchChange(()=>{this.ui.requestRender()}),this.updateAvailableProviderCount()}getNormalTerminalTitle(){let cwdBasename=path14.basename(this.sessionManager.getCwd()),sessionName2=this.sessionManager.getSessionName();return sessionName2?`${APP_TITLE} - ${sessionName2} - ${cwdBasename}`:`${APP_TITLE} - ${cwdBasename}`}applyTerminalTitle(){let questionHeader=this.shownQuestion?.request.questions[0]?.header??this.blockingQuestionHeader;this.ui.terminal.setTitle(this.activeToolTerminalTitle??this.activeToolExecutionTerminalTitle??(questionHeader===void 0?void 0:`? ${questionHeader}`)??this.extensionTerminalTitle??this.getNormalTerminalTitle())}updateTerminalTitle(){this.applyTerminalTitle()}async run(){if(await this.init(),!envValue("OFFLINE")){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);refreshModelCatalogs(this.session.modelRuntime,controller.signal).then(()=>{this.updateAvailableProviderCount(),this.ui.requestRender()}).catch(()=>{}).finally(()=>clearTimeout(timeout))}checkForNewPiVersion(this.version).then(newVersion=>{newVersion&&this.showNewVersionNotification(newVersion.version)}),this.checkForPackageUpdates().then(updates=>{updates.length>0&&this.showPackageUpdateNotification(updates)}).finally(()=>{process.platform==="win32"&&this.isInitialized&&this.updateTerminalTitle()}),this.checkTmuxSetup().then(warning=>{warning&&this.showWarning(warning)});let{migratedProviders,legacyPiEditNotice,startupDiagnostics,modelFallbackMessage,initialMessage,initialImages,initialMessages,initialTitlePrompt}=this.options;migratedProviders&&migratedProviders.length>0&&this.showWarning(`Migrated credentials to auth.json: ${migratedProviders.join(", ")}`),legacyPiEditNotice&&this.showWarning(legacyPiEditNotice);for(let diagnostic2 of startupDiagnostics??[])diagnostic2.type==="warning"?this.showWarning(diagnostic2.message):diagnostic2.type==="error"&&this.showError(diagnostic2.message);let modelsJsonError=this.session.modelRuntime.getError();modelsJsonError&&this.showError(`models.json error: ${modelsJsonError}`);let modelRuntimeWarnings=this.session.modelRuntime.getWarnings(),getQuietStartup=this.settingsManager?.getQuietStartup?.bind(this.settingsManager),quietStartup=getQuietStartup?getQuietStartup():!1;if(showsStartupDetails(this.options.verbose,quietStartup))for(let warning of modelRuntimeWarnings)this.showWarning(warning);else modelRuntimeWarnings.length===1?this.showWarning(modelRuntimeWarnings[0]):modelRuntimeWarnings.length>1&&this.showNoticeBox({title:`${modelRuntimeWarnings.length} model warnings`,tone:"warning",why:modelRuntimeWarnings[0],extra:modelRuntimeWarnings.slice(1).map(text2=>({text:text2}))});modelFallbackMessage&&(this.showWarning(modelFallbackMessage),modelFallbackMessage===formatNoModelsAvailableMessage()&&(this.startupProviderGuidanceShown=!0));for(let warning of this.session.fallbackValidationWarnings)this.showWarning(warning);if(this.showRiskyMainModelWarning(this.session.model),this.maybeWarnAboutAnthropicSubscriptionAuth(),maybeShowRuntimeNotice(spec2=>this.showNoticeBox(spec2)),initialMessage)try{await this.session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:initialTitlePrompt??!1})}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}if(initialMessages)for(let message of initialMessages)try{await this.session.prompt(message)}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}for(;;){let userInput=await this.getUserInput();try{await this.session.prompt(userInput.text,this.buildMainLoopPromptOptions(userInput))}catch(error2){if(this.optimisticUserEchoes.reject(userInput.pendingEchoId),this.clearStatusIndicator("working"),error2 instanceof UnknownCommandError&&this.reportUnknownCommandRejection(error2,userInput.text))continue;let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}finally{userInput.ticket?.release()}}}async checkForPackageUpdates(){return[]}async checkTmuxSetup(){return this.checkTmuxKeyboardSetup()}async checkTmuxKeyboardSetup(){if(!process.env.TMUX)return;let runTmux=args=>new Promise(resolve46=>{let proc=spawn12("tmux",args,{stdio:["ignore","pipe","ignore"]}),stdout="",timer=setTimeout(()=>{proc.kill(),resolve46(void 0)},2e3);proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.on("error",()=>{clearTimeout(timer),resolve46(void 0)}),proc.on("close",code=>{clearTimeout(timer),resolve46(code===0?stdout.trim():void 0)})}),[extendedKeys,extendedKeysFormat,clientTermname,allowPassthrough,focusEvents,version]=await Promise.all([runTmux(["show","-gv","extended-keys"]),runTmux(["show","-gv","extended-keys-format"]),runTmux(["display-message","-p","#{client_termname}"]),runTmux(["show","-gv","allow-passthrough"]),runTmux(["show","-gv","focus-events"]),runTmux(["display-message","-p","#{version}"])]);if(extendedKeys!==void 0)return buildTmuxSetupWarning({extendedKeys,extendedKeysFormat,imagesEnabled:getCapabilities().tmuxPassthrough===!0,outerKittyCapable:outerKittyGraphicsMode(clientTermname??"")!==null,allowPassthrough,focusEvents,version})}getChangelogForDisplay(){if(this.session.state.messages.length>0)return;let source2=resolveChangelogSource();if(!source2.version)return;let lastVersion=this.settingsManager.getChangelogSeen(source2.id),changelogPath=source2.path,entries=parseChangelog(changelogPath);if(!lastVersion){this.settingsManager.setChangelogSeen(source2.id,source2.version),this.reportInstallTelemetry(source2.version);return}let newEntries=getNewEntries(entries,lastVersion,source2.version);if(newEntries.length>0)return this.settingsManager.setChangelogSeen(source2.id,source2.version),this.reportInstallTelemetry(source2.version),newEntries.map(e=>source2.rewriteLinks?normalizeChangelogLinks(e.content,e):e.content).join(`
2610
+ ${onboarding()}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.headerContainer,this.builtInHeader,tipLine)}else this.builtInHeader=new Text("",0,0),this.headerContainer.addChild(this.builtInHeader);this.ui.requestRender();let[fdPath]=await Promise.all([ensureTool("fd",status=>this.showManagedToolStatus(status)),ensureTool("rg",status=>this.showManagedToolStatus(status))]);this.fdPath=fdPath,time("ensureTools","tui"),this.setupKeyHandlers(),this.setupEditorSubmitHandler(),this.sessionControlHost?.attachEditor(this.defaultEditor,()=>this.composerHold()!==void 0),this.ui.requestRender(),time("keyHandlers","tui"),await this.rebindCurrentSession(),time("rebindSession","tui"),this.renderInitialMessages(),this.session.releaseSettledSessionMemory(),time("renderInitial","tui"),onThemeChange(()=>{this.ui.invalidate(),this.updateEditorBorderColor(),this.ui.requestRender()}),this.footerDataProvider.onBranchChange(()=>{this.ui.requestRender()}),this.updateAvailableProviderCount()}getNormalTerminalTitle(){let cwdBasename=path14.basename(this.sessionManager.getCwd()),sessionName2=this.sessionManager.getSessionName();return sessionName2?`${APP_TITLE} - ${sessionName2} - ${cwdBasename}`:`${APP_TITLE} - ${cwdBasename}`}applyTerminalTitle(){let questionHeader=this.shownQuestion?.request.questions[0]?.header??this.blockingQuestionHeader;this.ui.terminal.setTitle(this.activeToolTerminalTitle??this.activeToolExecutionTerminalTitle??(questionHeader===void 0?void 0:`? ${questionHeader}`)??this.extensionTerminalTitle??this.getNormalTerminalTitle())}updateTerminalTitle(){this.applyTerminalTitle()}async run(){if(await this.init(),!envValue("OFFLINE")){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);refreshModelCatalogs(this.session.modelRuntime,controller.signal).then(()=>{this.updateAvailableProviderCount(),this.ui.requestRender()}).catch(()=>{}).finally(()=>clearTimeout(timeout))}checkForNewPiVersion(this.version).then(newVersion=>{newVersion&&this.showNewVersionNotification(newVersion.version)}),this.checkForPackageUpdates().then(updates=>{updates.length>0&&this.showPackageUpdateNotification(updates)}).finally(()=>{process.platform==="win32"&&this.isInitialized&&this.updateTerminalTitle()}),this.checkTmuxSetup().then(warning=>{warning&&this.showWarning(warning)});let{migratedProviders,legacyPiEditNotice,startupDiagnostics,modelFallbackMessage,initialMessage,initialImages,initialMessages,initialTitlePrompt}=this.options;migratedProviders&&migratedProviders.length>0&&this.showWarning(`Migrated credentials to auth.json: ${migratedProviders.join(", ")}`),legacyPiEditNotice&&this.showWarning(legacyPiEditNotice);for(let diagnostic2 of startupDiagnostics??[])diagnostic2.type==="warning"?this.showWarning(diagnostic2.message):diagnostic2.type==="error"&&this.showError(diagnostic2.message);let modelsJsonError=this.session.modelRuntime.getError();modelsJsonError&&this.showError(`models.json error: ${modelsJsonError}`);let modelRuntimeWarnings=this.session.modelRuntime.getWarnings(),getQuietStartup=this.settingsManager?.getQuietStartup?.bind(this.settingsManager),quietStartup=getQuietStartup?getQuietStartup():!1;if(showsStartupDetails(this.options.verbose,quietStartup))for(let warning of modelRuntimeWarnings)this.showWarning(warning);else modelRuntimeWarnings.length===1?this.showWarning(modelRuntimeWarnings[0]):modelRuntimeWarnings.length>1&&this.showNoticeBox({title:`${modelRuntimeWarnings.length} model warnings`,tone:"warning",why:modelRuntimeWarnings[0],extra:modelRuntimeWarnings.slice(1).map(text2=>({text:text2}))});modelFallbackMessage&&(this.showWarning(modelFallbackMessage),modelFallbackMessage===formatNoModelsAvailableMessage()&&(this.startupProviderGuidanceShown=!0));for(let warning of this.session.fallbackValidationWarnings)this.showWarning(warning);let startupThinkingClamp=this.session.startupThinkingClamp;if(startupThinkingClamp&&this.showWarning(formatThinkingClampWarning(startupThinkingClamp)),this.showRiskyMainModelWarning(this.session.model),this.maybeWarnAboutAnthropicSubscriptionAuth(),maybeShowRuntimeNotice(spec2=>this.showNoticeBox(spec2)),initialMessage)try{await this.session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:initialTitlePrompt??!1})}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}if(initialMessages)for(let message of initialMessages)try{await this.session.prompt(message)}catch(error2){let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}for(;;){let userInput=await this.getUserInput();try{await this.session.prompt(userInput.text,this.buildMainLoopPromptOptions(userInput))}catch(error2){if(this.optimisticUserEchoes.reject(userInput.pendingEchoId),this.clearStatusIndicator("working"),error2 instanceof UnknownCommandError&&this.reportUnknownCommandRejection(error2,userInput.text))continue;let errorMessage8=error2 instanceof Error?error2.message:"Unknown error occurred";this.showError(errorMessage8)}finally{userInput.ticket?.release()}}}async checkForPackageUpdates(){return[]}async checkTmuxSetup(){return this.checkTmuxKeyboardSetup()}async checkTmuxKeyboardSetup(){if(!process.env.TMUX)return;let runTmux=args=>new Promise(resolve46=>{let proc=spawn12("tmux",args,{stdio:["ignore","pipe","ignore"]}),stdout="",timer=setTimeout(()=>{proc.kill(),resolve46(void 0)},2e3);proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.on("error",()=>{clearTimeout(timer),resolve46(void 0)}),proc.on("close",code=>{clearTimeout(timer),resolve46(code===0?stdout.trim():void 0)})}),[extendedKeys,extendedKeysFormat,clientTermname,allowPassthrough,focusEvents,version]=await Promise.all([runTmux(["show","-gv","extended-keys"]),runTmux(["show","-gv","extended-keys-format"]),runTmux(["display-message","-p","#{client_termname}"]),runTmux(["show","-gv","allow-passthrough"]),runTmux(["show","-gv","focus-events"]),runTmux(["display-message","-p","#{version}"])]);if(extendedKeys!==void 0)return buildTmuxSetupWarning({extendedKeys,extendedKeysFormat,imagesEnabled:getCapabilities().tmuxPassthrough===!0,outerKittyCapable:outerKittyGraphicsMode(clientTermname??"")!==null,allowPassthrough,focusEvents,version})}getChangelogForDisplay(){if(this.session.state.messages.length>0)return;let source2=resolveChangelogSource();if(!source2.version)return;let lastVersion=this.settingsManager.getChangelogSeen(source2.id),changelogPath=source2.path,entries=parseChangelog(changelogPath);if(!lastVersion){this.settingsManager.setChangelogSeen(source2.id,source2.version),this.reportInstallTelemetry(source2.version);return}let newEntries=getNewEntries(entries,lastVersion,source2.version);if(newEntries.length>0)return this.settingsManager.setChangelogSeen(source2.id,source2.version),this.reportInstallTelemetry(source2.version),newEntries.map(e=>source2.rewriteLinks?normalizeChangelogLinks(e.content,e):e.content).join(`
2611
2611
 
2612
2612
  `)}reportInstallTelemetry(version){BRAND||envValue("OFFLINE")||isInstallTelemetryEnabled(this.settingsManager)&&fetch(`https://pi.dev/api/report-install?version=${encodeURIComponent(version)}`,{headers:{"User-Agent":getPiUserAgent(version)},signal:AbortSignal.timeout(5e3)}).then(()=>{}).catch(()=>{})}getMarkdownThemeWithSettings(){return{...getMarkdownTheme(),codeBlockIndent:this.settingsManager.getCodeBlockIndent()}}getBuiltinExtensionDisplayName(extensionId){return extensionId==="todowrite"?"todo":extensionId}getBuiltinExtensionNameFromPath(p){let builtinMatch=p.match(/^<builtin:([^>]+)>$/);if(builtinMatch)return this.getBuiltinExtensionDisplayName(builtinMatch[1])}formatDisplayPath(p){let builtinName=this.getBuiltinExtensionNameFromPath(p);if(builtinName)return`builtin/${builtinName}`;let home=os7.homedir(),result3=p;return result3.startsWith(home)&&(result3=`~${result3.slice(home.length)}`),result3}formatExtensionDisplayPath(path15){let result3=this.formatDisplayPath(path15);return result3=result3.replace(/\/index\.ts$/,"").replace(/\/index\.js$/,""),result3}formatContextPath(p){let cwd=path14.resolve(this.sessionManager.getCwd()),absolutePath=path14.isAbsolute(p)?path14.resolve(p):path14.resolve(cwd,p),relativePath=getCwdRelativePath(absolutePath,cwd);return relativePath!==void 0?relativePath:this.formatDisplayPath(absolutePath)}getStartupExpansionState(){return this.options.verbose||this.toolOutputExpanded}async handleKeybindingsCommand(){let configPath=path14.join(getAgentDir(),"keybindings.json"),editorCommand=process.env.VISUAL||process.env.EDITOR;if(!editorCommand){this.showError(`Set $EDITOR or $VISUAL to edit ${configPath}.`);return}let seeded=seedKeybindingsFile(configPath,this.keybindings),edit=await editFileInExternalEditor({command:editorCommand,path:configPath});if(edit.status==="launch-failed"){seeded&&fs6.rmSync(configPath,{force:!0}),this.showError(`Could not open ${configPath} with "${editorCommand}".`);return}if(edit.status==="exited"){this.showError(`"${editorCommand}" exited with code ${edit.code}; keybindings were not reloaded.`);return}let applied=applyKeybindingsFileEdit(configPath,this.keybindings);if(applied.status==="invalid"){this.showError(`Keybindings not reloaded - ${configPath} is not valid JSON: ${applied.message}`);return}this.showStatus("Keybindings reloaded")}updateShortcutOverlay(nextText){let previousText=this.lastEditorText;this.lastEditorText=nextText;let inputKind=classifyEditorInput(previousText,nextText,this.lastInputWasPaste);if(this.lastInputWasPaste=!1,shouldShowShortcutOverlay(previousText,nextText,inputKind)){this.shortcutOverlay||(this.shortcutOverlay=new ShortcutOverlay,this.headerContainer.addChild(this.shortcutOverlay),this.ui.requestRender());return}this.hideShortcutOverlay()}hideShortcutOverlay(){this.shortcutOverlay&&(this.headerContainer.removeChild(this.shortcutOverlay),this.shortcutOverlay=void 0,this.ui.requestRender())}recordShownTip(tipId){this.sessionShownTipIds.add(tipId);let next=recordTipShown(this.settingsManager.getTipsHistory(),tipId,Date.now());this.settingsManager.setTipShown(tipId,next[tipId]??Date.now())}getShortPath(fullPath,sourceInfo){let normalizedFullPath=fullPath.replace(/\\/g,"/"),baseDir=sourceInfo?.baseDir;if(baseDir&&this.isPackageSource(sourceInfo)){let normalizedBaseDir=baseDir.replace(/\\/g,"/"),npmRootMatch=normalizedBaseDir.match(/^(.*\/node_modules)\/(@?[^/]+(?:\/[^/]+)?)$/);if(npmRootMatch?.[1]&&normalizedFullPath.startsWith(`${npmRootMatch[1]}/`))return path14.posix.relative(normalizedBaseDir,normalizedFullPath);let relativePath=path14.relative(path14.resolve(baseDir),path14.resolve(fullPath));if(relativePath&&relativePath!=="."&&!relativePath.startsWith("..")&&!relativePath.startsWith(`..${path14.sep}`)&&!path14.isAbsolute(relativePath))return relativePath.replace(/\\/g,"/")}let source2=sourceInfo?.source??"",npmMatch=normalizedFullPath.match(/node_modules\/(@?[^/]+(?:\/[^/]+)?)\/(.*)/);if(npmMatch&&source2.startsWith("npm:"))return npmMatch[2];let gitMatch=normalizedFullPath.match(/git\/[^/]+\/[^/]+\/(.*)/);return gitMatch&&source2.startsWith("git:")?gitMatch[1]:this.formatDisplayPath(fullPath)}getCompactPathLabel(resourcePath,sourceInfo){let shortPath=this.getShortPath(resourcePath,sourceInfo),segments=shortPath.replace(/\\/g,"/").split("/").filter(segment2=>segment2.length>0&&segment2!=="~");return segments.length>0?segments[segments.length-1]:shortPath}getCompactPackageSourceLabel(sourceInfo){let source2=sourceInfo?.source??"";if(source2.startsWith("npm:"))return source2.slice(4)||source2;let gitSource=parseGitUrl(source2);return gitSource&&gitSource.path||source2}getCompactExtensionLabel(resourcePath,sourceInfo){if(!this.isPackageSource(sourceInfo))return this.getCompactPathLabel(resourcePath,sourceInfo);let sourceLabel2=this.getCompactPackageSourceLabel(sourceInfo);if(!sourceLabel2)return this.getCompactPathLabel(resourcePath,sourceInfo);let shortPath=this.getShortPath(resourcePath,sourceInfo).replace(/\\/g,"/"),packagePath=shortPath.startsWith("extensions/")?shortPath.slice(11):shortPath,parsedPath=path14.posix.parse(packagePath);return parsedPath.name==="index"?!parsedPath.dir||parsedPath.dir==="."?sourceLabel2:`${sourceLabel2}:${parsedPath.dir}`:`${sourceLabel2}:${packagePath}`}getCompactDisplayPathSegments(resourcePath){return this.formatDisplayPath(resourcePath).replace(/\\/g,"/").split("/").filter(segment2=>segment2.length>0&&segment2!=="~")}getCompactNonPackageExtensionLabel(resourcePath,index,allPaths){let segments=allPaths[index]?.segments;if(!segments||segments.length===0)return this.getCompactPathLabel(resourcePath);for(let segmentCount=1;segmentCount<=segments.length;segmentCount+=1){let candidate=segments.slice(-segmentCount).join("/");if(allPaths.every((item,itemIndex)=>itemIndex===index?!0:item.segments.slice(-segmentCount).join("/")!==candidate))return candidate}return segments.join("/")}getCompactExtensionLabels(extensions){let nonPackageExtensions=extensions.map(extension=>{let segments=this.getCompactDisplayPathSegments(extension.path),lastSegment=segments[segments.length-1];return segments.length>1&&(lastSegment==="index.ts"||lastSegment==="index.js")&&segments.pop(),{path:extension.path,sourceInfo:extension.sourceInfo,segments}}).filter(extension=>!this.isPackageSource(extension.sourceInfo));return extensions.map(extension=>{if(this.isPackageSource(extension.sourceInfo))return this.getCompactExtensionLabel(extension.path,extension.sourceInfo);let nonPackageIndex=nonPackageExtensions.findIndex(item=>item.path===extension.path);return nonPackageIndex===-1?this.getCompactPathLabel(extension.path,extension.sourceInfo):this.getCompactNonPackageExtensionLabel(extension.path,nonPackageIndex,nonPackageExtensions)})}getDisplaySourceInfo(sourceInfo){return getDisplaySourceInfo(sourceInfo)}isPackageSource(sourceInfo){return isPackageSourceInfo(sourceInfo)}buildScopeGroups(items){return buildResourceScopeGroups(items)}formatScopeGroups(groups,options){return formatResourceScopeGroups(groups,options)}findSourceInfoForPath(p,sourceInfos){let exact=sourceInfos.get(p);if(exact)return exact;let current=p;for(;current.includes("/");){current=current.substring(0,current.lastIndexOf("/"));let parent=sourceInfos.get(current);if(parent)return parent}}formatPathWithSource(p,sourceInfo){if(sourceInfo){let shortPath=this.getShortPath(p,sourceInfo),{label:label3,scopeLabel}=this.getDisplaySourceInfo(sourceInfo);return`${scopeLabel?`${label3} (${scopeLabel})`:label3} ${shortPath}`}return this.formatDisplayPath(p)}formatDiagnostics(diagnostics,sourceInfos){let lines=[],collisions=new Map,otherDiagnostics=[];for(let d of diagnostics)if(d.type==="collision"&&d.collision){let list4=collisions.get(d.collision.name)??[];list4.push(d),collisions.set(d.collision.name,list4)}else otherDiagnostics.push(d);for(let[name,collisionList]of collisions){let first=collisionList[0]?.collision;if(first){lines.push({text:` "${name}" collision:`,tone:"warning"}),lines.push({text:` \u2713 ${this.formatPathWithSource(first.winnerPath,this.findSourceInfoForPath(first.winnerPath,sourceInfos))}`,tone:"warning"});for(let d of collisionList)d.collision&&lines.push({text:` \u2717 ${this.formatPathWithSource(d.collision.loserPath,this.findSourceInfoForPath(d.collision.loserPath,sourceInfos))} (skipped)`,tone:"warning"})}}for(let d of otherDiagnostics){let tone=d.type==="error"?"error":"warning";if(d.path){let formattedPath=this.formatPathWithSource(d.path,this.findSourceInfoForPath(d.path,sourceInfos));lines.push({text:` ${formattedPath}`,tone}),lines.push({text:` ${d.message}`,tone})}else lines.push({text:` ${d.message}`,tone})}return lines}showLoadedResources(options){this.loadedResourcesContainer.clear();let showListing=options?.force||showsStartupDetails(this.options.verbose,this.settingsManager.getQuietStartup()),showDiagnostics=showListing||options?.showDiagnosticsWhenQuiet===!0;if(!showListing&&!showDiagnostics)return;let sectionHeader=(name,color="mdHeading")=>theme.fg(color,`[${name}]`),formatCompactList=(items,options2)=>{let labels=items.map(item=>item.trim()).filter(item=>item.length>0);if(labels.length===0)return"";options2?.sort!==!1&&labels.sort((a,b)=>a.localeCompare(b));let shown=labels.length<=8?labels:labels.slice(0,3),hidden=labels.length-shown.length,more=hidden>0?theme.fg("muted",` +${hidden} more (${keyText("app.tools.expand")})`):"";return theme.fg("dim",` ${shown.join(", ")}`)+more},addLoadedSection=(name,collapsedBody,expandedBody=collapsedBody,color="mdHeading")=>{let section=new LoadedResourceSection(()=>{let body=collapsedBody();return body.length===0?"":`${sectionHeader(name,color)}
2613
2613
  ${body}`},()=>`${sectionHeader(name,color)}
@@ -2617,7 +2617,7 @@ ${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){
2617
2617
  `).slice(1);if(stackLines.length>0){let renderStack=()=>stackLines.map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
2618
2618
  `);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(`
2619
2619
  `),cursor=this.editor.getCursor?.(),currentLine=cursor?this.editor.getText().split(`
2620
- `)[cursor.line]??"":"",characterBeforeCursor=cursor&&cursor.col>0?currentLine[cursor.col-1]:"",characterAfterCursor=cursor?currentLine[cursor.col]:"",leadingSpace=characterBeforeCursor&&!/\s/.test(characterBeforeCursor)?" ":"",trailingSpace=characterAfterCursor&&!/\s/.test(characterAfterCursor)?" ":"";this.editor.insertTextAtCursor?.(`${leadingSpace}${paths}${trailingSpace}`),this.ui.requestRender();return}let image=await readClipboardImage();if(image&&await attachClipboardImage({editor:this.editor,pendingImages:this.pendingImages,settings:this.settingsManager,isCompacting:()=>this.session?.isCompacting===!0,showStatus:message=>this.showStatus(message),requestRender:()=>this.ui.requestRender()},image))return;let text2=await readClipboardText();text2&&(this.editor.insertTextAtCursor?.(text2),this.ui.requestRender())}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.getSessionLogger?.().warn("clipboard_error",{op:"paste",error:message}),this.showStatus?.(`Clipboard paste failed: ${sanitizeTuiErrorMessage(message)}`)}}subscribeImageMarkers(editor){editor.insertImageMarker&&(editor.onImageMarkersChanged=order=>this.reconcilePendingImages(order),editor.snapshotAttachmentState=()=>new Map(this.pendingImages),editor.restoreAttachmentState=state=>{if(state instanceof Map){this.pendingImages.clear();for(let[key,image]of state)this.pendingImages.set(key,image)}})}reconcilePendingImages(order){if(this.pendingImages.size===0)return;let reconciled=new Map;order.forEach((id,index)=>{let image=this.pendingImages.get(id);image&&reconciled.set(index+1,image)}),this.pendingImages.clear();for(let[key,image]of reconciled)this.pendingImages.set(key,image)}takeSubmissionImages(submittedText){let images=[],consumed=new Set;for(let match of submittedText.matchAll(IMAGE_MARKER_PATTERN2)){let id=Number.parseInt(match[1]??"0",10);if(consumed.has(id))continue;consumed.add(id);let image=this.pendingImages.get(id);image&&images.push(image)}return this.pendingImages.clear(),images}getSessionLogger(){return this.sessionLogger??=createSessionLogger(this.runtimeHost.services.agentDir),this.sessionLogger}handleStartupSubmit(text2){if(text2.trim()==="/quit"||text2.trim()==="/exit"){this.editor.setText(""),this.shutdown();return}this.editor.setText(text2),this.showStatus("Startup is still in progress")}beginUserEcho(text2,images){if(!isManualContinueSubmission({text:text2,hasMessages:this.session.messages.length>0,hasImages:(images?.length??0)>0}))return this.optimisticUserEchoes.begin(text2)}setupEditorSubmitHandler(){this.defaultEditor.onSubmit=async(text2,details)=>{try{let preResolvedImages=this.preResolvedSubmissionImages;this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim();let unknownCommandAsText=_InteractiveMode.confirmsRefusedUnknownCommand(this,text2)||submitsCommandAsText(text2,details);if(!text2){this.expandPendingQuestion();return}if(!text2.startsWith("/")&&!text2.startsWith("!")&&this.submitAsyncQuestionComment(text2))return;if(text2==="/settings"){await this.showSettingsSelector(),this.editor.setText("");return}if(text2==="/favorite-models"){this.editor.setText(""),await this.showFavoriteModelsSelector();return}if(text2==="/scoped-models"){this.editor.setText(""),this.showScopedModelsSelector();return}if(text2==="/model"||text2.startsWith("/model ")){let searchTerm=text2.startsWith("/model ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleModelCommand(searchTerm);return}if(text2==="/thinking"||text2.startsWith("/thinking ")){let searchTerm=text2.startsWith("/thinking ")?text2.slice(10).trim():void 0;this.editor.setText(""),await this.handleThinkingCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText("");let hold=this.session.externalAdmission?.beginInput({command:!0});try{await this.handleAnswerCommand(text2.slice(7).trim())}finally{hold?.end()}return}if(text2==="/hotkeys"){this.handleHotkeysCommand(),this.editor.setText("");return}if(text2==="/fork"){await this.showUserMessageSelector(),this.editor.setText("");return}if(text2==="/clone"){this.editor.setText(""),await this.handleCloneCommand();return}if(text2==="/tree"){this.showTreeSelector(),this.editor.setText("");return}if(text2==="/trust"){this.showTrustSelector(),this.editor.setText("");return}if(text2==="/login"||text2.startsWith("/login ")){let providerRef=text2.startsWith("/login ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleLoginCommand(providerRef);return}if(text2==="/logout"){this.showOAuthSelector("logout"),this.editor.setText("");return}if(text2==="/new"){this.editor.setText(""),await this.handleClearCommand();return}if(text2==="/compact"||text2.startsWith("/compact ")){let customInstructions=text2.startsWith("/compact ")?text2.slice(9).trim():void 0;this.editor.setText(""),await this.handleCompactCommand(customInstructions);return}if(text2==="/reload"){this.editor.setText(""),await this.handleReloadCommand();return}if(text2==="/debug"){this.handleDebugCommand(),this.editor.setText("");return}if(text2==="/arminsayshi"){this.handleArminSaysHi(),this.editor.setText("");return}if(text2==="/dementedelves"){this.handleDementedDelves(),this.editor.setText("");return}if(text2==="/resume"||text2==="/sessions"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(isBareSkillNamespace(text2)){this.openSkillPickerForBareNamespace();return}if(this.isExtensionCommand(text2)){this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2);return}if(text2.startsWith("!")){let isExcluded2=text2.startsWith("!!"),command=isExcluded2?text2.slice(2).trim():text2.slice(1).trim();if(command){if(this.session.isBashRunning){this.showWarning("A bash command is already running. Press Esc to cancel it first."),this.editor.setText(text2);return}this.editor.addToHistory?.(text2),await this.handleBashCommand(command,isExcluded2),this.isBashMode=!1,this.updateEditorBorderColor();return}}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"steer",unknownCommandAsText);return}if(this.session.isStreaming){let ticket2=this.sessionControlHost?.claimHandoff(),images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2),echoOptions=this.optimisticUserEchoes.promptOptions(pendingEchoId2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...unknownCommandAsText?{unknownCommandAsText}:{},...echoOptions,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),ticket2?.release()}})}catch(error2){if(this.optimisticUserEchoes.reject(pendingEchoId2),error2 instanceof UnknownCommandError&&this.reportUnknownCommandRejection(error2,text2))return;throw error2}finally{ticket2?.release()}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),ticket=this.sessionControlHost?.claimHandoff(),submission={text:text2,pendingEchoId,...images.length>0?{images}:{},...unknownCommandAsText?{unknownCommandAsText}:{},...ticket?{ticket}:{}};this.onInputCallback?this.onInputCallback(submission):this.pendingUserInputs.push(submission),this.editor.addToHistory?.(text2)}catch(error2){if(typeof this.showError=="function")this.showError(error2 instanceof Error?error2.message:String(error2));else throw error2}}}subscribeToAgent(){this.unsubscribe=this.session.subscribe(async event=>{await this.handleEvent(event)})}async handleEvent(event){switch(this.isInitialized||await this.init(),this.footer.invalidate(),event.type){case"agent_start":this.agentIdle=!1,this.transcriptWriteNoticeShown=!1,this.clearPendingTools(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.turnWorkingTip.resetForNewTurn(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!0),this.pendingTools?.clear(),this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0);break;case"turn_start":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.workingVisible?this.showWorkingStatusIndicator():this.clearStatusIndicator(),this.ui.requestRender();break;case"queue_update":this.updatePendingMessagesDisplay(),this.ui.requestRender();break;case"system_prompt_change":this.showStatus(event.systemPromptName?`System prompt: ${event.systemPromptName}`:"System prompt changed");break;case"entry_appended":if(this.entriesRenderedByBoundaryCompaction.delete(event.entry.id))break;if(event.entry.type==="custom")this.addCustomEntryToChat(event.entry),this.ui.requestRender();else if(event.entry.type==="custom_message"&&event.entry.display)this.addMessageToChat(createCustomMessage(event.entry.customType,event.entry.content,event.entry.display,event.entry.details,event.entry.timestamp)),this.ui.requestRender();else if(event.entry.type==="compaction"){let entries=this.sessionManager.buildContextEntries();if(entries[0]?.id!==event.entry.id)break;this.chatContainer.clear();let branch=this.sessionManager.getBranch(),compactionIndex=branch.findIndex(entry=>entry.id===event.entry.id),entriesAfterCompaction=new Set(branch.slice(compactionIndex+1).map(entry=>entry.id)),retainedEntries=entries.slice(1);this.renderSessionEntries(retainedEntries.filter(entry=>!entriesAfterCompaction.has(entry.id))),this.addMessageToChat(createCompactionSummaryMessage(event.entry.summary,event.entry.tokensBefore,event.entry.timestamp)),event.entry.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.entry.usage}),this.renderSessionEntries(retainedEntries.filter(entry=>entriesAfterCompaction.has(entry.id)));for(let entryId of entriesAfterCompaction)this.entriesRenderedByBoundaryCompaction.add(entryId);this.footer.invalidate(),this.ui.requestRender()}break;case"session_info_changed":this.updateTerminalTitle(),this.footer.invalidate(),this.ui.requestRender();break;case"thinking_level_changed":this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(`Thinking level: ${event.level}`);break;case"model_change_skipped":this.showWarning(`Skipped ${event.model.name||event.model.id}: current context needs ${event.shortfallTokens.toLocaleString()} more tokens for its ${event.contextWindow.toLocaleString()}-token window (${event.safetyMarginProfile} usability budget).`);break;case"model_change_pending":this.showWarning(event.notice),this.footer.invalidate();break;case"high_reasoning_warning":this.showHighReasoningWarning(event);break;case"resume_compaction_required":this.showWarning(event.notice);break;case"resume_context_reduced":this.showWarning(event.notice);break;case"provider_required":if(this.startupProviderGuidanceShown){this.startupProviderGuidanceShown=!1;break}this.showWarning(event.notice);break;case"settings_source_selected":this.showSettingsSourceSelected(event);break;case"message_start":event.message.role==="custom"?(this.addMessageToChat(event.message),this.ui.requestRender()):event.message.role==="user"?(this.providerErrors?.newTurn(),this.optimisticUserEchoes.replaceNext(event.message)||this.addMessageToChat(event.message),this.updatePendingMessagesDisplay(),this.ui.requestRender()):event.message.role==="assistant"&&(this.streamingComponent=new AssistantMessageComponent(void 0,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers()),this.streamingComponent.setExpanded(this.toolOutputExpanded),this.streamingMessage=event.message,this.chatContainer.addChild(this.streamingComponent),this.streamingReveal.begin(this.streamingComponent,assistantStreamingHeadMessage(this.streamingMessage)),this.requestStreamingRender());break;case"message_update":if(this.streamingComponent&&event.message.role==="assistant"){event.message.content.some(part=>part.type==="text"&&part.text.trim())&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry")),this.streamingMessage=event.message,this.streamingReveal.setTarget(assistantStreamingHeadMessage(event.message));for(let content of this.streamingMessage.content)if(content.type==="toolCall"){let component=this.pendingTools.get(content.id);component||(component=this.createToolExecutionComponent(content.name,content.id,content.arguments),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(content.id,component));let partialJson=getStreamingToolCallPartialJson(content);partialJson&&this.settingsManager.getSmoothStreaming()?this.toolArgsReveal.update(content.id,component,partialJson):(this.toolArgsReveal.finish(content.id),component.updateArgs(content.arguments))}this.syncTrailingAssistantText(event.message),this.ui.requestRender()}break;case"message_end":if(event.message.role==="user")break;if(this.streamingComponent&&event.message.role==="assistant"){this.streamingMessage=event.message,this.streamingReveal.stop();for(let content of this.streamingMessage.content){if(content.type!=="toolCall")continue;let component=this.pendingTools.get(content.id);component&&!this.toolArgsReveal.flush(content.id,content.arguments)&&component.updateArgs(content.arguments)}this.toolArgsReveal.flushAll();let renderedMessage=abortedMessageForRendering(this.streamingMessage,this.session.retryAttempt,this.session.currentAbortSource);isNetworkProviderMessage(renderedMessage)?this.getProviderErrors().record(renderedMessage.errorMessage??"",this.toolOutputExpanded):(renderedMessage.stopReason==="stop"||renderedMessage.stopReason==="toolUse")&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry"));let errorMessage8=renderedMessage.errorMessage;if(this.syncTrailingAssistantText(renderedMessage),this.assistantTextSegments.clear(),this.addContinuityNotice(renderedMessage),this.streamingMessage.stopReason==="aborted"||this.streamingMessage.stopReason==="error"){errorMessage8||(errorMessage8=this.streamingMessage.errorMessage||"Error");for(let[,component]of this.pendingTools.entries())component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0});this.clearPendingTools()}else{for(let[,component]of this.pendingTools.entries())component.setArgsComplete();this.maybeShowAssistantDiagnostics(this.streamingMessage),this.maybeShowCacheMissNotice(this.streamingMessage)}this.streamingComponent=void 0,this.streamingMessage=void 0,this.footer.invalidate()}this.ui.requestRender();break;case"bash_execution_update":break;case"tool_execution_start":{if(event.parentToolCallId)break;this.handleToolExecutionStart(event);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,event.args),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolArgsReveal.flush(event.toolCallId,event.args)||component.updateArgs(event.args),component.markExecutionStarted(),this.ui.requestRender();break}case"tool_hook_status":this.handleToolHookStatusEvent(event);break;case"tool_execution_update":{let component=this.pendingTools.get(event.toolCallId);if(component){this.toolResultReveal.update(event.toolCallId,component,event.partialResult)||component.updateResult({...event.partialResult,isError:!1},!0);let activity=readToolProgress(event.partialResult.details)?.activity;if(activity){let label3=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{if(event.parentToolCallId)break;this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"transcript_write_failed":{if(this.transcriptWriteNoticeShown)break;this.transcriptWriteNoticeShown=!0;let reason=/^[A-Z][A-Z0-9_]+(?=:)/.exec(event.errorMessage)?.[0]??sanitizeTerminalLabel(event.errorMessage);this.showWarning(`This turn was not saved to the session file (${reason}); the model will not see it after the next prompt.`);break}case"session_abort":this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.pendingZeroDelayRetryIndicator=void 0,this.ui.requestRender();break;case"compaction_start":{this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.compactionEscapeOverrideActive||(this.autoCompactionEscapeHandler=this.defaultEditor.onEscape,this.compactionEscapeOverrideActive=!0),this.defaultEditor.onEscape=()=>{this.session.abortCompaction()};let indicator=new CompactionStatusIndicator(this.ui,event.reason);this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear(),this.statusContainer.addChild(indicator),this.autoCompactionProgressText="",this.ui.requestRender();break}case"compaction_progress":{if(this.activeStatusIndicator?.kind!=="compaction")break;let nextText=event.text!==void 0?event.text:`${this.autoCompactionProgressText}${event.delta??""}`;if(!nextText)break;this.autoCompactionProgressText=nextText;let preview=nextText.length>4e3?`...${nextText.slice(nextText.length-4e3)}`:nextText;this.activeStatusIndicator.setProgressText(sanitizeTerminalLabel(preview)),this.ui.requestRender();break}case"compaction_end":{if(this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),_InteractiveMode.restoreCompactionEscapeOverride(this),this.clearStatusIndicator("compaction"),this.autoCompactionProgressText="",event.rejectionCause==="external-owner"&&event.reason!=="manual")this.externalOwnerCompactionNoticeShown||(this.externalOwnerCompactionNoticeShown=!0,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("muted","The Claude Agent SDK manages and compacts this session's context natively."),1,0))),this.footer?.setCompactionDelegated?.(!0);else if(event.aborted){let cancelMessage=sanitizeTerminalLabel(event.errorMessage??"Compaction cancelled");event.reason==="manual"?this.showError(cancelMessage):event.errorMessage?(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",cancelMessage),1,0))):this.showStatus("Auto-compaction cancelled")}else if(event.result){this.providerErrors?.clear();let sessionManager=this.session.sessionManager??this.sessionManager,entries=sessionManager?.buildContextEntries?.()??[];if(entries[0]?.type!=="compaction")try{sessionManager?.reloadFromDisk?.(),entries=sessionManager?.buildContextEntries?.()??entries}catch{}this.chatContainer.clear();let summaryMessage=createCompactionSummaryMessage(sanitizeTerminalLabel(event.result.summary),event.result.tokensBefore,new Date().toISOString(),event.result.details);if(typeof this.renderSessionEntries=="function"){let entriesToRender=entries[0]?.type==="compaction"?entries.slice(1):entries.filter(e=>e.type!=="compaction");this.renderSessionEntries(entriesToRender),this.addMessageToChat(summaryMessage),event.result.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.result.usage})}else this.rebuildChatFromMessages(),this.addMessageToChat(summaryMessage);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1)}else if(event.errorMessage){let errorMessage8=sanitizeTerminalLabel(event.errorMessage);isRetryableProviderError(errorMessage8)&&this.providerErrors?.awaitingRetryFinish===!0?this.getProviderErrors().finish(errorMessage8):event.reason==="manual"?this.showError(errorMessage8):this.chatContainer.addChild(new Text(theme.fg("error",errorMessage8),1,0))}else if(event.accepted===!1){let message=`Compaction failed (no result); cause: ${event.rejectionCause??"unknown"}`;event.reason==="manual"?this.showError(message):(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("error",message),1,0)))}if(event.accepted===!0||event.result!==void 0)this.flushCompactionQueue({willRetry:event.willRetry,deferAdmission:!1});else if(event.willRetry===!0){let heldCount=this.compactionQueuedMessages.length;if(heldCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_deferred",{count:heldCount,cause:failureCause}),this.showStatus(`${heldCount} queued message${heldCount===1?"":"s"} will send with the next turn (compaction will retry)`)}this.flushCompactionQueue({willRetry:!0,deferAdmission:!0})}else{let restoredCount=this.restoreQueuedMessagesToEditor();if(restoredCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_restored",{restored:restoredCount,cause:failureCause}),this.showStatus(`${restoredCount} queued message${restoredCount===1?"":"s"} restored to the editor (compaction did not complete)`)}}this.ui.requestRender();break}case"model_changed":this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break;case"retry_fallback_applied":{this.pendingZeroDelayRetryIndicator?this.pendingZeroDelayRetryIndicator.fallbackApplied=!0:this.fallbackAppliedBeforeRetryStart=!0,this.showNoticeBox({title:`\u21C4 Model fallback \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:`${usageLimitCause(event.from,event.limit)??`Retry switched models (${event.reason})`}; the turn continues on ${event.to}.`}),this.setExtensionStatus(FALLBACK_STATUS_KEY,`fallback: ${event.to}`),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break}case"retry_fallback_succeeded":this.showNoticeBox({title:`\u2713 Fallback model responded \xB7 ${event.model}`,tone:"success",why:"The fallback chain answered; the session stays on it until the revert policy fires."});break;case"retry_fallback_reverted":this.showNoticeBox({title:`\u21C4 Reverted to ${event.to}`,tone:"accent",why:event.cause==="fallback-unusable"?`${event.from} cannot serve right now (its account hit a billing or usage limit), so the session is back on the original model.`:"The original model is back after its cooldown lapsed."}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"retry_fallback_exhausted":if(isRetryableProviderError(event.lastError)){this.getProviderErrors().finish(event.lastError),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break}this.showNoticeBox({title:`\u2715 Fallback chain exhausted \xB7 ${event.chainKey}`,tone:"error",why:event.lastError}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"server_fallback_aborted":this.showNoticeBox({title:`\u26A0 Server fallback aborted \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:event.chainConfigured?"Retrying on your configured fallback chain.":"No fallback chain configured \u2014 set one with /fallback."});break;case"auto_retry_start":{isRetryableProviderError(event.errorMessage)&&this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded),this.retryEscapeHandler=void 0;let fallbackApplied=this.fallbackAppliedBeforeRetryStart;if(this.fallbackAppliedBeforeRetryStart=!1,event.delayMs===0){let pending={fallbackApplied};this.pendingZeroDelayRetryIndicator=pending,queueMicrotask(()=>{this.pendingZeroDelayRetryIndicator===pending&&(this.pendingZeroDelayRetryIndicator=void 0,shouldShowRetryIndicator(event.delayMs,pending.fallbackApplied)&&this.showRetryStatusIndicator(event))})}else this.showRetryStatusIndicator(event);break}case"auto_retry_end":{this.pendingZeroDelayRetryIndicator=void 0,this.fallbackAppliedBeforeRetryStart=!1,this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0),this.clearStatusIndicator("retry"),event.success||event.finalError==="Retry cancelled"?this.providerErrors?.clear():isRetryableProviderError(event.finalError)?this.getProviderErrors().finish(event.finalError,event.attempt):this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError||"Unknown error"}`),this.ui.requestRender();break}case"summarization_retry_scheduled":{isRetryableProviderError(event.errorMessage)?this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded):this.showError(event.errorMessage),this.showSummarizationRetryStatusIndicator(event);break}case"summarization_retry_attempt_start":{this.clearStatusIndicator("retry"),event.source==="branchSummary"?this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)):this.showStatusIndicator(new CompactionStatusIndicator(this.ui,event.reason)),this.ui.requestRender();break}case"summarization_retry_finished":{this.providerErrors?.clearTransient(),this.clearStatusIndicator("retry"),this.ui.requestRender();break}case"retry_probe_scheduled":{let secondsAway=Math.max(0,Math.round((event.atMs-Date.now())/1e3));this.showStatus(`Probing ${sanitizeTerminalLabel(event.selector)} at +${secondsAway}s (#${event.probeIndex})`),this.ui.requestRender();break}case"retry_probe_result":{event.ok?this.showStatus(`Recovered ${sanitizeTerminalLabel(event.selector)} - will restore on next turn`):event.errorMessage==="auth-unavailable"?this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} skipped - auth unavailable, staying on fallback`):this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} failed - staying on fallback`),this.ui.requestRender();break}}}showRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showSummarizationRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showRetryStatusIndicatorWithCadence(event){let refreshIntervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS),indicator=refreshIntervalMs===DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS?void 0:{intervalMs:refreshIntervalMs};this.showStatusIndicator(new RetryStatusIndicator(this.ui,event.attempt,event.maxAttempts,event.delayMs,indicator,isRetryableProviderError(event.errorMessage))),this.ui.requestRender()}getUserMessageText(message){return message.role!=="user"?"":(typeof message.content=="string"?[{type:"text",text:message.content}]:message.content.filter(content=>content.type==="text")).map(content=>content.text).join("")}showManagedToolStatus(status){this.managedToolStatusStarted||(this.chatContainer.addChild(new Spacer(1)),this.managedToolStatusStarted=!0);let message=status.type==="warning"?`Warning: ${status.message}`:status.message,color=status.type==="warning"?"warning":"dim";this.chatContainer.addChild(new ThemedText(()=>theme.fg(color,message),1,0)),this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.ui.requestRender()}showStatus(message){let children=this.chatContainer.children,last=children.length>0?children[children.length-1]:void 0,secondLast=children.length>1?children[children.length-2]:void 0;if(last&&secondLast&&last===this.lastStatusText&&secondLast===this.lastStatusSpacer){this.lastStatusMessage=message,this.lastStatusText.invalidate(),this.ui.requestRender();return}let spacer=new Spacer(1);this.lastStatusMessage=message;let text2=new ThemedText(()=>theme.fg("dim",this.lastStatusMessage),1,0);this.chatContainer.addChild(spacer),this.chatContainer.addChild(text2),this.lastStatusSpacer=spacer,this.lastStatusText=text2,this.ui.requestRender()}addCustomEntryToChat(entry){let renderer=this.session.extensionRunner.getEntryRenderer(entry.customType);if(!renderer)return;let component=new CustomEntryComponent(entry,renderer);if(component.setExpanded(this.toolOutputExpanded),!component.hasContent())return;let children=this.chatContainer.children,streamingIndex=this.streamingComponent?children.indexOf(this.streamingComponent):-1,insertIndex=streamingIndex>=0?streamingIndex:children.length,options=this.session.extensionRunner.getEntryRendererOptions(entry.customType),replacedIndex=replacedEntryCardIndex(children,insertIndex,entry,options,child=>child===this.lastStatusText||child===this.lastStatusSpacer);if(replacedIndex>=0){children.splice(replacedIndex,1,component);return}if(streamingIndex>=0){children.splice(streamingIndex,0,component);return}this.chatContainer.addChild(component)}renderPendingUserEcho(text2){let spacer=this.chatContainer.children.length>0?new Spacer(1):void 0;spacer&&this.chatContainer.addChild(spacer);let component=new UserMessageComponent(text2,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(component),this.ui.requestRender();let removePending=()=>{let componentIndex=this.chatContainer.children.indexOf(component);if(componentIndex===-1)return this.chatContainer.children.length;let spacerIndex=spacer?this.chatContainer.children.indexOf(spacer):-1,insertionIndex=spacerIndex>=0?spacerIndex:componentIndex;return spacerIndex>=0&&spacer&&this.chatContainer.removeChild(spacer),this.chatContainer.removeChild(component),insertionIndex};return{replace:message=>{let insertionIndex=removePending(),appendIndex=this.chatContainer.children.length;this.addMessageToChat(message);let canonicalChildren=this.chatContainer.children.splice(appendIndex);!spacer&&canonicalChildren[0]instanceof Spacer&&canonicalChildren.shift()?.dispose?.(),this.chatContainer.children.splice(insertionIndex,0,...canonicalChildren),this.ui.requestRender()},remove:()=>{removePending(),this.ui.requestRender()}}}addMessageToChat(message,options){switch(message.role==="user"&&this.providerErrors?.newTurn(),message.role){case"bashExecution":{let component=new BashExecutionComponent(message.command,this.ui,message.excludeFromContext);message.output&&component.appendOutput(message.output),component.setComplete(message.exitCode,message.cancelled,message.truncated?{truncated:!0}:void 0,message.fullOutputPath),this.chatContainer.addChild(component);break}case"custom":{if(message.display){let renderer=this.session.extensionRunner.getMessageRenderer(message.customType)??builtInMessageRenderer(message.customType),component=new CustomMessageComponent(message,renderer,this.getMarkdownThemeWithSettings(),this.outputPad);component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component)}break}case"compactionSummary":{this.chatContainer.addChild(new Spacer(1));let component=new CompactionSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"branchSummary":{this.chatContainer.addChild(new Spacer(1));let component=new BranchSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"system":break;case"user":{let textContent3=this.getUserMessageText(message);if(textContent3){this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1));let skillBlock=parseSkillBlock(textContent3);if(skillBlock){let component=new SkillInvocationMessageComponent(skillBlock,this.getMarkdownThemeWithSettings());if(component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),skillBlock.userMessage){this.chatContainer.addChild(new Spacer(1));let userComponent=new UserMessageComponent(skillBlock.userMessage,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(userComponent)}}else{let answer=parseAskUserAnswerFrame(textContent3),userComponent=new UserMessageComponent(textContent3,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers(),answer?getAskUserAnswerHeaders(this.sessionManager.getBranch(),answer.requestId):void 0);this.chatContainer.addChild(userComponent)}options?.populateHistory&&this.editor.addToHistory?.(textContent3)}break}case"assistant":{isNetworkProviderMessage(message)?(this.getProviderErrors().record(message.errorMessage??"",this.toolOutputExpanded),this.providerErrors?.finish()):(message.stopReason==="stop"||message.stopReason==="toolUse")&&this.providerErrors?.clear();let assistantComponent=new AssistantMessageComponent(message,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());assistantComponent.setExpanded(this.toolOutputExpanded),assistantComponent.setProviderErrorOwned(isNetworkProviderMessage(message)),this.chatContainer.addChild(assistantComponent);break}case"toolResult":break;case"configurationUpdate":break;default:{let exhaustive=message}}}syncTrailingAssistantText(message){if(!this.streamingComponent)return;this.streamingComponent.setProviderErrorOwned(isNetworkProviderMessage(message));let head=assistantStreamingHeadMessage(message);this.streamingReveal?.isPacingHead(head)||this.streamingComponent.updateContent(head,!0);let content=message.content,firstToolIndex=content.findIndex(block=>block.type==="toolCall");if(firstToolIndex===-1){this.detachAssistantTextSegments();return}let index=firstToolIndex+1;for(;index<content.length;){if(content[index]?.type==="toolCall"){index+=1;continue}let runStart=index,runBlocks=[];for(;index<content.length&&content[index]?.type!=="toolCall";){let runBlock=content[index];runBlock&&runBlocks.push(runBlock),index+=1}let runMessage={...message,content:runBlocks},existing=this.assistantTextSegments.get(runStart);if(existing){existing.setProviderErrorOwned(isNetworkProviderMessage(message)),existing.updateContent(runMessage,!0);continue}let segment2=new AssistantMessageComponent(runMessage,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());segment2.setExpanded(this.toolOutputExpanded),segment2.setProviderErrorOwned(isNetworkProviderMessage(message)),this.assistantTextSegments.set(runStart,segment2);let followingToolCall=content.slice(index).find(block=>block.type==="toolCall"),followingToolCallId=followingToolCall?.type==="toolCall"?followingToolCall.id:void 0,followingToolComponent=followingToolCallId?this.pendingTools.get(followingToolCallId):void 0,anchorIndex=followingToolComponent?this.chatContainer.children.indexOf(followingToolComponent):-1;anchorIndex>=0?this.chatContainer.children.splice(anchorIndex,0,segment2):this.chatContainer.addChild(segment2)}for(let[runStart,segment2]of this.assistantTextSegments)(runStart>=content.length||content[runStart]?.type==="toolCall")&&(this.chatContainer.detachChild(segment2),this.assistantTextSegments.delete(runStart))}detachAssistantTextSegments(){for(let segment2 of this.assistantTextSegments.values())this.chatContainer.detachChild(segment2);this.assistantTextSegments.clear()}createToolExecutionComponent(requestedName,toolCallId,args){let toolName=this.session.resolveToolCallName(requestedName);return this.chrome?new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd(),this.chrome.toolPresentation):new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd())}renderSessionItems(items,options={}){this.providerErrors=void 0,this.copilotToolLimitNoticeSessionId=void 0,this.clearPendingTools(),this.continuityNotices?.reset?.();let renderedPendingTools=new Map,cacheMisses=this.settingsManager.getShowCacheMissNotices()?collectCacheMisses(this.sessionManager.getEntries(),this.session.modelRuntime):new Map;options.updateFooter&&(this.footer.invalidate(),this.updateEditorBorderColor());for(let item of items){if(isCustomSessionEntry(item)){this.addCustomEntryToChat(item);continue}if(isCompactionCostNotice(item)){this.addCompactionCostNotice(item);continue}let message=item;if(message.role==="assistant"){if(replayAssistantTools(message,{expanded:this.toolOutputExpanded,addMessage:part=>this.addMessageToChat(part),addChild:component=>this.chatContainer.addChild(component),createTool:(name,id,args)=>this.createToolExecutionComponent(name,id,args),pending:renderedPendingTools}),message.stopReason!=="aborted"&&message.stopReason!=="error"){this.maybeShowAssistantDiagnostics?.(message,{replay:!0});let miss=cacheMisses.get(message);miss&&this.addCacheMissNotice(miss)}this.addContinuityNotice?.(message)}else if(message.role==="toolResult"){let component=renderedPendingTools.get(message.toolCallId);component&&(component.updateResult(message),renderedPendingTools.delete(message.toolCallId))}else this.addMessageToChat(message,options)}for(let[toolCallId,component]of renderedPendingTools)this.pendingTools.set(toolCallId,component);this.ui.requestRender()}renderSessionEntries(entries,options={}){let items=entries.flatMap(entry=>{if(entry.type==="custom")return[entry];let messages=sessionEntryToContextMessages(entry);return(entry.type==="compaction"||entry.type==="branch_summary")&&entry.usage&&messages.length>0?[...messages,{type:"compaction_cost",kind:entry.type,usage:entry.usage}]:messages});this.renderSessionItems(items,options)}addCompactionCostNotice(notice2){if(!this.settingsManager.getShowCacheMissNotices())return;let{usage:usage3}=notice2,tokens=usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost=usage3.cost.total>=.01?` (~$${usage3.cost.total.toFixed(2)})`:"",label3=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`${label3}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message,options){for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="github_copilot_tool_limit")continue;let notice2=diagnostic2.details?.message,sessionId=this.sessionManager.getSessionId();typeof notice2!="string"||this.copilotToolLimitNoticeSessionId===sessionId||(this.copilotToolLimitNoticeSessionId=sessionId,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",notice2),1,0)))}options?.replay||this.maybeShowThinkingDropNotice?.(message)}static countDroppedThinkingBlocks(message){let count=0;for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;Array.isArray(transformations)&&(count+=transformations.filter(transformation=>typeof transformation=="object"&&transformation!==null&&transformation.type==="thinking_dropped").length)}return count}maybeShowThinkingDropNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let droppedCount=_InteractiveMode.countDroppedThinkingBlocks(message);if(droppedCount===0)return;let previousDroppedCount=0,branch=this.sessionManager.getBranch();for(let i=branch.length-1;i>=0;i--){let entry=branch[i];if(entry.type==="message"&&entry.message.role==="assistant"){previousDroppedCount=_InteractiveMode.countDroppedThinkingBlocks(entry.message);break}}if(droppedCount<=previousDroppedCount)return;let noun=droppedCount===1?"thinking block":"thinking blocks";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`Anthropic dropped ${droppedCount} ${noun} (details in session)`),1,0))}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label3="Cache miss";miss.modelChanged?label3="Cache miss after model switch":miss.idleMs>=3e5&&(label3=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`${label3}: ${reBilled}`),1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(resolve46=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve46(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},...userInput.unknownCommandAsText?{unknownCommandAsText:!0}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),userInput.ticket?.release(),disposition==="handled"&&this.agentIdle&&this.pendingUserInputs.length===0&&(this.clearStatusIndicator("working"),this.ui.requestRender())}}}rebuildChatFromMessages(){try{this.sessionManager?.reloadFromDisk?.()}catch{}this.chatContainer.clear(),this.renderSessionEntries(this.sessionManager.buildContextEntries())}handleCtrlC(){let now2=Date.now();now2-this.lastSigintTime<500?this.shutdown():(this.clearEditor(),this.lastSigintTime=now2)}handleCtrlD(){this.shutdown()}async shutdown(options){if(this.isShuttingDown)return;this.isShuttingDown=!0,options?.fromSignal&&(await this.sessionControlHost?.disposeActive(),await this.runtimeHost.dispose(),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop(),process.exit(0)),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop({restoreStderr:!1});try{await this.sessionControlHost?.disposeActive(),await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
2620
+ `)[cursor.line]??"":"",characterBeforeCursor=cursor&&cursor.col>0?currentLine[cursor.col-1]:"",characterAfterCursor=cursor?currentLine[cursor.col]:"",leadingSpace=characterBeforeCursor&&!/\s/.test(characterBeforeCursor)?" ":"",trailingSpace=characterAfterCursor&&!/\s/.test(characterAfterCursor)?" ":"";this.editor.insertTextAtCursor?.(`${leadingSpace}${paths}${trailingSpace}`),this.ui.requestRender();return}let image=await readClipboardImage();if(image&&await attachClipboardImage({editor:this.editor,pendingImages:this.pendingImages,settings:this.settingsManager,isCompacting:()=>this.session?.isCompacting===!0,showStatus:message=>this.showStatus(message),requestRender:()=>this.ui.requestRender()},image))return;let text2=await readClipboardText();text2&&(this.editor.insertTextAtCursor?.(text2),this.ui.requestRender())}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);this.getSessionLogger?.().warn("clipboard_error",{op:"paste",error:message}),this.showStatus?.(`Clipboard paste failed: ${sanitizeTuiErrorMessage(message)}`)}}subscribeImageMarkers(editor){editor.insertImageMarker&&(editor.onImageMarkersChanged=order=>this.reconcilePendingImages(order),editor.snapshotAttachmentState=()=>new Map(this.pendingImages),editor.restoreAttachmentState=state=>{if(state instanceof Map){this.pendingImages.clear();for(let[key,image]of state)this.pendingImages.set(key,image)}})}reconcilePendingImages(order){if(this.pendingImages.size===0)return;let reconciled=new Map;order.forEach((id,index)=>{let image=this.pendingImages.get(id);image&&reconciled.set(index+1,image)}),this.pendingImages.clear();for(let[key,image]of reconciled)this.pendingImages.set(key,image)}takeSubmissionImages(submittedText){let images=[],consumed=new Set;for(let match of submittedText.matchAll(IMAGE_MARKER_PATTERN2)){let id=Number.parseInt(match[1]??"0",10);if(consumed.has(id))continue;consumed.add(id);let image=this.pendingImages.get(id);image&&images.push(image)}return this.pendingImages.clear(),images}getSessionLogger(){return this.sessionLogger??=createSessionLogger(this.runtimeHost.services.agentDir),this.sessionLogger}handleStartupSubmit(text2){if(text2.trim()==="/quit"||text2.trim()==="/exit"){this.editor.setText(""),this.shutdown();return}this.editor.setText(text2),this.showStatus("Startup is still in progress")}beginUserEcho(text2,images){if(!isManualContinueSubmission({text:text2,hasMessages:this.session.messages.length>0,hasImages:(images?.length??0)>0}))return this.optimisticUserEchoes.begin(text2)}setupEditorSubmitHandler(){this.defaultEditor.onSubmit=async(text2,details)=>{try{let preResolvedImages=this.preResolvedSubmissionImages;this.preResolvedSubmissionImages=void 0,this.hideShortcutOverlay(),this.lastEditorText="",text2=text2.trim();let unknownCommandAsText=_InteractiveMode.confirmsRefusedUnknownCommand(this,text2)||submitsCommandAsText(text2,details);if(!text2){this.expandPendingQuestion();return}if(!text2.startsWith("/")&&!text2.startsWith("!")&&this.submitAsyncQuestionComment(text2))return;if(text2==="/settings"){await this.showSettingsSelector(),this.editor.setText("");return}if(text2==="/favorite-models"){this.editor.setText(""),await this.showFavoriteModelsSelector();return}if(text2==="/scoped-models"){this.editor.setText(""),this.showScopedModelsSelector();return}if(text2==="/model"||text2.startsWith("/model ")){let searchTerm=text2.startsWith("/model ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleModelCommand(searchTerm);return}if(text2==="/thinking"||text2.startsWith("/thinking ")){let searchTerm=text2.startsWith("/thinking ")?text2.slice(10).trim():void 0;this.editor.setText(""),await this.handleThinkingCommand(searchTerm);return}if(text2==="/export"||text2.startsWith("/export ")){await this.handleExportCommand(text2),this.editor.setText("");return}if(text2==="/import"||text2.startsWith("/import ")){await this.handleImportCommand(text2),this.editor.setText("");return}if(text2==="/share"){await this.handleShareCommand(),this.editor.setText("");return}if(text2==="/copy"){await this.handleCopyCommand(),this.editor.setText("");return}if(text2==="/rename"||text2.startsWith("/rename ")||text2==="/name"||text2.startsWith("/name ")){await this.handleRenameCommand(text2),this.editor.setText("");return}if(text2==="/session"){await this.handleSessionCommand(),this.editor.setText("");return}if(text2==="/changelog"){this.handleChangelogCommand(),this.editor.setText("");return}if(text2==="/keybindings"){this.editor.setText(""),await this.handleKeybindingsCommand();return}if(text2==="/answer"||text2.startsWith("/answer ")){this.editor.setText("");let hold=this.session.externalAdmission?.beginInput({command:!0});try{await this.handleAnswerCommand(text2.slice(7).trim())}finally{hold?.end()}return}if(text2==="/hotkeys"){this.handleHotkeysCommand(),this.editor.setText("");return}if(text2==="/fork"){await this.showUserMessageSelector(),this.editor.setText("");return}if(text2==="/clone"){this.editor.setText(""),await this.handleCloneCommand();return}if(text2==="/tree"){this.showTreeSelector(),this.editor.setText("");return}if(text2==="/trust"){this.showTrustSelector(),this.editor.setText("");return}if(text2==="/login"||text2.startsWith("/login ")){let providerRef=text2.startsWith("/login ")?text2.slice(7).trim():void 0;this.editor.setText(""),await this.handleLoginCommand(providerRef);return}if(text2==="/logout"){this.showOAuthSelector("logout"),this.editor.setText("");return}if(text2==="/new"){this.editor.setText(""),await this.handleClearCommand();return}if(text2==="/compact"||text2.startsWith("/compact ")){let customInstructions=text2.startsWith("/compact ")?text2.slice(9).trim():void 0;this.editor.setText(""),await this.handleCompactCommand(customInstructions);return}if(text2==="/reload"){this.editor.setText(""),await this.handleReloadCommand();return}if(text2==="/debug"){this.handleDebugCommand(),this.editor.setText("");return}if(text2==="/arminsayshi"){this.handleArminSaysHi(),this.editor.setText("");return}if(text2==="/dementedelves"){this.handleDementedDelves(),this.editor.setText("");return}if(text2==="/resume"||text2==="/sessions"){this.showSessionSelector(),this.editor.setText("");return}if(text2==="/quit"||text2==="/exit"){this.editor.setText(""),await this.shutdown();return}if(isBareSkillNamespace(text2)){this.openSkillPickerForBareNamespace();return}if(this.isExtensionCommand(text2)){this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2);return}if(text2.startsWith("!")){let isExcluded2=text2.startsWith("!!"),command=isExcluded2?text2.slice(2).trim():text2.slice(1).trim();if(command){if(this.session.isBashRunning){this.showWarning("A bash command is already running. Press Esc to cancel it first."),this.editor.setText(text2);return}this.editor.addToHistory?.(text2),await this.handleBashCommand(command,isExcluded2),this.isBashMode=!1,this.updateEditorBorderColor();return}}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"steer",unknownCommandAsText);return}if(this.session.isStreaming){let ticket2=this.sessionControlHost?.claimHandoff(),images2=preResolvedImages??this.takeSubmissionImages(text2);this.editor.addToHistory?.(text2),this.editor.setText("");let pendingEchoId2=this.beginUserEcho(text2,images2),echoOptions=this.optimisticUserEchoes.promptOptions(pendingEchoId2);try{await this.session.prompt(text2,{streamingBehavior:"steer",...images2.length>0?{images:images2}:{},...unknownCommandAsText?{unknownCommandAsText}:{},...echoOptions,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),ticket2?.release()}})}catch(error2){if(this.optimisticUserEchoes.reject(pendingEchoId2),error2 instanceof UnknownCommandError&&this.reportUnknownCommandRejection(error2,text2))return;throw error2}finally{ticket2?.release()}this.updatePendingMessagesDisplay(),this.ui.requestRender();return}this.flushPendingBashComponents();let images=preResolvedImages??this.takeSubmissionImages(text2),pendingEchoId=this.beginUserEcho(text2,images),ticket=this.sessionControlHost?.claimHandoff(),submission={text:text2,pendingEchoId,...images.length>0?{images}:{},...unknownCommandAsText?{unknownCommandAsText}:{},...ticket?{ticket}:{}};this.onInputCallback?this.onInputCallback(submission):this.pendingUserInputs.push(submission),this.editor.addToHistory?.(text2)}catch(error2){if(typeof this.showError=="function")this.showError(error2 instanceof Error?error2.message:String(error2));else throw error2}}}subscribeToAgent(){this.unsubscribe=this.session.subscribe(async event=>{await this.handleEvent(event)})}async handleEvent(event){switch(this.isInitialized||await this.init(),this.footer.invalidate(),event.type){case"agent_start":this.agentIdle=!1,this.transcriptWriteNoticeShown=!1,this.clearPendingTools(),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.turnWorkingTip.resetForNewTurn(),this.settingsManager.getShowTerminalProgress()&&this.ui.terminal.setProgress(!0),this.pendingTools?.clear(),this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0);break;case"turn_start":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.workingVisible?this.showWorkingStatusIndicator():this.clearStatusIndicator(),this.ui.requestRender();break;case"queue_update":this.updatePendingMessagesDisplay(),this.ui.requestRender();break;case"system_prompt_change":this.showStatus(event.systemPromptName?`System prompt: ${event.systemPromptName}`:"System prompt changed");break;case"entry_appended":if(this.entriesRenderedByBoundaryCompaction.delete(event.entry.id))break;if(event.entry.type==="custom")this.addCustomEntryToChat(event.entry),this.ui.requestRender();else if(event.entry.type==="custom_message"&&event.entry.display)this.addMessageToChat(createCustomMessage(event.entry.customType,event.entry.content,event.entry.display,event.entry.details,event.entry.timestamp)),this.ui.requestRender();else if(event.entry.type==="compaction"){let entries=this.sessionManager.buildContextEntries();if(entries[0]?.id!==event.entry.id)break;this.chatContainer.clear();let branch=this.sessionManager.getBranch(),compactionIndex=branch.findIndex(entry=>entry.id===event.entry.id),entriesAfterCompaction=new Set(branch.slice(compactionIndex+1).map(entry=>entry.id)),retainedEntries=entries.slice(1);this.renderSessionEntries(retainedEntries.filter(entry=>!entriesAfterCompaction.has(entry.id))),this.addMessageToChat(createCompactionSummaryMessage(event.entry.summary,event.entry.tokensBefore,event.entry.timestamp)),event.entry.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.entry.usage}),this.renderSessionEntries(retainedEntries.filter(entry=>entriesAfterCompaction.has(entry.id)));for(let entryId of entriesAfterCompaction)this.entriesRenderedByBoundaryCompaction.add(entryId);this.footer.invalidate(),this.ui.requestRender()}break;case"session_info_changed":this.updateTerminalTitle(),this.footer.invalidate(),this.ui.requestRender();break;case"thinking_level_changed":this.footer.invalidate(),this.updateEditorBorderColor(),this.showStatus(`Thinking level: ${event.level}`);break;case"model_change_skipped":this.showWarning(`Skipped ${event.model.name||event.model.id}: current context needs ${event.shortfallTokens.toLocaleString()} more tokens for its ${event.contextWindow.toLocaleString()}-token window (${event.safetyMarginProfile} usability budget).`);break;case"model_change_pending":this.showWarning(event.notice),this.footer.invalidate();break;case"high_reasoning_warning":this.showHighReasoningWarning(event);break;case"thinking_level_clamped":this.showWarning(formatThinkingClampWarning(event));break;case"resume_compaction_required":this.showWarning(event.notice);break;case"resume_context_reduced":this.showWarning(event.notice);break;case"provider_required":if(this.startupProviderGuidanceShown){this.startupProviderGuidanceShown=!1;break}this.showWarning(event.notice);break;case"settings_source_selected":this.showSettingsSourceSelected(event);break;case"message_start":event.message.role==="custom"?(this.addMessageToChat(event.message),this.ui.requestRender()):event.message.role==="user"?(this.providerErrors?.newTurn(),this.optimisticUserEchoes.replaceNext(event.message)||this.addMessageToChat(event.message),this.updatePendingMessagesDisplay(),this.ui.requestRender()):event.message.role==="assistant"&&(this.streamingComponent=new AssistantMessageComponent(void 0,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers()),this.streamingComponent.setExpanded(this.toolOutputExpanded),this.streamingMessage=event.message,this.chatContainer.addChild(this.streamingComponent),this.streamingReveal.begin(this.streamingComponent,assistantStreamingHeadMessage(this.streamingMessage)),this.requestStreamingRender());break;case"message_update":if(this.streamingComponent&&event.message.role==="assistant"){event.message.content.some(part=>part.type==="text"&&part.text.trim())&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry")),this.streamingMessage=event.message,this.streamingReveal.setTarget(assistantStreamingHeadMessage(event.message));for(let content of this.streamingMessage.content)if(content.type==="toolCall"){let component=this.pendingTools.get(content.id);component||(component=this.createToolExecutionComponent(content.name,content.id,content.arguments),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(content.id,component));let partialJson=getStreamingToolCallPartialJson(content);partialJson&&this.settingsManager.getSmoothStreaming()?this.toolArgsReveal.update(content.id,component,partialJson):(this.toolArgsReveal.finish(content.id),component.updateArgs(content.arguments))}this.syncTrailingAssistantText(event.message),this.ui.requestRender()}break;case"message_end":if(event.message.role==="user")break;if(this.streamingComponent&&event.message.role==="assistant"){this.streamingMessage=event.message,this.streamingReveal.stop();for(let content of this.streamingMessage.content){if(content.type!=="toolCall")continue;let component=this.pendingTools.get(content.id);component&&!this.toolArgsReveal.flush(content.id,content.arguments)&&component.updateArgs(content.arguments)}this.toolArgsReveal.flushAll();let renderedMessage=abortedMessageForRendering(this.streamingMessage,this.session.retryAttempt,this.session.currentAbortSource);isNetworkProviderMessage(renderedMessage)?this.getProviderErrors().record(renderedMessage.errorMessage??"",this.toolOutputExpanded):(renderedMessage.stopReason==="stop"||renderedMessage.stopReason==="toolUse")&&(this.providerErrors?.clear(),this.clearStatusIndicator("retry"));let errorMessage8=renderedMessage.errorMessage;if(this.syncTrailingAssistantText(renderedMessage),this.assistantTextSegments.clear(),this.addContinuityNotice(renderedMessage),this.streamingMessage.stopReason==="aborted"||this.streamingMessage.stopReason==="error"){errorMessage8||(errorMessage8=this.streamingMessage.errorMessage||"Error");for(let[,component]of this.pendingTools.entries())component.updateResult({content:[{type:"text",text:errorMessage8}],isError:!0});this.clearPendingTools()}else{for(let[,component]of this.pendingTools.entries())component.setArgsComplete();this.maybeShowAssistantDiagnostics(this.streamingMessage),this.maybeShowCacheMissNotice(this.streamingMessage)}this.streamingComponent=void 0,this.streamingMessage=void 0,this.footer.invalidate()}this.ui.requestRender();break;case"bash_execution_update":break;case"tool_execution_start":{if(event.parentToolCallId)break;this.handleToolExecutionStart(event);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,event.args),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolArgsReveal.flush(event.toolCallId,event.args)||component.updateArgs(event.args),component.markExecutionStarted(),this.ui.requestRender();break}case"tool_hook_status":this.handleToolHookStatusEvent(event);break;case"tool_execution_update":{let component=this.pendingTools.get(event.toolCallId);if(component){this.toolResultReveal.update(event.toolCallId,component,event.partialResult)||component.updateResult({...event.partialResult,isError:!1},!0);let activity=readToolProgress(event.partialResult.details)?.activity;if(activity){let label3=formatActiveToolWorkingLabel(event.toolName,{command:activity});this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}this.requestStreamingRender()}break}case"tool_execution_end":{if(event.parentToolCallId)break;this.handleToolExecutionEnd(event),this.toolArgsReveal.finish(event.toolCallId);let component=this.pendingTools.get(event.toolCallId);component||(component=this.createToolExecutionComponent(event.toolName,event.toolCallId,{}),component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),this.pendingTools.set(event.toolCallId,component)),this.toolResultReveal.finish(event.toolCallId),component.updateResult({...event.result,isError:event.isError}),this.pendingTools.delete(event.toolCallId),this.ui.requestRender();break}case"agent_end":this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),this.clearActiveToolExecutionStatus(),this.clearToolHookStatuses(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent&&(this.chatContainer.removeChild(this.streamingComponent),this.streamingComponent=void 0,this.streamingMessage=void 0),this.detachAssistantTextSegments(),this.clearPendingTools(),this.ui.requestRender();break;case"agent_settled":await this.checkShutdownRequested();break;case"agent_idle":this.agentIdle=!0,this.providerErrors?.finish(),this.pendingUserInputs.length===0&&this.clearStatusIndicator("working"),this.ui.requestRender();break;case"continuation_error":this.showError(sanitizeTerminalLabel(event.errorMessage));break;case"transcript_write_failed":{if(this.transcriptWriteNoticeShown)break;this.transcriptWriteNoticeShown=!0;let reason=/^[A-Z][A-Z0-9_]+(?=:)/.exec(event.errorMessage)?.[0]??sanitizeTerminalLabel(event.errorMessage);this.showWarning(`This turn was not saved to the session file (${reason}); the model will not see it after the next prompt.`);break}case"session_abort":this.providerErrors?.clear(),this.clearStatusIndicator("retry"),this.pendingZeroDelayRetryIndicator=void 0,this.ui.requestRender();break;case"compaction_start":{this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!0),this.compactionEscapeOverrideActive||(this.autoCompactionEscapeHandler=this.defaultEditor.onEscape,this.compactionEscapeOverrideActive=!0),this.defaultEditor.onEscape=()=>{this.session.abortCompaction()};let indicator=new CompactionStatusIndicator(this.ui,event.reason);this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear(),this.statusContainer.addChild(indicator),this.autoCompactionProgressText="",this.ui.requestRender();break}case"compaction_progress":{if(this.activeStatusIndicator?.kind!=="compaction")break;let nextText=event.text!==void 0?event.text:`${this.autoCompactionProgressText}${event.delta??""}`;if(!nextText)break;this.autoCompactionProgressText=nextText;let preview=nextText.length>4e3?`...${nextText.slice(nextText.length-4e3)}`:nextText;this.activeStatusIndicator.setProgressText(sanitizeTerminalLabel(preview)),this.ui.requestRender();break}case"compaction_end":{if(this.settingsManager.getShowTerminalProgress()&&this.ui.terminal&&this.ui.terminal.setProgress(!1),_InteractiveMode.restoreCompactionEscapeOverride(this),this.clearStatusIndicator("compaction"),this.autoCompactionProgressText="",event.rejectionCause==="external-owner"&&event.reason!=="manual")this.externalOwnerCompactionNoticeShown||(this.externalOwnerCompactionNoticeShown=!0,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("muted","The Claude Agent SDK manages and compacts this session's context natively."),1,0))),this.footer?.setCompactionDelegated?.(!0);else if(event.aborted){let cancelMessage=sanitizeTerminalLabel(event.errorMessage??"Compaction cancelled");event.reason==="manual"?this.showError(cancelMessage):event.errorMessage?(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(theme.fg("error",cancelMessage),1,0))):this.showStatus("Auto-compaction cancelled")}else if(event.result){this.providerErrors?.clear();let sessionManager=this.session.sessionManager??this.sessionManager,entries=sessionManager?.buildContextEntries?.()??[];if(entries[0]?.type!=="compaction")try{sessionManager?.reloadFromDisk?.(),entries=sessionManager?.buildContextEntries?.()??entries}catch{}this.chatContainer.clear();let summaryMessage=createCompactionSummaryMessage(sanitizeTerminalLabel(event.result.summary),event.result.tokensBefore,new Date().toISOString(),event.result.details);if(typeof this.renderSessionEntries=="function"){let entriesToRender=entries[0]?.type==="compaction"?entries.slice(1):entries.filter(e=>e.type!=="compaction");this.renderSessionEntries(entriesToRender),this.addMessageToChat(summaryMessage),event.result.usage&&this.addCompactionCostNotice({type:"compaction_cost",kind:"compaction",usage:event.result.usage})}else this.rebuildChatFromMessages(),this.addMessageToChat(summaryMessage);this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1)}else if(event.errorMessage){let errorMessage8=sanitizeTerminalLabel(event.errorMessage);isRetryableProviderError(errorMessage8)&&this.providerErrors?.awaitingRetryFinish===!0?this.getProviderErrors().finish(errorMessage8):event.reason==="manual"?this.showError(errorMessage8):this.chatContainer.addChild(new Text(theme.fg("error",errorMessage8),1,0))}else if(event.accepted===!1){let message=`Compaction failed (no result); cause: ${event.rejectionCause??"unknown"}`;event.reason==="manual"?this.showError(message):(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("error",message),1,0)))}if(event.accepted===!0||event.result!==void 0)this.flushCompactionQueue({willRetry:event.willRetry,deferAdmission:!1});else if(event.willRetry===!0){let heldCount=this.compactionQueuedMessages.length;if(heldCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_deferred",{count:heldCount,cause:failureCause}),this.showStatus(`${heldCount} queued message${heldCount===1?"":"s"} will send with the next turn (compaction will retry)`)}this.flushCompactionQueue({willRetry:!0,deferAdmission:!0})}else{let restoredCount=this.restoreQueuedMessagesToEditor();if(restoredCount>0){let failureCause=event.errorMessage??event.rejectionCause??(event.aborted?"aborted":"no-result");this.getSessionLogger().warn("compaction_queue_restored",{restored:restoredCount,cause:failureCause}),this.showStatus(`${restoredCount} queued message${restoredCount===1?"":"s"} restored to the editor (compaction did not complete)`)}}this.ui.requestRender();break}case"model_changed":this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break;case"retry_fallback_applied":{this.pendingZeroDelayRetryIndicator?this.pendingZeroDelayRetryIndicator.fallbackApplied=!0:this.fallbackAppliedBeforeRetryStart=!0,this.showNoticeBox({title:`\u21C4 Model fallback \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:`${usageLimitCause(event.from,event.limit)??`Retry switched models (${event.reason})`}; the turn continues on ${event.to}.`}),this.setExtensionStatus(FALLBACK_STATUS_KEY,`fallback: ${event.to}`),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);break}case"retry_fallback_succeeded":this.showNoticeBox({title:`\u2713 Fallback model responded \xB7 ${event.model}`,tone:"success",why:"The fallback chain answered; the session stays on it until the revert policy fires."});break;case"retry_fallback_reverted":this.showNoticeBox({title:`\u21C4 Reverted to ${event.to}`,tone:"accent",why:event.cause==="fallback-unusable"?`${event.from} cannot serve right now (its account hit a billing or usage limit), so the session is back on the original model.`:"The original model is back after its cooldown lapsed."}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"retry_fallback_exhausted":if(isRetryableProviderError(event.lastError)){this.getProviderErrors().finish(event.lastError),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break}this.showNoticeBox({title:`\u2715 Fallback chain exhausted \xB7 ${event.chainKey}`,tone:"error",why:event.lastError}),this.setExtensionStatus(FALLBACK_STATUS_KEY,void 0);break;case"server_fallback_aborted":this.showNoticeBox({title:`\u26A0 Server fallback aborted \xB7 ${event.from} \u2192 ${event.to}`,tone:"warning",why:event.chainConfigured?"Retrying on your configured fallback chain.":"No fallback chain configured \u2014 set one with /fallback."});break;case"auto_retry_start":{isRetryableProviderError(event.errorMessage)&&this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded),this.retryEscapeHandler=void 0;let fallbackApplied=this.fallbackAppliedBeforeRetryStart;if(this.fallbackAppliedBeforeRetryStart=!1,event.delayMs===0){let pending={fallbackApplied};this.pendingZeroDelayRetryIndicator=pending,queueMicrotask(()=>{this.pendingZeroDelayRetryIndicator===pending&&(this.pendingZeroDelayRetryIndicator=void 0,shouldShowRetryIndicator(event.delayMs,pending.fallbackApplied)&&this.showRetryStatusIndicator(event))})}else this.showRetryStatusIndicator(event);break}case"auto_retry_end":{this.pendingZeroDelayRetryIndicator=void 0,this.fallbackAppliedBeforeRetryStart=!1,this.retryEscapeHandler&&(this.defaultEditor.onEscape=this.retryEscapeHandler,this.retryEscapeHandler=void 0),this.clearStatusIndicator("retry"),event.success||event.finalError==="Retry cancelled"?this.providerErrors?.clear():isRetryableProviderError(event.finalError)?this.getProviderErrors().finish(event.finalError,event.attempt):this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError||"Unknown error"}`),this.ui.requestRender();break}case"summarization_retry_scheduled":{isRetryableProviderError(event.errorMessage)?this.getProviderErrors().retrying(event.errorMessage,this.toolOutputExpanded):this.showError(event.errorMessage),this.showSummarizationRetryStatusIndicator(event);break}case"summarization_retry_attempt_start":{this.clearStatusIndicator("retry"),event.source==="branchSummary"?this.showStatusIndicator(new BranchSummaryStatusIndicator(this.ui)):this.showStatusIndicator(new CompactionStatusIndicator(this.ui,event.reason)),this.ui.requestRender();break}case"summarization_retry_finished":{this.providerErrors?.clearTransient(),this.clearStatusIndicator("retry"),this.ui.requestRender();break}case"retry_probe_scheduled":{let secondsAway=Math.max(0,Math.round((event.atMs-Date.now())/1e3));this.showStatus(`Probing ${sanitizeTerminalLabel(event.selector)} at +${secondsAway}s (#${event.probeIndex})`),this.ui.requestRender();break}case"retry_probe_result":{event.ok?this.showStatus(`Recovered ${sanitizeTerminalLabel(event.selector)} - will restore on next turn`):event.errorMessage==="auth-unavailable"?this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} skipped - auth unavailable, staying on fallback`):this.showStatus(`Probe for ${sanitizeTerminalLabel(event.selector)} failed - staying on fallback`),this.ui.requestRender();break}}}showRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showSummarizationRetryStatusIndicator(event){this.showRetryStatusIndicatorWithCadence(event)}showRetryStatusIndicatorWithCadence(event){let refreshIntervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_RETRY_STATUS_REFRESH_INTERVAL_MS),indicator=refreshIntervalMs===DEFAULT_RETRY_STATUS_REFRESH_INTERVAL_MS?void 0:{intervalMs:refreshIntervalMs};this.showStatusIndicator(new RetryStatusIndicator(this.ui,event.attempt,event.maxAttempts,event.delayMs,indicator,isRetryableProviderError(event.errorMessage))),this.ui.requestRender()}getUserMessageText(message){return message.role!=="user"?"":(typeof message.content=="string"?[{type:"text",text:message.content}]:message.content.filter(content=>content.type==="text")).map(content=>content.text).join("")}showManagedToolStatus(status){this.managedToolStatusStarted||(this.chatContainer.addChild(new Spacer(1)),this.managedToolStatusStarted=!0);let message=status.type==="warning"?`Warning: ${status.message}`:status.message,color=status.type==="warning"?"warning":"dim";this.chatContainer.addChild(new ThemedText(()=>theme.fg(color,message),1,0)),this.lastStatusSpacer=void 0,this.lastStatusText=void 0,this.ui.requestRender()}showStatus(message){let children=this.chatContainer.children,last=children.length>0?children[children.length-1]:void 0,secondLast=children.length>1?children[children.length-2]:void 0;if(last&&secondLast&&last===this.lastStatusText&&secondLast===this.lastStatusSpacer){this.lastStatusMessage=message,this.lastStatusText.invalidate(),this.ui.requestRender();return}let spacer=new Spacer(1);this.lastStatusMessage=message;let text2=new ThemedText(()=>theme.fg("dim",this.lastStatusMessage),1,0);this.chatContainer.addChild(spacer),this.chatContainer.addChild(text2),this.lastStatusSpacer=spacer,this.lastStatusText=text2,this.ui.requestRender()}addCustomEntryToChat(entry){let renderer=this.session.extensionRunner.getEntryRenderer(entry.customType);if(!renderer)return;let component=new CustomEntryComponent(entry,renderer);if(component.setExpanded(this.toolOutputExpanded),!component.hasContent())return;let children=this.chatContainer.children,streamingIndex=this.streamingComponent?children.indexOf(this.streamingComponent):-1,insertIndex=streamingIndex>=0?streamingIndex:children.length,options=this.session.extensionRunner.getEntryRendererOptions(entry.customType),replacedIndex=replacedEntryCardIndex(children,insertIndex,entry,options,child=>child===this.lastStatusText||child===this.lastStatusSpacer);if(replacedIndex>=0){children.splice(replacedIndex,1,component);return}if(streamingIndex>=0){children.splice(streamingIndex,0,component);return}this.chatContainer.addChild(component)}renderPendingUserEcho(text2){let spacer=this.chatContainer.children.length>0?new Spacer(1):void 0;spacer&&this.chatContainer.addChild(spacer);let component=new UserMessageComponent(text2,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(component),this.ui.requestRender();let removePending=()=>{let componentIndex=this.chatContainer.children.indexOf(component);if(componentIndex===-1)return this.chatContainer.children.length;let spacerIndex=spacer?this.chatContainer.children.indexOf(spacer):-1,insertionIndex=spacerIndex>=0?spacerIndex:componentIndex;return spacerIndex>=0&&spacer&&this.chatContainer.removeChild(spacer),this.chatContainer.removeChild(component),insertionIndex};return{replace:message=>{let insertionIndex=removePending(),appendIndex=this.chatContainer.children.length;this.addMessageToChat(message);let canonicalChildren=this.chatContainer.children.splice(appendIndex);!spacer&&canonicalChildren[0]instanceof Spacer&&canonicalChildren.shift()?.dispose?.(),this.chatContainer.children.splice(insertionIndex,0,...canonicalChildren),this.ui.requestRender()},remove:()=>{removePending(),this.ui.requestRender()}}}addMessageToChat(message,options){switch(message.role==="user"&&this.providerErrors?.newTurn(),message.role){case"bashExecution":{let component=new BashExecutionComponent(message.command,this.ui,message.excludeFromContext);message.output&&component.appendOutput(message.output),component.setComplete(message.exitCode,message.cancelled,message.truncated?{truncated:!0}:void 0,message.fullOutputPath),this.chatContainer.addChild(component);break}case"custom":{if(message.display){let renderer=this.session.extensionRunner.getMessageRenderer(message.customType)??builtInMessageRenderer(message.customType),component=new CustomMessageComponent(message,renderer,this.getMarkdownThemeWithSettings(),this.outputPad);component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component)}break}case"compactionSummary":{this.chatContainer.addChild(new Spacer(1));let component=new CompactionSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"branchSummary":{this.chatContainer.addChild(new Spacer(1));let component=new BranchSummaryMessageComponent(message,this.getMarkdownThemeWithSettings());component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component);break}case"system":break;case"user":{let textContent3=this.getUserMessageText(message);if(textContent3){this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1));let skillBlock=parseSkillBlock(textContent3);if(skillBlock){let component=new SkillInvocationMessageComponent(skillBlock,this.getMarkdownThemeWithSettings());if(component.setExpanded(this.toolOutputExpanded),this.chatContainer.addChild(component),skillBlock.userMessage){this.chatContainer.addChild(new Spacer(1));let userComponent=new UserMessageComponent(skillBlock.userMessage,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers());this.chatContainer.addChild(userComponent)}}else{let answer=parseAskUserAnswerFrame(textContent3),userComponent=new UserMessageComponent(textContent3,this.getMarkdownThemeWithSettings(),this.outputPad,this.getMarkdownTransformers(),answer?getAskUserAnswerHeaders(this.sessionManager.getBranch(),answer.requestId):void 0);this.chatContainer.addChild(userComponent)}options?.populateHistory&&this.editor.addToHistory?.(textContent3)}break}case"assistant":{isNetworkProviderMessage(message)?(this.getProviderErrors().record(message.errorMessage??"",this.toolOutputExpanded),this.providerErrors?.finish()):(message.stopReason==="stop"||message.stopReason==="toolUse")&&this.providerErrors?.clear();let assistantComponent=new AssistantMessageComponent(message,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());assistantComponent.setExpanded(this.toolOutputExpanded),assistantComponent.setProviderErrorOwned(isNetworkProviderMessage(message)),this.chatContainer.addChild(assistantComponent);break}case"toolResult":break;case"configurationUpdate":break;default:{let exhaustive=message}}}syncTrailingAssistantText(message){if(!this.streamingComponent)return;this.streamingComponent.setProviderErrorOwned(isNetworkProviderMessage(message));let head=assistantStreamingHeadMessage(message);this.streamingReveal?.isPacingHead(head)||this.streamingComponent.updateContent(head,!0);let content=message.content,firstToolIndex=content.findIndex(block=>block.type==="toolCall");if(firstToolIndex===-1){this.detachAssistantTextSegments();return}let index=firstToolIndex+1;for(;index<content.length;){if(content[index]?.type==="toolCall"){index+=1;continue}let runStart=index,runBlocks=[];for(;index<content.length&&content[index]?.type!=="toolCall";){let runBlock=content[index];runBlock&&runBlocks.push(runBlock),index+=1}let runMessage={...message,content:runBlocks},existing=this.assistantTextSegments.get(runStart);if(existing){existing.setProviderErrorOwned(isNetworkProviderMessage(message)),existing.updateContent(runMessage,!0);continue}let segment2=new AssistantMessageComponent(runMessage,this.hideThinkingBlock,this.getMarkdownThemeWithSettings(),this.hiddenThinkingLabel,this.outputPad,this.getMarkdownTransformers());segment2.setExpanded(this.toolOutputExpanded),segment2.setProviderErrorOwned(isNetworkProviderMessage(message)),this.assistantTextSegments.set(runStart,segment2);let followingToolCall=content.slice(index).find(block=>block.type==="toolCall"),followingToolCallId=followingToolCall?.type==="toolCall"?followingToolCall.id:void 0,followingToolComponent=followingToolCallId?this.pendingTools.get(followingToolCallId):void 0,anchorIndex=followingToolComponent?this.chatContainer.children.indexOf(followingToolComponent):-1;anchorIndex>=0?this.chatContainer.children.splice(anchorIndex,0,segment2):this.chatContainer.addChild(segment2)}for(let[runStart,segment2]of this.assistantTextSegments)(runStart>=content.length||content[runStart]?.type==="toolCall")&&(this.chatContainer.detachChild(segment2),this.assistantTextSegments.delete(runStart))}detachAssistantTextSegments(){for(let segment2 of this.assistantTextSegments.values())this.chatContainer.detachChild(segment2);this.assistantTextSegments.clear()}createToolExecutionComponent(requestedName,toolCallId,args){let toolName=this.session.resolveToolCallName(requestedName);return this.chrome?new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd(),this.chrome.toolPresentation):new ToolExecutionComponent(toolName,toolCallId,args,{showImages:this.settingsManager.getShowImages(),imageWidthCells:this.settingsManager.getImageWidthCells()},this.getRegisteredToolDefinition(toolName),this.ui,this.sessionManager.getCwd())}renderSessionItems(items,options={}){this.providerErrors=void 0,this.copilotToolLimitNoticeSessionId=void 0,this.clearPendingTools(),this.continuityNotices?.reset?.();let renderedPendingTools=new Map,cacheMisses=this.settingsManager.getShowCacheMissNotices()?collectCacheMisses(this.sessionManager.getEntries(),this.session.modelRuntime):new Map;options.updateFooter&&(this.footer.invalidate(),this.updateEditorBorderColor());for(let item of items){if(isCustomSessionEntry(item)){this.addCustomEntryToChat(item);continue}if(isCompactionCostNotice(item)){this.addCompactionCostNotice(item);continue}let message=item;if(message.role==="assistant"){if(replayAssistantTools(message,{expanded:this.toolOutputExpanded,addMessage:part=>this.addMessageToChat(part),addChild:component=>this.chatContainer.addChild(component),createTool:(name,id,args)=>this.createToolExecutionComponent(name,id,args),pending:renderedPendingTools}),message.stopReason!=="aborted"&&message.stopReason!=="error"){this.maybeShowAssistantDiagnostics?.(message,{replay:!0});let miss=cacheMisses.get(message);miss&&this.addCacheMissNotice(miss)}this.addContinuityNotice?.(message)}else if(message.role==="toolResult"){let component=renderedPendingTools.get(message.toolCallId);component&&(component.updateResult(message),renderedPendingTools.delete(message.toolCallId))}else this.addMessageToChat(message,options)}for(let[toolCallId,component]of renderedPendingTools)this.pendingTools.set(toolCallId,component);this.ui.requestRender()}renderSessionEntries(entries,options={}){let items=entries.flatMap(entry=>{if(entry.type==="custom")return[entry];let messages=sessionEntryToContextMessages(entry);return(entry.type==="compaction"||entry.type==="branch_summary")&&entry.usage&&messages.length>0?[...messages,{type:"compaction_cost",kind:entry.type,usage:entry.usage}]:messages});this.renderSessionItems(items,options)}addCompactionCostNotice(notice2){if(!this.settingsManager.getShowCacheMissNotices())return;let{usage:usage3}=notice2,tokens=usage3.input+usage3.output+usage3.cacheRead+usage3.cacheWrite,cost=usage3.cost.total>=.01?` (~$${usage3.cost.total.toFixed(2)})`:"",label3=notice2.kind==="compaction"?"Compaction":"Branch summary";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`${label3}: ${formatTokens(tokens)} tokens billed${cost}`),1,0))}maybeShowAssistantDiagnostics(message,options){for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="github_copilot_tool_limit")continue;let notice2=diagnostic2.details?.message,sessionId=this.sessionManager.getSessionId();typeof notice2!="string"||this.copilotToolLimitNoticeSessionId===sessionId||(this.copilotToolLimitNoticeSessionId=sessionId,this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",notice2),1,0)))}options?.replay||this.maybeShowThinkingDropNotice?.(message)}static countDroppedThinkingBlocks(message){let count=0;for(let diagnostic2 of message.diagnostics??[]){if(diagnostic2.type!=="anthropic_input_transformations")continue;let transformations=diagnostic2.details?.transformations;Array.isArray(transformations)&&(count+=transformations.filter(transformation=>typeof transformation=="object"&&transformation!==null&&transformation.type==="thinking_dropped").length)}return count}maybeShowThinkingDropNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let droppedCount=_InteractiveMode.countDroppedThinkingBlocks(message);if(droppedCount===0)return;let previousDroppedCount=0,branch=this.sessionManager.getBranch();for(let i=branch.length-1;i>=0;i--){let entry=branch[i];if(entry.type==="message"&&entry.message.role==="assistant"){previousDroppedCount=_InteractiveMode.countDroppedThinkingBlocks(entry.message);break}}if(droppedCount<=previousDroppedCount)return;let noun=droppedCount===1?"thinking block":"thinking blocks";this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`Anthropic dropped ${droppedCount} ${noun} (details in session)`),1,0))}addContinuityNotice(message){let notice2=this.continuityNotices.noticeFor(message);notice2&&(this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new Text(notice2,1,0)))}maybeShowCacheMissNotice(message){if(!this.settingsManager.getShowCacheMissNotices())return;let miss=detectCacheMiss(this.sessionManager.getEntries(),message,this.session.modelRuntime);miss&&this.addCacheMissNotice(miss)}addCacheMissNotice(miss){if(miss.missedTokens<2e4&&miss.missedCost<.1)return;let cost=miss.missedCost>=.01?` (~$${miss.missedCost.toFixed(2)})`:"",reBilled=`${formatTokens(miss.missedTokens)} tokens re-billed${cost}`,label3="Cache miss";miss.modelChanged?label3="Cache miss after model switch":miss.idleMs>=3e5&&(label3=`Cache miss after ${Math.round(miss.idleMs/6e4)}m idle`),this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`${label3}: ${reBilled}`),1,0))}renderInitialMessages(){this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let entries=this.sessionManager.buildContextEntries();this.renderSessionEntries(entries,{updateFooter:!0,populateHistory:!0}),this.renderProjectTrustWarningIfNeeded();let compactionCount=this.sessionManager.countCompactions();if(compactionCount>0){let times=compactionCount===1?"1 time":`${compactionCount} times`;this.showStatus(`Session compacted ${times}`)}}renderProjectTrustWarningIfNeeded(){this.settingsManager.isProjectTrusted()||!hasTrustRequiringProjectResources(this.sessionManager.getCwd())||(this.chatContainer.children.length>0&&this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`This project is not trusted. Project ${CONFIG_DIR_NAME} resources and packages are ignored. Use /trust to save a trust decision, then restart pi.`),1,0)))}async getUserInput(){let queuedInput=this.pendingUserInputs.shift();return queuedInput!==void 0?queuedInput:new Promise(resolve46=>{this.onInputCallback=input=>{this.onInputCallback=void 0,resolve46(input)}})}buildMainLoopPromptOptions(userInput){let echoOptions=this.optimisticUserEchoes.promptOptions(userInput.pendingEchoId);return{streamingBehavior:"steer",...userInput.images?{images:userInput.images}:{},...userInput.unknownCommandAsText?{unknownCommandAsText:!0}:{},preflightResult:echoOptions.preflightResult,promptDisposition:disposition=>{echoOptions.promptDisposition(disposition),userInput.ticket?.release(),disposition==="handled"&&this.agentIdle&&this.pendingUserInputs.length===0&&(this.clearStatusIndicator("working"),this.ui.requestRender())}}}rebuildChatFromMessages(){try{this.sessionManager?.reloadFromDisk?.()}catch{}this.chatContainer.clear(),this.renderSessionEntries(this.sessionManager.buildContextEntries())}handleCtrlC(){let now2=Date.now();now2-this.lastSigintTime<500?this.shutdown():(this.clearEditor(),this.lastSigintTime=now2)}handleCtrlD(){this.shutdown()}async shutdown(options){if(this.isShuttingDown)return;this.isShuttingDown=!0,options?.fromSignal&&(await this.sessionControlHost?.disposeActive(),await this.runtimeHost.dispose(),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop(),process.exit(0)),this.themeController.disableAutoSync(),await this.ui.terminal.drainInput(1e3),this.stop({restoreStderr:!1});try{await this.sessionControlHost?.disposeActive(),await this.runtimeHost.dispose()}finally{restoreInteractiveStderr()}let resumeCommand=formatResumeCommand(this.sessionManager);resumeCommand&&process.stdout.write(`${source_default.dim("To resume this session:")} ${resumeCommand}
2621
2621
  `),process.exit(0)}emergencyTerminalExit(crash){this.isShuttingDown=!0;try{appendUncaughtCrashLog(crash.origin,crash.error)}catch{}this.unregisterSignalHandlers(),killTrackedDetachedChildren(),process.exit(129)}uncaughtCrash(error2,origin){if(this.isShuttingDown&&process.exit(1),isDeadTerminalError(error2)&&this.emergencyTerminalExit({origin:`dead-terminal ${origin}`,error:error2}),isRecoverableInspectorVmImportError(error2,origin)){this.showWarning(INSPECTOR_VM_IMPORT_WARNING);return}this.isShuttingDown=!0;try{this.unregisterSignalHandlers()}catch{}try{killTrackedDetachedChildren()}catch{}try{this.pauseQuestionMouseCapture(),this.ui.stop()}catch{}let logged=!1;try{appendUncaughtCrashLog(origin,error2),logged=!0}catch{}restoreInteractiveStderr();let storageMessage=storageWriteCrashMessage(error2);storageMessage!==void 0&&console.error(storageMessage);let summary=(error2 instanceof Error?`${error2.name}: ${error2.message}`:String(error2)).split(`
2622
2622
  `)[0];console.error(`${APP_NAME} exiting due to uncaughtException: ${summary}`),console.error(logged?`Details: ${getDebugLogPath()}`:error2);let extensionHint=this.getCrashExtensionHint?.(error2);extensionHint&&console.error(`
2623
2623
  ${extensionHint}`),process.exit(1)}unhandledRejection(reason){if(isDeadTerminalError(reason)&&this.emergencyTerminalExit({origin:"dead-terminal unhandledRejection",error:reason}),isRecoverableInspectorVmImportError(reason,"unhandledRejection")){this.showWarning(INSPECTOR_VM_IMPORT_WARNING);return}try{appendUnhandledRejectionLog(reason)}catch{}}requestExtensionShutdown(){this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()}async checkShutdownRequested(){this.shutdownRequested&&await this.shutdown()}registerSignalHandlers(){this.unregisterSignalHandlers();let signals=["SIGTERM"];process.platform!=="win32"&&signals.push("SIGHUP");for(let signal of signals){let handler=()=>{killTrackedDetachedChildren(),this.shutdown({fromSignal:!0})};process.prependListener(signal,handler),this.signalCleanupHandlers.push(()=>process.off(signal,handler))}let terminalErrorHandler=error2=>{throw isDeadTerminalError(error2)&&this.emergencyTerminalExit({origin:"dead-terminal stdio error",error:error2}),error2};process.stdout.on("error",terminalErrorHandler),process.stderr.on("error",terminalErrorHandler),this.signalCleanupHandlers.push(()=>process.stdout.off("error",terminalErrorHandler)),this.signalCleanupHandlers.push(()=>process.stderr.off("error",terminalErrorHandler));let uncaughtExceptionHandler=(error2,origin)=>this.uncaughtCrash(error2,origin);process.prependListener("uncaughtException",uncaughtExceptionHandler),this.signalCleanupHandlers.push(()=>process.off("uncaughtException",uncaughtExceptionHandler));let unhandledRejectionHandler=reason=>this.unhandledRejection(reason);process.prependListener("unhandledRejection",unhandledRejectionHandler),this.signalCleanupHandlers.push(()=>process.off("unhandledRejection",unhandledRejectionHandler)),consumeEarlyInspectorVmImportRecoveries()>0&&this.showWarning(INSPECTOR_VM_IMPORT_WARNING)}unregisterSignalHandlers(){for(let cleanup of this.signalCleanupHandlers)cleanup();this.signalCleanupHandlers=[]}handleCtrlZ(){if(process.platform==="win32"){this.showStatus("Suspend to background is not supported on Windows");return}let suspendKeepAlive=setInterval(()=>{},2**30),ignoreSigint=()=>{};process.on("SIGINT",ignoreSigint),process.once("SIGCONT",()=>{clearInterval(suspendKeepAlive),process.removeListener("SIGINT",ignoreSigint),takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture(),this.ui.requestRender(!0)});try{restoreInteractiveStderr(),this.pauseQuestionMouseCapture(),this.ui.stop(),process.kill(0,"SIGTSTP")}catch(error2){throw clearInterval(suspendKeepAlive),process.removeListener("SIGINT",ignoreSigint),error2}}async handleFollowUp(){this.setComposerReply();let rawText=this.getExpandedEditorText(),text2=rawText.trim();if(!text2)return;let unknownCommandAsText=submitsCommandAsText(text2,{rawText});if(isBareSkillNamespace(text2)){this.openSkillPickerForBareNamespace();return}if(this.session.isCompacting){this.isExtensionCommand(text2)?(this.editor.addToHistory?.(text2),this.editor.setText(""),await this.session.prompt(text2)):this.queueCompactionSubmission(text2,"followUp",_InteractiveMode.confirmsRefusedUnknownCommand(this,text2)||unknownCommandAsText);return}let images=this.takeSubmissionImages(text2);if(this.session.isStreaming){if(this.editor.addToHistory?.(text2),this.editor.setText(""),this.isExtensionCommand(text2)){await this.session.prompt(text2);return}let pendingEchoId=this.beginUserEcho(text2,images),followUpAsText=_InteractiveMode.confirmsRefusedUnknownCommand(this,text2)||unknownCommandAsText;try{await this.session.prompt(text2,{streamingBehavior:"followUp",...images.length>0?{images}:{},...followUpAsText?{unknownCommandAsText:!0}:{},...this.optimisticUserEchoes.promptOptions(pendingEchoId)})}catch(error2){if(this.optimisticUserEchoes.reject(pendingEchoId),error2 instanceof UnknownCommandError&&this.reportUnknownCommandRejection(error2,text2))return;throw error2}this.updatePendingMessagesDisplay(),this.ui.requestRender()}else this.editor.onSubmit&&(this.preResolvedSubmissionImages=images.length>0?images:void 0,this.editor.setText(""),this.editor.onSubmit(text2,{rawText}))}handleDequeue(){let restored=this.restoreQueuedMessagesToEditor();restored===0?this.showStatus("No queued messages to restore"):this.showStatus(`Restored ${restored} queued message${restored>1?"s":""} to editor`)}updateEditorBorderColor(){if(this.chrome)this.editor.borderColor=this.chrome.getEditorBorderColor({isBashMode:this.isBashMode,thinkingLevel:this.session.thinkingLevel||"off"});else if(this.isBashMode)this.editor.borderColor=theme.getBashModeBorderColor();else{let level=this.session.thinkingLevel||"off";this.editor.borderColor=theme.getThinkingBorderColor(level)}this.activeStatusIndicator?.invalidate(),this.ui.requestRender()}async cycleThinkingLevel(){this.session.cycleThinkingLevel()===void 0&&this.showStatus("Current model does not support thinking")}async cycleModel(direction){try{let result3=await this.session.cycleModel(direction);if(result3===void 0){let msg=this.session.favoriteModels.length>0?buildFavoriteCycleStatusMessage("single"):buildFavoriteCycleStatusMessage("empty");this.showStatus(msg)}else{if((result3.skippedModels?.length??0)>0&&modelsAreEqual(result3.model,this.session.model)){this.showStatus("No favorite model can fit the current context. Compact the session or start a new one.");return}this.footer.invalidate(),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1),this.updateEditorBorderColor();let thinkingStr=result3.model.reasoning&&result3.thinkingLevel!=="off"?` (thinking: ${result3.thinkingLevel})`:"",systemPromptStr=result3.systemPromptChange?.systemPromptName?`, optimized system prompt applied: ${result3.systemPromptChange.systemPromptName}`:"";this.showStatus(`Switched to ${result3.model.name||result3.model.id}${thinkingStr}${systemPromptStr}`),this.showRiskyMainModelWarning(result3.model),this.maybeWarnAboutAnthropicSubscriptionAuth(result3.model)}}catch(error2){this.showError(error2 instanceof Error?error2.message:String(error2))}}toggleToolOutputExpansion(){this.setToolsExpanded(!this.toolOutputExpanded)}setToolsExpanded(expanded){if(expanded===this.toolOutputExpanded)return;this.toolOutputExpanded=expanded;let activeHeader=this.customHeader??this.builtInHeader;isExpandable(activeHeader)&&activeHeader.setExpanded(expanded);for(let container of[this.loadedResourcesContainer,this.chatContainer])for(let child of container.children)isExpandable(child)&&child.setExpanded(expanded);this.showStatus(`Tool output: ${expanded?"expanded":"collapsed"}`)}toggleThinkingBlockVisibility(){this.hideThinkingBlock=!this.hideThinkingBlock,this.settingsManager.setHideThinkingBlock(this.hideThinkingBlock),this.rebuildChatFromMessages&&(this.chatContainer.clear(),this.rebuildChatFromMessages()),this.streamingComponent&&this.streamingMessage&&(this.streamingComponent.setHideThinkingBlock(this.hideThinkingBlock),this.streamingReveal.resyncVisibility(),this.chatContainer.addChild(this.streamingComponent)),this.showStatus(`Thinking blocks: ${this.hideThinkingBlock?"hidden":"visible"}`)}async handleOpenExternalEditor(){let editorCmd=this.settingsManager.getExternalEditorCommand(),content=this.getExpandedEditorText();this.pauseQuestionMouseCapture(),this.ui.stop(),restoreInteractiveStderr();try{let result3=await editInExternalEditor({command:editorCmd,content});result3.status==="complete"&&this.editor.setText(result3.content)}finally{takeOverInteractiveStderr(),this.ui.start(),this.resumeQuestionMouseCapture(),this.ui.requestRender(!0)}}clearEditor(){this.editor.setText(""),this.ui.requestRender()}showError(errorMessage8){if(isNetworkProviderError(errorMessage8,!0)){this.getProviderErrors().record(errorMessage8,this.toolOutputExpanded),this.ui.requestRender();return}this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("error",`Error: ${sanitizeTuiErrorMessage(errorMessage8)}`),1,0)),this.ui.requestRender()}getProviderErrors(){return this.providerErrors??=new ProviderErrorPresentation(this.chatContainer),this.providerErrors}showNoticeBox(spec2){let sanitized={...spec2,title:sanitizeTuiErrorMessage(spec2.title),why:sanitizeTuiErrorMessage(spec2.why),...spec2.extra===void 0?{}:{extra:spec2.extra.map(line=>({...line,text:sanitizeTuiErrorMessage(line.text)}))},...spec2.expandedLine===void 0?{}:{expandedLine:sanitizeTuiErrorMessage(spec2.expandedLine)}};this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(buildNoticeBox(sanitized,{expanded:this.toolOutputExpanded},theme)),this.ui.requestRender()}showWarning(warningMessage){this.chatContainer.addChild(new Spacer(1)),this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",`Warning: ${warningMessage}`),1,0)),this.ui.requestRender()}showNewVersionNotification(newVersion){let action=BRAND?.update?.command??`${APP_NAME} update`,changelogUrl=getReleaseChangelogUrl(newVersion),changelogLink=getCapabilities().hyperlinks?hyperlink(changelogUrl,changelogUrl):changelogUrl;this.showNoticeBox({title:"Update Available",tone:"warning",why:`New version ${newVersion} is available.`,extra:[{text:action},{text:`Changelog: ${changelogLink}`,tone:"accent"}]})}showRiskyMainModelWarning(model){!model||!isRiskyMainModel(model)||this.showNoticeBox({title:"Risky model warning",tone:"error",why:RISKY_MAIN_MODEL_WARNING})}showSettingsSourceSelected(event){this.showStatus(`Settings: ${path14.basename(event.path)} (${event.format.toUpperCase()})`)}showHighReasoningWarning(event){let{title,body}=buildHighReasoningWarning({id:event.modelId,provider:event.provider},event.thinkingLevel);this.showNoticeBox({title,tone:"error",why:body[0]??"High reasoning may affect reliability or cost.",extra:body.slice(1).map(text2=>({text:text2,tone:"error"}))})}showPackageUpdateNotification(packages){this.showNoticeBox({title:"Package Updates Available",tone:"warning",why:`Package updates are available. Run ${APP_NAME} update --extensions`,extra:[{text:"Packages:",tone:"dim"},...packages.map(pkg=>({text:`- ${pkg}`,tone:"dim"}))]})}getAllQueuedMessages(){return{steering:[...this.session.getSteeringMessages(),...this.compactionInFlightMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text),...this.compactionQueuedMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text)],followUp:[...this.session.getFollowUpMessages(),...this.compactionInFlightMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text),...this.compactionQueuedMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text)]}}clearAllQueues(options={abortWillFollow:!1}){let clearedNative=this.session.clearQueue(options),{steering,followUp}=clearedNative,nativeMessages=clearedNative.ordered??[...steering.map((text2,enqueueOrder)=>({text:text2,mode:"steer",enqueueOrder})),...followUp.map((text2,index)=>({text:text2,mode:"followUp",enqueueOrder:steering.length+index}))],compactionMessages=[...this.compactionInFlightMessages,...this.compactionQueuedMessages],compactionSteering=compactionMessages.filter(msg=>msg.mode==="steer").map(msg=>msg.text),compactionFollowUp=compactionMessages.filter(msg=>msg.mode==="followUp").map(msg=>msg.text);for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.compactionQueuedMessages=[];for(let message of compactionMessages)message.pendingEchoId&&this.optimisticUserEchoes?.remove(message.pendingEchoId);let fallbackOrder=nativeMessages.reduce((maximum,message)=>Math.max(maximum,message.enqueueOrder),0),ordered=[...nativeMessages,...compactionMessages.map((message,index)=>({...message,enqueueOrder:message.enqueueOrder??fallbackOrder+index+1}))].sort((a,b)=>a.enqueueOrder-b.enqueueOrder),cleared={steering:[...steering,...compactionSteering],followUp:[...followUp,...compactionFollowUp]};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}updatePendingMessagesDisplay(){this.sessionControlHost?.noteBufferedElsewhere(this.compactionQueuedMessages.length+this.compactionInFlightMessages.length>0),this.pendingMessagesContainer.clear();let{steering:steeringMessages,followUp:followUpMessages}=this.getAllQueuedMessages();if(steeringMessages.length>0||followUpMessages.length>0){this.pendingMessagesContainer.addChild(new Spacer(1));for(let message of steeringMessages){let text2=theme.fg("dim",`Steering: ${message}`);this.pendingMessagesContainer.addChild(new TruncatedText(text2,1,0))}for(let message of followUpMessages){let text2=theme.fg("dim",`Follow-up: ${message}`);this.pendingMessagesContainer.addChild(new TruncatedText(text2,1,0))}let dequeueHint=this.getAppKeyDisplay("app.message.dequeue"),hintText=theme.fg("dim",`\u21B3 ${dequeueHint} to edit all queued messages`);this.pendingMessagesContainer.addChild(new TruncatedText(hintText,1,0))}}restoreQueuedMessagesToEditor(options){let{steering,followUp,ordered}=this.clearAllQueues({abortWillFollow:options?.abort===!0}),allQueued=ordered?.map(message=>message.text)??[...steering,...followUp];if(allQueued.length===0)return this.updatePendingMessagesDisplay(),options?.abort&&this.session.abort(),0;let queuedText=allQueued.join(`