@code-yeongyu/senpi 2026.10.25-1 → 2026.10.25-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/bundle/chunks/{chunk-BTNYLNWZ.js → chunk-2EFVQWXZ.js} +2 -2
- package/dist/bundle/chunks/{chunk-RHHBXIRN.js → chunk-4WZRVZNX.js} +1 -1
- package/dist/bundle/chunks/{chunk-J5P2VL3Y.js → chunk-B6TPQDBW.js} +1 -1
- package/dist/bundle/chunks/{chunk-VOBD6FQG.js → chunk-FHXR4ZAC.js} +1 -1
- package/dist/bundle/chunks/{chunk-7IRLFYNM.js → chunk-G2UETS2R.js} +2 -2
- package/dist/bundle/chunks/{chunk-URBJS24R.js → chunk-J2U5VDG7.js} +15 -15
- package/dist/bundle/chunks/{chunk-YDCRA5ES.js → chunk-JRXKLIEQ.js} +1 -1
- package/dist/bundle/chunks/{chunk-3VOG6WFU.js → chunk-KJZAY5YH.js} +1 -1
- package/dist/bundle/chunks/{chunk-EYBDBR7V.js → chunk-KUE4AQN6.js} +1 -1
- package/dist/bundle/chunks/{chunk-FWXMMMCV.js → chunk-LYGAV6KU.js} +1 -1
- package/dist/bundle/chunks/{chunk-SGDOZT6B.js → chunk-MXZPAUFB.js} +1 -1
- package/dist/bundle/chunks/chunk-O5RYI3IW.js +2 -0
- package/dist/bundle/chunks/{chunk-II22E3CV.js → chunk-OI4NMCKP.js} +1 -1
- package/dist/bundle/chunks/{chunk-7UUOGZKR.js → chunk-RXKNOEQQ.js} +1 -1
- package/dist/bundle/chunks/{chunk-QH2HSCMX.js → chunk-TTU2RNVX.js} +3 -3
- package/dist/bundle/chunks/{chunk-PXKF2RHD.js → chunk-UFJ2K7Q7.js} +1 -1
- package/dist/bundle/chunks/chunk-VNN2V74Y.js +5 -0
- package/dist/bundle/chunks/{chunk-BMYNMUVZ.js → chunk-W2BKZBYJ.js} +1 -1
- package/dist/bundle/chunks/{chunk-RVYSJBZ7.js → chunk-WFXUCVIR.js} +1 -1
- package/dist/bundle/chunks/{chunk-7WAJCESX.js → chunk-XBUSVKWC.js} +1 -1
- package/dist/bundle/chunks/{chunk-EWOEVVQT.js → chunk-YN7ELQ43.js} +1 -1
- package/dist/bundle/chunks/{cli-main-TABBP55A.js → cli-main-SWKFMTZQ.js} +1 -1
- package/dist/bundle/chunks/{host-command-OQR4RDTM.js → host-command-BC6UWP33.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-U36U7JTE.js → host-lifecycle-TN5NEGNF.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +3 -3
- package/dist/bundle/chunks/{host-session-command-IGB27ZPJ.js → host-session-command-MGVBLBRV.js} +1 -1
- package/dist/bundle/chunks/{host-socket-request-ZDJGSSZO.js → host-socket-request-AS2OCRLP.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-DGQNSXUA.js → interactive-mode-SCSROHD5.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-M7HVUMRH.js → multi-session-host-VTTY5MFT.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-FSR5P6YL.js → package-manager-cli-DZFOC3MF.js} +1 -1
- package/dist/bundle/chunks/{role-M2MTVACJ.js → role-JVSBNKGE.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-SZAJNKKL.js → rpc-mode-TOXYD4XA.js} +1 -1
- package/dist/bundle/chunks/{rpc-monitor-source-OL5KU6NO.js → rpc-monitor-source-B5NQ4ZVH.js} +1 -1
- package/dist/bundle/chunks/{runtime-session-CLNODAYE.js → runtime-session-V5OO7ZRM.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-XBW4EOG5.js → schedule-command-SLISTG4V.js} +1 -1
- package/dist/bundle/chunks/{session-control-endpoint-WEF3XTJR.js → session-control-endpoint-HFFMBALG.js} +1 -1
- package/dist/bundle/chunks/{session-picker-KQUFWDQC.js → session-picker-465FVXQG.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +18 -18
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/host-supervisor.js +3 -3
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/bundle/runtime-manifest.json +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.js +28 -9
- package/dist/core/engine-turn-limit.d.ts +2 -0
- package/dist/core/engine-turn-limit.js +7 -1
- package/dist/core/extensions/builtin/anthropic-subscription/auth-attempt.js +5 -0
- package/dist/core/extensions/builtin/goal/stop-pause.js +2 -1
- package/dist/core/extensions/builtin/loop/session-hold.js +2 -1
- package/dist/core/lifecycle-runtime-facts.js +3 -0
- package/dist/core/lifecycle-session-binding.js +6 -2
- package/dist/core/run-resume-turn.d.ts +1 -0
- package/dist/core/run-resume-turn.js +4 -3
- package/dist/core/stop-resume-directive.d.ts +1 -1
- package/dist/core/stop-resume-directive.js +10 -1
- package/dist/modes/interactive/interactive-mode.js +1 -0
- package/dist/modes/interactive/pause-footer.d.ts +5 -0
- package/dist/modes/interactive/pause-footer.js +2 -0
- package/dist/modes/rpc/host-reservations.js +3 -2
- package/dist/modes/rpc/host-stalled-evidence.js +2 -1
- package/dist/modes/rpc/tool-child/group-ownership.js +4 -2
- package/dist/utils/process-identity.d.ts +7 -0
- package/dist/utils/process-identity.js +32 -5
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-7ASLQ243.js +0 -2
- package/dist/bundle/chunks/chunk-XUFUKDKJ.js +0 -5
|
@@ -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{MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,UNKNOWN_COMMAND_CONFIRM_HINT,UnknownCommandError,assertSessionCwdExists,commandShapedName,findUnknownCommand,formatMissingSessionCwdPrompt,getMissingSessionCwdIssue,isTransportGoneError}from"./chunk-SGDOZT6B.js";import{DEFERRED_RETRY_MS,InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,ensureDir,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,liveSessionHolders,ownRunnerIdentity,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,removeRunnerLease,runDueJobs,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock,writeRunnerLease}from"./chunk-VOBD6FQG.js";import{AccountUsageLimitError,BlockedSkillLinkError,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,CircuitProbes,ContinueFromLeafError,CountdownTimer,DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS,DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,DefaultPackageManager,DynamicBorder,ENGINE_TURN_LIMIT_ENTRY_TYPE,ENGINE_TURN_LIMIT_EVENT,ENGINE_TURN_START_ENTRY_TYPE,ExtensionInputComponent,ExtensionSelectorComponent,FABLE55_LAUNCH,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,InteractiveThemeController,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,STOP_RESUME_CUSTOM_TYPE,SessionSelectorComponent,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,areExperimentalFeaturesEnabled,authorizeSkillPath,buildSkillAllowedSet,configureHttpDispatcher,createFallbackCircuitAccess,describeUsageLimitEntry,describeUsageLimitMessage,engineTurnHistory,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatKeyText,formatSkillInvocationPrompt,getSettingsPath,insideSkillRoot,isBillingErrorMessage,isFable55ModelId,isHealthExhaustionFailure,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,keyDisplayText,keyHint,keyText,minimatch,monotonicNow,observeVisibleStderrWrites,parseGitUrl,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,rawKeyHint,readPiManifest,readSkillFileChecked,readSkillFileCheckedSync,readSkillMarkdownSource,removeSkillInvocationTokens,require_undici,restoreStderr,restoreStdout,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,skillProjectRoot,stopResumeDirective,takeOverStderr,takeOverStdout,trackTurnAdmission,usageLimitCause,usageLimitScope,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-BTNYLNWZ.js";import{TIP_DEFINITIONS}from"./chunk-DXJJP6RP.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,isWSL,migrateKeybindingsConfig}from"./chunk-GXY5JEI5.js";import{ClientAdmissions,ClientMessageIdConflict,ConnectionQuestionBridge,DEFAULT_COMPACTION_SETTINGS,DEFAULT_EXTENSION_SESSION_PROFILE,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,EFFECT_LEDGER_CAPABILITY,EMPTY_SESSION_CONTEXT,EffectLedger,ExecuteToolError,IDLE_COMPACTION_INSTRUCTIONS,ModelSwitchAuthError,ModelUsabilityBudgetError,PROMPT_CACHE_PREWARM_ENTRY_TYPE,RESOLUTION_TIMED_OUT,RUNTIME_EXTENSION_PATH,SERVER_SEARCH_FALLBACK,SESSION_CONTROL_DELIVERY_TYPE,SUMMARIZATION_INPUT_BUDGET_RATIO,SessionExtensionUiRequests,SummarizationOverflowExhaustedError,ToolBarrier,WakeScheduler,acquireFileMutationLock,addUsageToTotals,admitContextToolResults,all_exports,allowOverflowRetry,attachMcpGrantPresentation,attachRestorationDirective,availableModelsData,baseThresholdRatioForWindow,boundSummarizationInput,buildRpcSessionState,builtinProviders,calculateContextTokens,captureAgentCheckpoint,clampThinkingSelection,classifyReasoningCapability,clearMcpGrantPresentations,clientFacingIdentity,clientInputContext,collectEntriesForBranchSummary,combineUsage,compact,compat_exports,completeSimple,computeEffectiveKeepRecentTokens,computeEffectiveThreshold,consumePendingPayload,countDiffChanges,createBlockingRemoteCompactionEvent,createFsWatchEventSource,createRemoteCompactionDeadline,createRestorationDirectiveState,createRestorationTrackerState,createUnifiedPatch,createUsageTotals,cursorProvider,defineTool,degradeQuestion,diffLines,diffWords,disableServerSearch,endCompactionFeedback,estimateContextTokens,estimatePendingPromptTokens,estimateProjectedContextTokens,estimateTokens,estimateTotalTokens,extension_default,extractPatchedPaths,findCutPoint,findTurnStartIndex,formatThinkingClampWarning,generateBranchSummary,generateImages,generateSummary,generateSummaryWithUsage,getApplyPatchWireMode,getBuiltinModelDataGeneratedAt,getCursorContextLimit,getImageModel,getLastAssistantUsage,getMcpGrantPresentation,getModels,getPromptCachePrewarmUsage,getPromptContextWindow,getProviders,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,getUsageCostBreakdown,hasServerSearchFailed,injectTokenBudgetReminder,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,interruptRunningTurn,isAbortedAssistantMessage,isAtHardLimit,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isMissingPathError,isMonitorableMessageEvent,isPowerShellToolResult,isReadToolResult,isServerSearchDisabled,isServerSearchFallback,isSessionControlDeliveryDetails,isToolCallEventType,isWriteToolResult,linkAbortSignal,loadAnthropicOAuth,markServerSearchFallback,markTransientMessage,normalizeApplyPatchArguments,normalizeToolExposure,openAiRemoteCompactionTimeoutMs,parsePatch,persistCheckpoint,prepareBranchEntries,prepareCompaction,preparePendingPayload,projectModelUsabilityBudget,pruneOldMessagesToBudget,recentCheckpoint,registerBundledOAuthFlowLoaders,rememberServerSearchFailure,renderToolDiff,reportRemoteCompactionTimeout,requiresDeterministicCompactionFallback,resetApiProviders,resetServerSearchFailures,resolveBeforeAgentStartMessage,resolveCompactionGeometry,resolveCursorContextWindow,resolveEffectiveReserveTokens,resolveIdleWarmAction,resolvePatchPath,resolveThresholdContextTokens,rpcCommandPayloadError,rpcCommandShapeError,rpcMessageLengthError,runAbort,runGetEffectStatus,runQueuedInputChange,runSetModel,runSetThinkingLevel,runWithRemoteTimeout,selectMcpGrant,serializeConversation,sessionControlSenderOf,sessionDialogRequests,sessionQuestionBridges,sessionRetryFallbackError,settleExtensionUiResponse,shouldCompact,shouldDeferGraceBand,shouldRunIdleCompaction,shouldStartSpeculativeCompaction,shouldTriggerCompaction,shouldWarmAtIdle,shrinkSummarizationInputForOverflowRetry,stream,streamSimple,subscribeSessionRecords,supportsMax,supportsXhigh,toolBarrierSpecError,trackToolCall,watchInbox,withAdditionalTokens,withFileMutationQueue,withResolutionDeadline,withoutServerSearch}from"./chunk-YDCRA5ES.js";import{DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,DEFAULT_SUMMARIZATION_MAX_DURATION_MS,RPC_ERROR_ENTRY_NOT_FOUND,RPC_ERROR_EVAL_CELLS_UNAVAILABLE,RPC_ERROR_EVAL_CELL_NOT_FOUND,RPC_ERROR_INVALID_ARGUMENT,RPC_ERROR_INVALID_EVAL_CELL_REQUEST,RPC_ERROR_MEDIA_NOT_FOUND,RPC_ERROR_MODEL_NOT_FOUND,RPC_ERROR_RESPONSE_TOO_LARGE,RPC_ERROR_UNKNOWN_COMMAND,STEER_WHEN_IDLE_CAPABILITY,StreamDurationBudgetError,StreamIdleTimeoutError,SummarizationTotalBudgetError,USER_ACTIVITY_CAPABILITY,clientMessageIdentity,consumeStreamWithIdleTimeout,createSummarizationDeadline,readClientMessageIdentity,summarizationMaxDurationMs,summarizationTotalBudgetMs}from"./chunk-GY5MR5KR.js";import{FS_WATCH_RETRY_DELAY_MS,SYSTEM_THEME_NAME,Theme,canonicalWatchPath,closeWatcher,findReservedKeywordRuns,findReservedKeywordSpans,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getReservedKeywordHighlight,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,setRegisteredThemes,sharedMarkdownTheme,stopThemeWatcher,theme,watchWithErrorHandler}from"./chunk-EHQXLHRB.js";import{CURRENT_SESSION_VERSION,EventLoopSlicer,GOAL_CONTINUATION_MESSAGE_TYPE,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SESSION_MOVED_IN,SESSION_RELEASED,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,elidedImageIds,environmentContextMessageIfChanged,findLatestResponse,findMostRecentSession,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,hasUnsafeRetainedContent,imageContentId,inheritSessionContextEntryId,isSafeBoundedValue,isVirtualModel,listSessionsFromDir,loadEntriesFromFileAsync,migrateSessionEntries,parseEntryLine,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionCwdMatcher,sessionEntryToContextMessages,sessionFileNameId,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-XF3LJC3O.js";import{currentPathPlatform,knownMove,knownPrefixKeys,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,readJsonFileAsync,resolveMovedPath}from"./chunk-CNPDUC4D.js";import{AuthError,ConnectError,LOG_SINK_RETRY_MS,OAuthFlowError,SessionExpiredError,TimeoutError,ToolExecError,createMcpLogger,delay,fingerprintSecret,isEphemeralIdentity,isInvalidGrant,isMcpNeedsAuthError,isMcpSessionExpiredError,isRetriableMcpError,isTransientTokenError,keyedIdentity,loadMcpSdkAuth,loadMcpSdkStdioTransport,reapProcessTree,redactMcpLogText,reportMcpAsyncError,rotateLogIfNeeded,safeDelay,safeEventBusOn,safeInterval,safeTimer,wrapAsync}from"./chunk-CDRFFHLL.js";import{allocateMonitorId,defaultEvents,parseRpcTarget}from"./chunk-7UUOGZKR.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-Y5OTHMXO.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-MLVIYDHK.js";import{createRgEngine,ensureTool}from"./chunk-TIVW4P37.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{ACCOUNT_POOL_REFUSAL_NOTE,ConfigValueSchema,CredentialFailoverError,MAX_SLOT_BLOCK_MS,NonemptyConfigValueSchema,applyAccountOrder,assertConfigReferenceAuthority,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigReference,isConfigValueConfigured,rememberConfigReferenceOrigin,rendezvousOrder,resolveConfigReference,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,slotKind,slotsOfOwnKind,unusedSlotKinds,warnMissingConfigEnvironment,warnOpaqueConfigEnvironment,withoutOrderedAccount}from"./chunk-3LNSLJ7N.js";import{activeModelBlockUntil,describeModelBlocks,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,usageLimitResetMs,withModelBlock}from"./chunk-MSQCTH6V.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{CredentialSlotRepository,slotHealth}from"./chunk-JFFS72FL.js";import{lockWithLossHandling}from"./chunk-ORXZXUMC.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{readOwnFootprint,readProcessFootprint}from"./chunk-MTQQ2VQH.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest}from"./chunk-3VOG6WFU.js";import{AUTH_KEY_VERIFY_CAPABILITY,AUTO_TITLE_SESSIONS_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,DEFAULT_CUSTOM_EXTENSION_LABEL,EVAL_CELLS_CAPABILITY,EXTENSION_EVENTS_CAPABILITY,GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,INTERACTIVE_USER_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,REQUIRED_HOST_CAPABILITIES,RESUME_SESSION_CAPABILITY,RETRY_FALLBACK_COMMAND_CAPABILITY,SESSION_HELD_CAPABILITY,SESSION_RELOCATION_CAPABILITY,TASK_PARENT_CAPABILITY,TOOL_BARRIER_CAPABILITY,buildCustomUnsupportedRequest,compareEngineOrdinal,decideHostAction,engineBuildIdentity,engineBuildIdentityFrom,gcHostEndpoints,parseClientCapabilities,parseHostProtocolInfo,probeHost,protocolIdentity,stopHost}from"./chunk-BMYNMUVZ.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{listHostEndpoints}from"./chunk-FWXMMMCV.js";import{discoverEnvSlots}from"./chunk-4AOMNOGY.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{TOOL_RUNTIME_UNSUPPORTED_HOST,ToolRuntimeUnsupportedHostError,isHostOwnedToolRuntimeCapability,isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime,resolveToolRuntime,toolRuntimeCapabilities,toolRuntimeHostRefusal}from"./chunk-U67ML6CQ.js";import{source_default}from"./chunk-26UBFF6N.js";import{recordProcessLifetime,resolveCliMainPathAsync,runtimeExecArgv}from"./chunk-7IRLFYNM.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-RHHBXIRN.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,serializeJsonLine}from"./chunk-RVYSJBZ7.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.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,appendDebugLogEntry,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,isLockError,redactSensitiveOutput,redactSensitiveTokenValues}from"./chunk-Z6WGAK7W.js";import{redactResolvedReferenceData,redactResolvedReferenceValues}from"./chunk-DLAY7CIU.js";import{deriveOpenAIPromptCacheKey}from"./chunk-3BTN337S.js";import{installClaudeCodeVersionStore}from"./chunk-QXREUA5F.js";import{resolveRootObjectSchema}from"./chunk-RUGYFYH7.js";import{hasRefusedForcedToolChoice}from"./chunk-OEFCY46F.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DescendantsLedger,HostCallAdmission,LaunchLog,MODULE_JOB_KIND,PayloadRefReader,PayloadRefWriter,TERMINAL_CHILD_JOB_KINDS,TEST_CONTROL_DIR_ENV,TOOL_CHILD_GENERATION_ENV,TOOL_CHILD_MODULE_ROOTS_ENV,TOOL_CHILD_PROTOCOL_VERSION,TerminalManager,TerminalNotifier,WindowsJob,WindowsJobError,createBashInputTool,createBashOutputTool,createBashResizeTool,createKillBashTool,createPtyBashTool,defaultGroupProbes,describeExit,ensureMonitorStateDir,errorResult,formatSize,generationLedgerPath,getTerminalNotificationDelivery,isModelOnlyText,loadKernel32Job,modelOnlyText,packPayload,proofIsOrdered,readTestControls,recordGenerationChild,removeMonitorStateDir,renderMonitorCall,resolveForegroundWindowSeconds,resolveTerminalId,sanitizeTerminalOutput,spawnCommandSession,sweepGroups,sweepStaleGenerations,terminalChildJob,terminalStateDir,textResult,truncateHead,truncateLine,truncateTail,truncateToVisualLines,unpackPayload}from"./chunk-QH2HSCMX.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 as dist_exports2,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-FDL4CF6F.js";import{Agent,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ProviderRetryWatchdogAbortError,STREAMED_DELTA_TYPES,buildProviderContext,createDefaultReadSummary,dist_exports,getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,prepareAgentToolCall,prepareReadFolder,pruneTrackedDetachedChildren,reasonedBeforeFirstDelta,resolveToolNameAlias,runToolCall,sanitizeBinaryOutput,selectedReadFolder,setDefaultStreamFn,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-BWA4FVFW.js";import{require_ignore}from"./chunk-YU4AYH4C.js";import{Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,renderCursorCliModelString,require_dist,shouldRetryOverflowWithoutCompact,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-E6WYH3ZL.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-E4LBKOZG.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-T36LJ6MW.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-QGJLZ6BI.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{sanitizeProviderDiagnostic}from"./chunk-AA2L2RHH.js";import{estimateTextTokens}from"./chunk-4P7WARQZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{ConfigReferenceError,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountDisplayName,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,costCardAt,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,imageErrorResult,isModelType,isOAuthRefreshUnavailableError,isProviderStreamStallError,isProviderTimeoutError,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,pinSlot,projectSlot,providerNotConfiguredMessage,readByProviderId,removeSlot,renameSlotDisplayName,repairManagedSentinelSlots,retryAssistantCall,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-6AOVUTUR.js";import{createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,StaleExtensionContextError,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,dispatchConfigCommand,dispatchHostCommand,dispatchPackageCommand,dispatchScheduleCommand,exitAfterOutput,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,hasModeCrashHandler,isRecoverableInspectorVmImportError,isStaleExtensionContextError,markModeCrashHandler,printThenExit,processBunRuntimeOptions}from"./chunk-7WAJCESX.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{TOOL_CHILD_LIMITS,TOOL_CHILD_ROLE_ENV,openChannelListener}from"./chunk-V3CK2AVC.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerBase,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,isShareDisabledByEnvironment,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-7YO7VQZW.js";import{Check,build_exports,typebox_exports,value_exports,value_exports2}from"./chunk-MIENF2YK.js";import{TOOL_CHILD_LEDGER_ENV,TOOL_CHILD_REENTRY_ENV,TOOL_CHILD_REFS_ROOT_ENV}from"./chunk-OXNWERO4.js";import{ownProcessStartedAtMs,processBootAtMs,sameBoot}from"./chunk-QN2BHP3M.js";import{DEFAULT_COLS,DEFAULT_MAX_SESSIONS,DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,DEFAULT_MONITOR_RUNAWAY_MINUTES,DEFAULT_MONITOR_WAKES_PER_HOUR,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_WINDOW_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,MONITOR_OVERFLOW_FILE_MAX_BYTES,RESTORE_GRACE_MS,RUNAWAY_PAUSE_SUMMARY_PREFIX,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_MONITOR_TOOL,runawayPauseSummary}from"./chunk-NTK2MHJ5.js";import{PROCESS_START_TOLERANCE_MS,sameProcessStartMs}from"./chunk-7ASLQ243.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(win327){return win327===!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,state3={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state3.prefix="./"),output};exports.wrapOutput=(input,state3={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state3.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path14,{windows}={})=>{let segs=path14.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 state3={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state3.maxDepth=0,isPathSeparator(code)||tokens.push(token),state3.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],value2=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value2,depth(tokens[idx]),state3.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value2),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value=input.slice(n);parts.push(value),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value,depth(tokens[tokens.length-1]),state3.maxDepth+=tokens[tokens.length-1].depth),state3.slashes=slashes,state3.parts=parts}return state3};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 value=`[${args.join("-")}]`;try{new RegExp(value)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value="",escaped=!1;for(let ch of input){if(escaped===!0){value+=ch,escaped=!1;continue}if(ch==="\\"){value+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value+=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(value),value="";continue}}}value+=ch}return parts.push(value),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 value=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value)&&(value=value.slice(2,-1),changed=!0);if(isPlainBranch(value))return value.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,value=pattern.trim(),match=parseRepeatedExtglob(value);for(;match;)depth++,value=match.body.trim(),match=parseRepeatedExtglob(value);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse6=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state3={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,state3),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value,eos=()=>state3.index===len-1,peek=state3.peek=(n=1)=>input[state3.index+n],advance=state3.advance=()=>input[++state3.index]||"",remaining=()=>input.slice(state3.index+1),consume=(value2="",num2=0)=>{state3.consumed+=value2,state3.index+=num2},append=token=>{state3.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count2=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state3.start++,count2++;return count2%2===0?!1:(state3.negated=!0,state3.start++,!0)},increment=type2=>{state3[type2]++,stack.push(type2)},decrement=type2=>{state3[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state3.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&&(state3.output=state3.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state3.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,value2)=>{let token={...EXTGLOB_CHARS[value2],conditions:1,inner:""};token.prev=prev,token.parens=state3.parens,token.output=state3.output,token.startIndex=state3.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value2,output:state3.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state3.index+1),body=input.slice(token.startIndex+2,state3.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,open12=tokens[token.tokensIndex];open12.type="text",open12.value=literal,open12.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;state3.output=token.output+open12.output,state3.backtrack=!0,push({type:"paren",extglob:!0,value,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse6(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state3.negatedExtglob=!0)}push({type:"paren",extglob:!0,value,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?(state3.output=input,state3):(state3.output=utils.wrapOutput(output,state3,options),state3)}for(;!eos();){if(value=advance(),value==="\0")continue;if(value==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value+="\\",push({type:"text",value});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state3.index+=slashes,slashes%2!==0&&(value+="\\")),opts.unescape===!0?value=advance():value+=advance(),state3.brackets===0){push({type:"text",value});continue}}if(state3.brackets>0&&(value!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value===":"){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),posix6=POSIX_REGEX_SOURCE[rest2];if(posix6){prev.value=pre+posix6,state3.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value==="["&&peek()!==":"||value==="-"&&peek()==="]")&&(value=`\\${value}`),value==="]"&&(prev.value==="["||prev.value==="[^")&&(value=`\\${value}`),opts.posix===!0&&value==="!"&&prev.value==="["&&(value="^"),prev.value+=value,append({value});continue}if(state3.quotes===1&&value!=='"'){value=utils.escapeRegex(value),prev.value+=value,append({value});continue}if(value==='"'){state3.quotes=state3.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value});continue}if(value==="("){increment("parens"),push({type:"paren",value});continue}if(value===")"){if(state3.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state3.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value,output:state3.parens?")":"\\)"}),decrement("parens");continue}if(value==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value=`\\${value}`}else increment("brackets");push({type:"bracket",value});continue}if(value==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value,output:`\\${value}`});continue}if(state3.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value,output:`\\${value}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value=`/${value}`),prev.value+=value,append({value}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state3.output=state3.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state3.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state3.output+=prev.value;continue}if(value==="{"&&opts.nobrace!==!0){increment("braces");let open12={type:"brace",value,output:"(",outputIndex:state3.output.length,tokensIndex:state3.tokens.length};braces.push(open12),push(open12);continue}if(value==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value,output:value});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),state3.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state3.output.slice(0,brace.outputIndex),toks=state3.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value=output="\\}",state3.output=out;for(let t of toks)state3.output+=t.output||t.value}push({type:"brace",value,output}),decrement("braces"),braces.pop();continue}if(value==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value});continue}if(value===","){let output=value,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value,output});continue}if(value==="/"){if(prev.type==="dot"&&state3.index===state3.start+1){state3.start=state3.index+1,state3.consumed="",state3.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value,output:SLASH_LITERAL});continue}if(value==="."){if(state3.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value,prev.value+=value,brace.dots=!0;continue}if(state3.braces+state3.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value,output:DOT_LITERAL});continue}push({type:"dot",value,output:DOT_LITERAL});continue}if(value==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value}`),push({type:"text",value,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value,output:QMARK_NO_DOT});continue}push({type:"qmark",value,output:QMARK});continue}if(value==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value);continue}if(opts.nonegate!==!0&&state3.index===0){negate();continue}}if(value==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state3.parens>0){push({type:"plus",value});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value,output:""});continue}push({type:"text",value});continue}if(value!=="*"){(value==="$"||value==="^")&&(value=`\\${value}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value+=match[0],state3.index+=match[0].length),push({type:"text",value});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value,prev.output=star,state3.backtrack=!0,state3.globstar=!0,consume(value);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value);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,output:""});continue}let isBrace=state3.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,output:""});continue}for(;rest.slice(0,3)==="/**";){let after2=input[state3.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state3.parens>0&&rest===")".repeat(state3.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value,prev.output=globstar(opts),state3.output=prev.output,state3.globstar=!0,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state3.output=state3.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value,state3.globstar=!0,state3.output+=prior.output+prev.output,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state3.output=state3.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+=value,state3.output+=prior.output+prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state3.output=prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}state3.output=state3.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value,state3.output+=prev.output,state3.globstar=!0,consume(value);continue}let token={type:"star",value,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=value,push(token);continue}(state3.index===state3.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state3.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state3.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state3.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state3.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state3.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state3.output=utils.escapeLast(state3.output,"["),decrement("brackets")}for(;state3.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state3.output=utils.escapeLast(state3.output,"("),decrement("parens")}for(;state3.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state3.output=utils.escapeLast(state3.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state3.backtrack===!0){state3.output="";for(let token of state3.tokens)state3.output+=token.output!=null?token.output:token.value,token.suffix&&(state3.output+=token.suffix)}return state3};parse6.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state3={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,state3),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse6}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse6=require_parse(),utils=require_utils(),constants11=require_constants(),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 state4=isMatch(str3);if(state4)return state4}return!1}}let isState2=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState2)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix6=opts.windows,regex2=isState2?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state3=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:posix6}),result3={glob,state:state3,regex:regex2,posix:posix6,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=state3),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix6}={})=>{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||(posix6?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,posix6):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix6=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix6}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse6(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state3,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state3.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state3.output})${append}`;state3&&state3.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state3),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse6.fastpaths(input,options)),parsed.output||(parsed=parse6(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err){if(options&&options.debug===!0)throw err;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}});function toJsonAssistantMessageEvent(event){if(event.type==="toolcall_start"){let toolCall=event.partial.content[event.contentIndex];if(toolCall?.type!=="toolCall")throw new Error(`toolcall_start content at index ${event.contentIndex} is not a tool call`);let{partial:_partial2,...deltaEvent2}=event;return{...deltaEvent2,id:toolCall.id,toolName:toolCall.name}}if(!("partial"in event))return event;let{partial:_partial,...deltaEvent}=event;return deltaEvent}function toJsonEvent(event){if(event.type!=="message_update")return event;if(event.message.role!=="assistant")throw new Error("message_update message is not an assistant message");return{type:"message_update",usage:event.message.usage,assistantMessageEvent:toJsonAssistantMessageEvent(event.assistantMessageEvent),...event.resolvedToolName===void 0?{}:{resolvedToolName:event.resolvedToolName}}}import{realpathSync as realpathSync2,statSync as statSync2}from"node:fs";import{homedir as homedir2}from"node:os";import{isAbsolute,join as join2,resolve as resolve2,win32}from"node:path";import{existsSync,realpathSync,statSync}from"node:fs";import{homedir}from"node:os";import{dirname,join,resolve}from"node:path";var PROJECT_MARKERS=[".git","pnpm-workspace.yaml","package.json","pyproject.toml","Cargo.toml","go.mod",".venv"],PROJECT_RULE_SUBDIRS=[[".pi","rules"],[".omo","rules"],[".claude","rules"],[".cursor","rules"],[".github","instructions"]],PROJECT_SINGLE_FILES=[".github/copilot-instructions.md","AGENTS.md","CLAUDE.md","CONTEXT.md"],USER_HOME_RULE_SUBDIRS=[".pi/rules",".omo/rules",".opencode/rules",".claude/rules"],USER_HOME_SINGLE_FILES=[".config/opencode/AGENTS.md",".claude/CLAUDE.md"],RULE_FILE_EXTENSIONS=[".md",".mdc"],SOURCE_PRIORITY=new Map([[".pi/rules",0],[".omo/rules",1],[".claude/rules",2],[".cursor/rules",3],[".github/instructions",4],[".github/copilot-instructions.md",5],["AGENTS.md",6],["CLAUDE.md",7],["CONTEXT.md",8],["~/.pi/rules",100],["~/.omo/rules",101],["~/.opencode/rules",102],["~/.claude/rules",103],["~/.config/opencode/AGENTS.md",104],["~/.claude/CLAUDE.md",105]]),GLOBAL_DISTANCE=9999,DEFAULT_MAX_RULE_CHARS=12e3,DEFAULT_MAX_RESULT_CHARS=4e4,TRUNCATION_NOTICE=`
|
|
2
|
+
import{MissingSessionCwdError,RpcClient,RpcClientOpenInFlightError,RpcTransportGoneError,UNKNOWN_COMMAND_CONFIRM_HINT,UnknownCommandError,assertSessionCwdExists,commandShapedName,findUnknownCommand,formatMissingSessionCwdPrompt,getMissingSessionCwdIssue,isTransportGoneError}from"./chunk-MXZPAUFB.js";import{DEFERRED_RETRY_MS,InvalidSidecarStoreError,UnsupportedSidecarStoreVersionError,breakStaleLock,cancelScheduledJob,createScheduledJob,createSidecarStore,encodedSessionId,ensureDir,errorCode,holdSessionFile,isWatchRunnerAvailable,listScheduledJobs,liveSessionHolders,ownRunnerIdentity,publishExclusive,publishReplace,readLeaseText,readProcessStartMs,reclaimInspected,reclaimLockState,removeRunnerLease,runDueJobs,scheduleDir,serializeByKey,sidecarFilePath,unlinkIfPresent,withSessionMoveLock,writeRunnerLease}from"./chunk-FHXR4ZAC.js";import{AccountUsageLimitError,BlockedSkillLinkError,CONTINUE_FROM_LEAF_CUSTOM_TYPE,CONTINUE_FROM_LEAF_DIRECTIVE,CircuitProbes,ContinueFromLeafError,CountdownTimer,DEFAULT_EXTENSION_EVENT_HANDLER_TIMEOUT_MS,DEFAULT_EXTENSION_EVENT_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_QUIT_BUDGET_MS,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_TOOL_NAMES,DefaultPackageManager,DynamicBorder,ENGINE_TURN_LIMIT_ENTRY_TYPE,ENGINE_TURN_LIMIT_EVENT,ENGINE_TURN_START_ENTRY_TYPE,ExtensionInputComponent,ExtensionSelectorComponent,FABLE55_LAUNCH,FileSettingsStorage,HTTP_IDLE_TIMEOUT_CHOICES,InteractiveThemeController,MANUAL_CONTINUE_CUSTOM_TYPE,MANUAL_CONTINUE_DIRECTIVE,SessionSelectorComponent,SettingsManager,TERMINAL_MOUSE_MODES,acquireFallbackCircuits,applyHttpProxySettings,areExperimentalFeaturesEnabled,authorizeSkillPath,buildSkillAllowedSet,configureHttpDispatcher,createFallbackCircuitAccess,describeUsageLimitEntry,describeUsageLimitMessage,engineTurnHistory,engineTurnLimitNotice,engineTurnStop,flushRawStdout,formatHttpIdleTimeoutMs,formatKeyText,formatSkillInvocationPrompt,getSettingsPath,insideSkillRoot,isBillingErrorMessage,isFable55ModelId,isHealthExhaustionFailure,isManualContinueSubmission,isTerminalMouseMode,isUserDirectedTurn,keyDisplayText,keyHint,keyText,minimatch,monotonicNow,observeVisibleStderrWrites,parseGitUrl,parseSettingsJson,parseSkillBlock,parseSkillInvocationTokens,rawKeyHint,readPiManifest,readSkillFileChecked,readSkillFileCheckedSync,readSkillMarkdownSource,removeSkillInvocationTokens,require_undici,resetsEngineTurnHistory,restoreStderr,restoreStdout,shouldRunFirstTimeSetup,shouldSkipSkillWalkDirectoryName,showFirstTimeSetup,showStartupInput,showStartupSelector,skillProjectRoot,stopResumeDirective,takeOverStderr,takeOverStdout,trackTurnAdmission,usageLimitCause,usageLimitScope,waitForRawStdoutBackpressure,wasSelfWrite,writeRawStdout}from"./chunk-2EFVQWXZ.js";import{TIP_DEFINITIONS}from"./chunk-DXJJP6RP.js";import{KEYBINDINGS,KeybindingsManager,QUESTION_ANSWER_FALLBACK_KEY,QUESTION_ANSWER_PRIMARY_KEY,isWSL,migrateKeybindingsConfig}from"./chunk-GXY5JEI5.js";import{ClientAdmissions,ClientMessageIdConflict,ConnectionQuestionBridge,DEFAULT_COMPACTION_SETTINGS,DEFAULT_EXTENSION_SESSION_PROFILE,DURABLE_CLIENT_MESSAGE_ID_CAPABILITY,EFFECT_LEDGER_CAPABILITY,EMPTY_SESSION_CONTEXT,EffectLedger,ExecuteToolError,IDLE_COMPACTION_INSTRUCTIONS,ModelSwitchAuthError,ModelUsabilityBudgetError,PROMPT_CACHE_PREWARM_ENTRY_TYPE,RESOLUTION_TIMED_OUT,RUNTIME_EXTENSION_PATH,SERVER_SEARCH_FALLBACK,SESSION_CONTROL_DELIVERY_TYPE,SUMMARIZATION_INPUT_BUDGET_RATIO,SessionExtensionUiRequests,SummarizationOverflowExhaustedError,ToolBarrier,WakeScheduler,acquireFileMutationLock,addUsageToTotals,admitContextToolResults,all_exports,allowOverflowRetry,attachMcpGrantPresentation,attachRestorationDirective,availableModelsData,baseThresholdRatioForWindow,boundSummarizationInput,buildRpcSessionState,builtinProviders,calculateContextTokens,captureAgentCheckpoint,clampThinkingSelection,classifyReasoningCapability,clearMcpGrantPresentations,clientFacingIdentity,clientInputContext,collectEntriesForBranchSummary,combineUsage,compact,compat_exports,completeSimple,computeEffectiveKeepRecentTokens,computeEffectiveThreshold,consumePendingPayload,countDiffChanges,createBlockingRemoteCompactionEvent,createFsWatchEventSource,createRemoteCompactionDeadline,createRestorationDirectiveState,createRestorationTrackerState,createUnifiedPatch,createUsageTotals,cursorProvider,defineTool,degradeQuestion,diffLines,diffWords,disableServerSearch,endCompactionFeedback,estimateContextTokens,estimatePendingPromptTokens,estimateProjectedContextTokens,estimateTokens,estimateTotalTokens,extension_default,extractPatchedPaths,findCutPoint,findTurnStartIndex,formatThinkingClampWarning,generateBranchSummary,generateImages,generateSummary,generateSummaryWithUsage,getApplyPatchWireMode,getBuiltinModelDataGeneratedAt,getCursorContextLimit,getImageModel,getLastAssistantUsage,getMcpGrantPresentation,getModels,getPromptCachePrewarmUsage,getPromptContextWindow,getProviders,getSupportedThinkingLevels as getSupportedThinkingLevels2,getThinkingClampNotice,getUsageCostBreakdown,hasServerSearchFailed,injectTokenBudgetReminder,installCursorContextLimitPersistence,installImagesProviderScopeAccessor,interruptRunningTurn,isAbortedAssistantMessage,isAtHardLimit,isBashToolResult,isEditToolResult,isFindToolResult,isGrepToolResult,isLsToolResult,isMissingPathError,isMonitorableMessageEvent,isPowerShellToolResult,isReadToolResult,isServerSearchDisabled,isServerSearchFallback,isSessionControlDeliveryDetails,isToolCallEventType,isWriteToolResult,linkAbortSignal,loadAnthropicOAuth,markServerSearchFallback,markTransientMessage,normalizeApplyPatchArguments,normalizeToolExposure,openAiRemoteCompactionTimeoutMs,parsePatch,persistCheckpoint,prepareBranchEntries,prepareCompaction,preparePendingPayload,projectModelUsabilityBudget,pruneOldMessagesToBudget,recentCheckpoint,registerBundledOAuthFlowLoaders,rememberServerSearchFailure,renderToolDiff,reportRemoteCompactionTimeout,requiresDeterministicCompactionFallback,resetApiProviders,resetServerSearchFailures,resolveBeforeAgentStartMessage,resolveCompactionGeometry,resolveCursorContextWindow,resolveEffectiveReserveTokens,resolveIdleWarmAction,resolvePatchPath,resolveThresholdContextTokens,rpcCommandPayloadError,rpcCommandShapeError,rpcMessageLengthError,runAbort,runGetEffectStatus,runQueuedInputChange,runSetModel,runSetThinkingLevel,runWithRemoteTimeout,selectMcpGrant,serializeConversation,sessionControlSenderOf,sessionDialogRequests,sessionQuestionBridges,sessionRetryFallbackError,settleExtensionUiResponse,shouldCompact,shouldDeferGraceBand,shouldRunIdleCompaction,shouldStartSpeculativeCompaction,shouldTriggerCompaction,shouldWarmAtIdle,shrinkSummarizationInputForOverflowRetry,stream,streamSimple,subscribeSessionRecords,supportsMax,supportsXhigh,toolBarrierSpecError,trackToolCall,watchInbox,withAdditionalTokens,withFileMutationQueue,withResolutionDeadline,withoutServerSearch}from"./chunk-JRXKLIEQ.js";import{DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,DEFAULT_SUMMARIZATION_MAX_DURATION_MS,RPC_ERROR_ENTRY_NOT_FOUND,RPC_ERROR_EVAL_CELLS_UNAVAILABLE,RPC_ERROR_EVAL_CELL_NOT_FOUND,RPC_ERROR_INVALID_ARGUMENT,RPC_ERROR_INVALID_EVAL_CELL_REQUEST,RPC_ERROR_MEDIA_NOT_FOUND,RPC_ERROR_MODEL_NOT_FOUND,RPC_ERROR_RESPONSE_TOO_LARGE,RPC_ERROR_UNKNOWN_COMMAND,STEER_WHEN_IDLE_CAPABILITY,StreamDurationBudgetError,StreamIdleTimeoutError,SummarizationTotalBudgetError,USER_ACTIVITY_CAPABILITY,clientMessageIdentity,consumeStreamWithIdleTimeout,createSummarizationDeadline,readClientMessageIdentity,summarizationMaxDurationMs,summarizationTotalBudgetMs}from"./chunk-GY5MR5KR.js";import{FS_WATCH_RETRY_DELAY_MS,SYSTEM_THEME_NAME,Theme,canonicalWatchPath,closeWatcher,findReservedKeywordRuns,findReservedKeywordSpans,getAvailableThemes,getAvailableThemesWithPaths,getEditorTheme,getLanguageFromPath,getMarkdownTheme,getReservedKeywordHighlight,getResolvedThemeColors,getSelectListTheme,getSettingsListTheme,getThemeByName,getThemeExportColors,highlightCode,initTheme,loadThemeFromPath,onThemeChange,parseAutoThemeSetting,probeDirectoryOpenable,setRegisteredThemes,sharedMarkdownTheme,stopThemeWatcher,theme,watchWithErrorHandler}from"./chunk-EHQXLHRB.js";import{CURRENT_SESSION_VERSION,EventLoopSlicer,GOAL_CONTINUATION_MESSAGE_TYPE,REPOSITORY_IDENTITY_ENTRY_TYPE,SESSION_CONTEXT_ENTRY_ID,SESSION_MOVED_IN,SESSION_RELEASED,SessionManager,TRANSPORT_IMAGE_BUDGET_BYTES,VIRTUAL_MODEL_STATE_ENTRY,assertValidSessionId,buildContextEntries,buildSessionContext,buildSessionProjection,compareRepositoryIdentities,convertToLlm,convertToLlmForTransport,createCompactionSummaryMessage,createCustomMessage,createVirtualModel,elidedImageIds,environmentContextMessageIfChanged,findLatestResponse,findMostRecentSession,getBranchSelection,getDefaultSessionDir,getLatestCompactionEntry,getSessionContextEntryId,getVirtualModelState,hasUnsafeRetainedContent,imageContentId,inheritSessionContextEntryId,isSafeBoundedValue,isVirtualModel,listSessionsFromDir,loadEntriesFromFileAsync,migrateSessionEntries,parseEntryLine,parseRepositoryIdentity,parseSessionEntries,readFileLines,readRepositoryIdentity,rejectedImageSources,reserveSessionWrite,resolveEnvironmentContext,sameRepositoryIdentity,sessionCwdMatcher,sessionEntryToContextMessages,sessionFileNameId,toolResultUserWords,unregisterSessionWriter,userWordBlocks,withVirtualModels}from"./chunk-XF3LJC3O.js";import{currentPathPlatform,knownMove,knownPrefixKeys,logGuardEvent,looksMoved,movedPathReason,movedPathWalk,prefixKey,readJsonFileAsync,resolveMovedPath}from"./chunk-CNPDUC4D.js";import{AuthError,ConnectError,LOG_SINK_RETRY_MS,OAuthFlowError,SessionExpiredError,TimeoutError,ToolExecError,createMcpLogger,delay,fingerprintSecret,isEphemeralIdentity,isInvalidGrant,isMcpNeedsAuthError,isMcpSessionExpiredError,isRetriableMcpError,isTransientTokenError,keyedIdentity,loadMcpSdkAuth,loadMcpSdkStdioTransport,reapProcessTree,redactMcpLogText,reportMcpAsyncError,rotateLogIfNeeded,safeDelay,safeEventBusOn,safeInterval,safeTimer,wrapAsync}from"./chunk-CDRFFHLL.js";import{allocateMonitorId,defaultEvents,parseRpcTarget}from"./chunk-RXKNOEQQ.js";import{helpFlagsScope,isPlainHelpRequest,resolveHelpProjectTrust,writeHelpFlagsCache}from"./chunk-Y5OTHMXO.js";import{ProjectTrustStore,bundledBuiltinExtensions,getBundledResourceRoots,getProjectTrustOptions,hasTrustRequiringProjectResources,imagegenSkillPath}from"./chunk-MLVIYDHK.js";import{createRgEngine,ensureTool}from"./chunk-TIVW4P37.js";import{GrepEngineError}from"./chunk-H4QOEVS5.js";import{ACCOUNT_POOL_REFUSAL_NOTE,ConfigValueSchema,CredentialFailoverError,MAX_SLOT_BLOCK_MS,NonemptyConfigValueSchema,applyAccountOrder,assertConfigReferenceAuthority,getConfigValueEnvVarNames,isCommandConfigValue,isCommittedRotationOutput,isConfigReference,isConfigValueConfigured,rememberConfigReferenceOrigin,rendezvousOrder,resolveConfigReference,resolveConfigValue,resolveConfigValueOrThrow,resolveHeadersOrThrow,sleep,slotKind,slotsOfOwnKind,unusedSlotKinds,warnMissingConfigEnvironment,warnOpaqueConfigEnvironment,withoutOrderedAccount}from"./chunk-3LNSLJ7N.js";import{activeModelBlockUntil,describeModelBlocks,mergeModelBlocks,modelBlockKey,pruneModelBlocks,rateLimitModelFamily,usageLimitResetMs,withModelBlock}from"./chunk-MSQCTH6V.js";import{signalSpawnedChild}from"./chunk-KLAX467B.js";import{CredentialSlotRepository,slotHealth}from"./chunk-JFFS72FL.js";import{lockWithLossHandling}from"./chunk-ORXZXUMC.js";import{require_proper_lockfile}from"./chunk-GZVCRV7I.js";import{readOwnFootprint,readProcessFootprint}from"./chunk-MTQQ2VQH.js";import{DEFAULT_HOST_LAUNCH_SPEC,HOST_EXIT_ERROR,HOST_EXIT_FALLBACK,HOST_EXIT_OK,HOST_EXIT_REFUSED,HOST_EXIT_USAGE,HostLaunchSpecError,PINNED_HOST_CLIENT_CAPABILITIES,TUI_PROBE_TIMEOUT_MS,WakeSourceTracker,classifyEndpointLiveness,endpointProbeTimeoutMs,ensureHost,handoffHost,isSessionBusySnapshot,loadHostLaunchSpec,parseHostLaunchSpec,readAllHostStatus,readHostStatus,runHostCommand,runHostRequest}from"./chunk-KJZAY5YH.js";import{AUTH_KEY_VERIFY_CAPABILITY,AUTO_TITLE_SESSIONS_CAPABILITY,CONTINUE_FROM_LEAF_CAPABILITY,DEFAULT_CUSTOM_EXTENSION_LABEL,EVAL_CELLS_CAPABILITY,EXTENSION_EVENTS_CAPABILITY,GENERATION_HANDOFF_CAPABILITY,HOST_PROTOCOL_VERSION,HostEnsureRefusedError,INTERACTIVE_USER_CAPABILITY,MEDIA_PLACEHOLDERS_CAPABILITY,QUESTION_CAPABILITY,QUEUED_MESSAGE_REVISION_CAPABILITY,REQUIRED_HOST_CAPABILITIES,RESUME_SESSION_CAPABILITY,RETRY_FALLBACK_COMMAND_CAPABILITY,SESSION_HELD_CAPABILITY,SESSION_RELOCATION_CAPABILITY,TASK_PARENT_CAPABILITY,TOOL_BARRIER_CAPABILITY,buildCustomUnsupportedRequest,compareEngineOrdinal,decideHostAction,engineBuildIdentity,engineBuildIdentityFrom,gcHostEndpoints,parseClientCapabilities,parseHostProtocolInfo,probeHost,protocolIdentity,stopHost}from"./chunk-W2BKZBYJ.js";import{BUILTIN_PATH_PREFIX,createSourceInfo,createSyntheticSourceInfo,getSyntheticPathSource,isSyntheticPath}from"./chunk-QMRJYMNH.js";import{listHostEndpoints}from"./chunk-LYGAV6KU.js";import{discoverEnvSlots}from"./chunk-4AOMNOGY.js";import{external_exports}from"./chunk-KUPQO7MC.js";import{TOOL_RUNTIME_UNSUPPORTED_HOST,ToolRuntimeUnsupportedHostError,isHostOwnedToolRuntimeCapability,isValidThinkingLevel,normalizeSessionName,parseArgs,printHelp,resolveSessionRuntime,resolveToolRuntime,toolRuntimeCapabilities,toolRuntimeHostRefusal}from"./chunk-U67ML6CQ.js";import{source_default}from"./chunk-26UBFF6N.js";import{recordProcessLifetime,resolveCliMainPathAsync,runtimeExecArgv}from"./chunk-G2UETS2R.js";import{ENDPOINT_REGISTRY_VERSION,createHostDaemonPaths,daemonDirectoryName,shardKey,shardSocketPath,shardSocketPathForKey}from"./chunk-4WZRVZNX.js";import{MAX_RPC_LINE_CHARACTERS,attachJsonlLineReader,serializeJsonLine}from"./chunk-WFXUCVIR.js";import{parseOpenAIImageOutputOptions,parseOpenAIImageSize}from"./chunk-HB35RBP4.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,appendDebugLogEntry,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,isLockError,redactSensitiveOutput,redactSensitiveTokenValues}from"./chunk-Z6WGAK7W.js";import{redactResolvedReferenceData,redactResolvedReferenceValues}from"./chunk-DLAY7CIU.js";import{deriveOpenAIPromptCacheKey}from"./chunk-3BTN337S.js";import{installClaudeCodeVersionStore}from"./chunk-QXREUA5F.js";import{resolveRootObjectSchema}from"./chunk-RUGYFYH7.js";import{hasRefusedForcedToolChoice}from"./chunk-OEFCY46F.js";import{extract429RetryAfterMs,parseRetryAfterMsMarker}from"./chunk-PELNNWGO.js";import{DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DescendantsLedger,HostCallAdmission,LaunchLog,MODULE_JOB_KIND,PayloadRefReader,PayloadRefWriter,TERMINAL_CHILD_JOB_KINDS,TEST_CONTROL_DIR_ENV,TOOL_CHILD_GENERATION_ENV,TOOL_CHILD_MODULE_ROOTS_ENV,TOOL_CHILD_PROTOCOL_VERSION,TerminalManager,TerminalNotifier,WindowsJob,WindowsJobError,createBashInputTool,createBashOutputTool,createBashResizeTool,createKillBashTool,createPtyBashTool,defaultGroupProbes,describeExit,ensureMonitorStateDir,errorResult,formatSize,generationLedgerPath,getTerminalNotificationDelivery,isModelOnlyText,loadKernel32Job,modelOnlyText,packPayload,proofIsOrdered,readTestControls,recordGenerationChild,removeMonitorStateDir,renderMonitorCall,resolveForegroundWindowSeconds,resolveTerminalId,sanitizeTerminalOutput,spawnCommandSession,sweepGroups,sweepStaleGenerations,terminalChildJob,terminalStateDir,textResult,truncateHead,truncateLine,truncateTail,truncateToVisualLines,unpackPayload}from"./chunk-TTU2RNVX.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 as dist_exports2,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-FDL4CF6F.js";import{Agent,EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC,ProviderRetryWatchdogAbortError,STREAMED_DELTA_TYPES,buildProviderContext,createDefaultReadSummary,dist_exports,getPowerShellConfig,getShellConfig,getShellEnv,killProcessTree,killTrackedDetachedChildren,noteDetachedChildExited,prepareAgentToolCall,prepareReadFolder,pruneTrackedDetachedChildren,reasonedBeforeFirstDelta,resolveToolNameAlias,runToolCall,sanitizeBinaryOutput,selectedReadFolder,setDefaultStreamFn,trackDetachedChildPid,untrackDetachedChildPid,withBundledBunCommands}from"./chunk-BWA4FVFW.js";import{require_ignore}from"./chunk-YU4AYH4C.js";import{Compile,StringEnum,compile_exports,composeShellCommand,cursorOverflowCompactionSettings,dropFailedAssistantTurns,getApiProvider,getCursorVariantAlias,getProtocol,getToolCallFormat,installProviderScopeAccessor,isClassifierRefusal,isContextOverflow,isCursorPayloadResourceExhausted,isCursorQuotaResourceExhausted,isCursorZeroTokenResourceExhausted,isRecoverableLength,measureCursorModelInputSerializedBytes,normalizeCursorCatalog,omitUndefinedArgs,parseCursorVariantId,parseEndpointReasoningEfforts,piLimit,piLsPath,piReadArgs,piTimeout,renderCursorCliModelString,require_dist,shouldRetryOverflowWithoutCompact,transformContext,validateToolArguments,warmPromptCache,wrapStreamWithModelRecovery,wrapStreamWithToolCallMiddleware}from"./chunk-E6WYH3ZL.js";import{supportsAllowedToolChoice}from"./chunk-COH5F7QV.js";import{hasCredentialHeaders,isCredentialHeaderName}from"./chunk-RFB5CBW7.js";import{extractChatGptSubscriptionAccountId,getWireIdentity,setWireIdentity}from"./chunk-2VZJTDUX.js";import{convertResponsesMessages,getContextProvenance,isOpenAIResponsesPromptCacheModel}from"./chunk-E4LBKOZG.js";import{SERVER_FALLBACK_ABORTED_DIAGNOSTIC,findEnvKeys,getEnvApiKey,sanitizeAnthropicToolPairs}from"./chunk-T36LJ6MW.js";import{getAnthropicCompat,isAnthropicApiBaseUrl,resolvePromptCacheLifetime,resolvePromptCacheTtlSeconds}from"./chunk-QGJLZ6BI.js";import{cleanupSessionResources,processSingleton}from"./chunk-WHPDEDCC.js";import{sanitizeProviderDiagnostic}from"./chunk-AA2L2RHH.js";import{estimateTextTokens}from"./chunk-4P7WARQZ.js";import{parseStreamingJson}from"./chunk-3W47LTXQ.js";import{ConfigReferenceError,LEGACY_PROVIDER_IDS,ModelsError,TURN_RETRY_SUPPRESSION_PREFIX,accountDisplayName,accountLabel,appendLoginSlot,assertChatModel,assertClassifierModel,assertImageModel,calculateCost,clampThinkingLevel,classifierErrorResult,collapseSystemMessages,contentText,costCardAt,createModels,describeProviderFailureForUser,getCurrentSystemMessage,getCurrentSystemPrompt,getCurrentTools,getInitialSystemMessage,getModelType,getSupportedThinkingLevels,imageErrorResult,isModelType,isOAuthRefreshUnavailableError,isProviderStreamStallError,isProviderTimeoutError,isRetryableAssistantError,isRetryableErrorMessage,lazyStream,legacyProviderIdRejection,listSlots,modelsAreEqual,normalizeContext,normalizeProviderId,pinSlot,projectSlot,providerNotConfiguredMessage,readByProviderId,removeSlot,renameSlotDisplayName,repairManagedSentinelSlots,retryAssistantCall,retryTransientCall,stripProviderRequestIds,stripTurnRetrySuppressionPrefix,supportsConfigurationUpdate,upsertSlot}from"./chunk-6AOVUTUR.js";import{createAssistantMessageDiagnostic,createAssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{INSPECTOR_VM_IMPORT_WARNING,MIN_BUN_VERSION,RUNTIME_ENV_VAR,StaleExtensionContextError,bunVersionSatisfies,checkForNewPiVersion,consumeEarlyInspectorVmImportRecoveries,dispatchConfigCommand,dispatchHostCommand,dispatchPackageCommand,dispatchScheduleCommand,exitAfterOutput,findBunBinary,getPiUserAgent,getReleaseChangelogUrl,hasInheritedInspectorOption,hasModeCrashHandler,isRecoverableInspectorVmImportError,isStaleExtensionContextError,markModeCrashHandler,printThenExit,processBunRuntimeOptions}from"./chunk-XBUSVKWC.js";import{require_semver}from"./chunk-ZOFZRJSL.js";import{fetchWithRetry}from"./chunk-2SOVDETB.js";import{TOOL_CHILD_LIMITS,TOOL_CHILD_ROLE_ENV,openChannelListener}from"./chunk-V3CK2AVC.js";import{APP_COMMAND,APP_NAME,APP_TITLE,BRAND,CONFIG_DIR_NAME,CONFIG_FLAT_LAYOUT,DISPLAY_VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,FLAT_LAYOUT_SENTINEL,PACKAGE_NAME,VERSION,canonicalizePath,detectInstallMethod,envValue,expandTildePath,findNodePackageDir,formatPathRelativeToCwdOrAbsolute,getAgentDir,getAuthPath,getBinDir,getBundledInteractiveAssetPath,getChangelogPath,getCwdRelativePath,getDebugLogPath,getDocsPath,getExamplesPath,getExportTemplateDir,getFileContentRevision,getFileRevision,getInstallPackageDir,getModelsPath,getPackageDir,getReadmePath,getSessionsDir,getShareViewerBase,isBunBinary,isBunRuntime,isBundledNode,isLocalPath,isShareDisabledByEnvironment,normalizePath,realpathWithoutOpen,realpathWithoutOpenStrict,resolveAgentDir,resolveInstallPath,resolvePath,splitBom,stripBom,waitForChildProcess}from"./chunk-7YO7VQZW.js";import{Check,build_exports,typebox_exports,value_exports,value_exports2}from"./chunk-MIENF2YK.js";import{TOOL_CHILD_LEDGER_ENV,TOOL_CHILD_REENTRY_ENV,TOOL_CHILD_REFS_ROOT_ENV}from"./chunk-OXNWERO4.js";import{ownProcessStartedAtMs,processBootAtMs,sameBoot}from"./chunk-QN2BHP3M.js";import{DEFAULT_COLS,DEFAULT_MAX_SESSIONS,DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,DEFAULT_MONITOR_RUNAWAY_MINUTES,DEFAULT_MONITOR_WAKES_PER_HOUR,DEFAULT_ROWS,DEFAULT_SCROLLBACK,DURABLE_MONITOR_EXPIRY_MS,FIRE_BUDGET_WINDOW_MS,MONITOR_ENV_DOWNTIME_MS,MONITOR_ENV_ID,MONITOR_ENV_RESTORED,MONITOR_ENV_STATE_DIR,MONITOR_OVERFLOW_FILE_MAX_BYTES,RESTORE_GRACE_MS,RUNAWAY_PAUSE_SUMMARY_PREFIX,TERMINAL_BASH_TOOL,TERMINAL_COMPANION_TOOLS,TERMINAL_MONITOR_TOOL,runawayPauseSummary}from"./chunk-NTK2MHJ5.js";import{PROCESS_START_TOLERANCE_MS,sameProcessStartMs}from"./chunk-O5RYI3IW.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(win327){return win327===!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,state3={})=>{let output=input;return output.startsWith("./")&&(output=output.slice(2),state3.prefix="./"),output};exports.wrapOutput=(input,state3={},options={})=>{let prepend=options.contains?"":"^",append=options.contains?"":"$",output=`${prepend}(?:${input})${append}`;return state3.negated===!0&&(output=`(?:^(?!${output}).*$)`),output};exports.basename=(path14,{windows}={})=>{let segs=path14.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 state3={prefix,input,start,base,glob,isBrace,isBracket,isGlob,isExtglob,isGlobstar,negated,negatedExtglob};if(opts.tokens===!0&&(state3.maxDepth=0,isPathSeparator(code)||tokens.push(token),state3.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],value2=input.slice(n2,i);opts.tokens&&(idx===0&&start!==0?(tokens[idx].isPrefix=!0,tokens[idx].value=prefix):tokens[idx].value=value2,depth(tokens[idx]),state3.maxDepth+=tokens[idx].depth),i>=start&&(parts.push(value2),prevIndex=i)}let n=prevIndex!==void 0?prevIndex+1:start,value=input.slice(n);parts.push(value),opts.tokens&&prevIndex&&prevIndex+1<input.length&&(tokens[tokens.length-1].value=value,depth(tokens[tokens.length-1]),state3.maxDepth+=tokens[tokens.length-1].depth),state3.slashes=slashes,state3.parts=parts}return state3};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 value=`[${args.join("-")}]`;try{new RegExp(value)}catch{return args.map(v=>utils.escapeRegex(v)).join("..")}return value},syntaxError=(type2,char)=>`Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`,splitTopLevel=input=>{let parts=[],bracket=0,paren=0,quote=0,value="",escaped=!1;for(let ch of input){if(escaped===!0){value+=ch,escaped=!1;continue}if(ch==="\\"){value+=ch,escaped=!0;continue}if(ch==='"'){quote=quote===1?0:1,value+=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(value),value="";continue}}}value+=ch}return parts.push(value),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 value=branch.trim(),changed=!0;for(;changed===!0;)changed=!1,/^@\([^\\()[\]{}|]+\)$/.test(value)&&(value=value.slice(2,-1),changed=!0);if(isPlainBranch(value))return value.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,value=pattern.trim(),match=parseRepeatedExtglob(value);for(;match;)depth++,value=match.body.trim(),match=parseRepeatedExtglob(value);return depth},analyzeRepeatedExtglob=(body,options)=>{if(options.maxExtglobRecursion===!1)return{risky:!1};let max=typeof options.maxExtglobRecursion=="number"?options.maxExtglobRecursion:constants11.DEFAULT_MAX_EXTGLOB_RECURSION,branches=splitTopLevel(body).map(branch=>branch.trim());if(branches.length>1&&(branches.some(branch=>branch==="")||branches.some(branch=>/^[*?]+$/.test(branch))||hasRepeatedCharPrefixOverlap(branches)))return{risky:!0};let safeChars=[],sawStarSequence=!1,combinable=!0;for(let branch of branches){let chars=getStarExtglobSequenceChars(branch);if(chars){sawStarSequence=!0,safeChars.push(...chars);continue}let literal=normalizeSimpleBranch(branch);if(literal&&literal.length===1){safeChars.push(literal);continue}if(combinable=!1,repeatedExtglobRecursion(branch)>max)return{risky:!0}}return sawStarSequence?combinable?{risky:!0,safeOutput:buildCharClassStar([...new Set(safeChars)])}:{risky:!0}:{risky:!1}},parse6=(input,options)=>{if(typeof input!="string")throw new TypeError("Expected a string");input=REPLACEMENTS[input]||input;let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);let bos={type:"bos",value:"",output:opts.prepend||""},tokens=[bos],capture=opts.capture?"":"?:",PLATFORM_CHARS=constants11.globChars(opts.windows),EXTGLOB_CHARS=constants11.extglobChars(PLATFORM_CHARS),{DOT_LITERAL,PLUS_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOT_SLASH,NO_DOTS_SLASH,QMARK,QMARK_NO_DOT,STAR,START_ANCHOR}=PLATFORM_CHARS,globstar=opts2=>`(${capture}(?:(?!${START_ANCHOR}${opts2.dot?DOTS_SLASH:DOT_LITERAL}).)*?)`,nodot=opts.dot?"":NO_DOT,qmarkNoDot=opts.dot?QMARK:QMARK_NO_DOT,star=opts.bash===!0?globstar(opts):STAR;opts.capture&&(star=`(${star})`),typeof opts.noext=="boolean"&&(opts.noextglob=opts.noext);let state3={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,state3),len=input.length;let extglobs=[],braces=[],stack=[],prev=bos,value,eos=()=>state3.index===len-1,peek=state3.peek=(n=1)=>input[state3.index+n],advance=state3.advance=()=>input[++state3.index]||"",remaining=()=>input.slice(state3.index+1),consume=(value2="",num2=0)=>{state3.consumed+=value2,state3.index+=num2},append=token=>{state3.output+=token.output!=null?token.output:token.value,consume(token.value)},negate=()=>{let count2=1;for(;peek()==="!"&&(peek(2)!=="("||peek(3)==="?");)advance(),state3.start++,count2++;return count2%2===0?!1:(state3.negated=!0,state3.start++,!0)},increment=type2=>{state3[type2]++,stack.push(type2)},decrement=type2=>{state3[type2]--,stack.pop()},push=tok=>{if(prev.type==="globstar"){let isBrace=state3.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&&(state3.output=state3.output.slice(0,-prev.output.length),prev.type="star",prev.value="*",prev.output=star,state3.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,value2)=>{let token={...EXTGLOB_CHARS[value2],conditions:1,inner:""};token.prev=prev,token.parens=state3.parens,token.output=state3.output,token.startIndex=state3.index,token.tokensIndex=tokens.length;let output=(opts.capture?"(":"")+token.open;increment("parens"),push({type:type2,value:value2,output:state3.output?"":ONE_CHAR}),push({type:"paren",extglob:!0,value:advance(),output}),extglobs.push(token)},extglobClose=token=>{let literal=input.slice(token.startIndex,state3.index+1),body=input.slice(token.startIndex+2,state3.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,open12=tokens[token.tokensIndex];open12.type="text",open12.value=literal,open12.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;state3.output=token.output+open12.output,state3.backtrack=!0,push({type:"paren",extglob:!0,value,output:""}),decrement("parens");return}let output=token.close+(opts.capture?")":""),rest;if(token.type==="negate"){let extglobStar=star;if(token.inner&&token.inner.length>1&&token.inner.includes("/")&&(extglobStar=globstar(opts)),(extglobStar!==star||eos()||/^\)+$/.test(remaining()))&&(output=token.close=`)$))${extglobStar}`),token.inner.includes("*")&&(rest=remaining())&&/^\.[^\\/.]+$/.test(rest)){let expression=parse6(rest,{...options,fastpaths:!1}).output;output=token.close=`)${expression})${extglobStar})`}token.prev.type==="bos"&&(state3.negatedExtglob=!0)}push({type:"paren",extglob:!0,value,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?(state3.output=input,state3):(state3.output=utils.wrapOutput(output,state3,options),state3)}for(;!eos();){if(value=advance(),value==="\0")continue;if(value==="\\"){let next=peek();if(next==="/"&&opts.bash!==!0||next==="."||next===";")continue;if(!next){value+="\\",push({type:"text",value});continue}let match=/^\\+/.exec(remaining()),slashes=0;if(match&&match[0].length>2&&(slashes=match[0].length,state3.index+=slashes,slashes%2!==0&&(value+="\\")),opts.unescape===!0?value=advance():value+=advance(),state3.brackets===0){push({type:"text",value});continue}}if(state3.brackets>0&&(value!=="]"||prev.value==="["||prev.value==="[^")){if(opts.posix!==!1&&value===":"){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),posix6=POSIX_REGEX_SOURCE[rest2];if(posix6){prev.value=pre+posix6,state3.backtrack=!0,advance(),!bos.output&&tokens.indexOf(prev)===1&&(bos.output=ONE_CHAR);continue}}}(value==="["&&peek()!==":"||value==="-"&&peek()==="]")&&(value=`\\${value}`),value==="]"&&(prev.value==="["||prev.value==="[^")&&(value=`\\${value}`),opts.posix===!0&&value==="!"&&prev.value==="["&&(value="^"),prev.value+=value,append({value});continue}if(state3.quotes===1&&value!=='"'){value=utils.escapeRegex(value),prev.value+=value,append({value});continue}if(value==='"'){state3.quotes=state3.quotes===1?0:1,opts.keepQuotes===!0&&push({type:"text",value});continue}if(value==="("){increment("parens"),push({type:"paren",value});continue}if(value===")"){if(state3.parens===0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","("));let extglob=extglobs[extglobs.length-1];if(extglob&&state3.parens===extglob.parens+1){extglobClose(extglobs.pop());continue}push({type:"paren",value,output:state3.parens?")":"\\)"}),decrement("parens");continue}if(value==="["){if(opts.nobracket===!0||!remaining().includes("]")){if(opts.nobracket!==!0&&opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));value=`\\${value}`}else increment("brackets");push({type:"bracket",value});continue}if(value==="]"){if(opts.nobracket===!0||prev&&prev.type==="bracket"&&prev.value.length===1){push({type:"text",value,output:`\\${value}`});continue}if(state3.brackets===0){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("opening","["));push({type:"text",value,output:`\\${value}`});continue}decrement("brackets");let prevValue=prev.value.slice(1);if(prev.posix!==!0&&prevValue[0]==="^"&&!prevValue.includes("/")&&(value=`/${value}`),prev.value+=value,append({value}),opts.literalBrackets===!1||utils.hasRegexChars(prevValue))continue;let escaped=utils.escapeRegex(prev.value);if(state3.output=state3.output.slice(0,-prev.value.length),opts.literalBrackets===!0){state3.output+=escaped,prev.value=escaped;continue}prev.value=`(${capture}${escaped}|${prev.value})`,state3.output+=prev.value;continue}if(value==="{"&&opts.nobrace!==!0){increment("braces");let open12={type:"brace",value,output:"(",outputIndex:state3.output.length,tokensIndex:state3.tokens.length};braces.push(open12),push(open12);continue}if(value==="}"){let brace=braces[braces.length-1];if(opts.nobrace===!0||!brace){push({type:"text",value,output:value});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),state3.backtrack=!0}if(brace.comma!==!0&&brace.dots!==!0){let out=state3.output.slice(0,brace.outputIndex),toks=state3.tokens.slice(brace.tokensIndex);brace.value=brace.output="\\{",value=output="\\}",state3.output=out;for(let t of toks)state3.output+=t.output||t.value}push({type:"brace",value,output}),decrement("braces"),braces.pop();continue}if(value==="|"){extglobs.length>0&&extglobs[extglobs.length-1].conditions++,push({type:"text",value});continue}if(value===","){let output=value,brace=braces[braces.length-1];brace&&stack[stack.length-1]==="braces"&&(brace.comma=!0,output="|"),push({type:"comma",value,output});continue}if(value==="/"){if(prev.type==="dot"&&state3.index===state3.start+1){state3.start=state3.index+1,state3.consumed="",state3.output="",tokens.pop(),prev=bos;continue}push({type:"slash",value,output:SLASH_LITERAL});continue}if(value==="."){if(state3.braces>0&&prev.type==="dot"){prev.value==="."&&(prev.output=DOT_LITERAL);let brace=braces[braces.length-1];prev.type="dots",prev.output+=value,prev.value+=value,brace.dots=!0;continue}if(state3.braces+state3.parens===0&&prev.type!=="bos"&&prev.type!=="slash"){push({type:"text",value,output:DOT_LITERAL});continue}push({type:"dot",value,output:DOT_LITERAL});continue}if(value==="?"){if(!(prev&&prev.value==="(")&&opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("qmark",value);continue}if(prev&&prev.type==="paren"){let next=peek(),output=value;(prev.value==="("&&!/[!=<:]/.test(next)||next==="<"&&!/<([!=]|\w+>)/.test(remaining()))&&(output=`\\${value}`),push({type:"text",value,output});continue}if(opts.dot!==!0&&(prev.type==="slash"||prev.type==="bos")){push({type:"qmark",value,output:QMARK_NO_DOT});continue}push({type:"qmark",value,output:QMARK});continue}if(value==="!"){if(opts.noextglob!==!0&&peek()==="("&&(peek(2)!=="?"||!/[!=<:]/.test(peek(3)))){extglobOpen("negate",value);continue}if(opts.nonegate!==!0&&state3.index===0){negate();continue}}if(value==="+"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){extglobOpen("plus",value);continue}if(prev&&prev.value==="("||opts.regex===!1){push({type:"plus",value,output:PLUS_LITERAL});continue}if(prev&&(prev.type==="bracket"||prev.type==="paren"||prev.type==="brace")||state3.parens>0){push({type:"plus",value});continue}push({type:"plus",value:PLUS_LITERAL});continue}if(value==="@"){if(opts.noextglob!==!0&&peek()==="("&&peek(2)!=="?"){push({type:"at",extglob:!0,value,output:""});continue}push({type:"text",value});continue}if(value!=="*"){(value==="$"||value==="^")&&(value=`\\${value}`);let match=REGEX_NON_SPECIAL_CHARS.exec(remaining());match&&(value+=match[0],state3.index+=match[0].length),push({type:"text",value});continue}if(prev&&(prev.type==="globstar"||prev.star===!0)){prev.type="star",prev.star=!0,prev.value+=value,prev.output=star,state3.backtrack=!0,state3.globstar=!0,consume(value);continue}let rest=remaining();if(opts.noextglob!==!0&&/^\([^?]/.test(rest)){extglobOpen("star",value);continue}if(prev.type==="star"){if(opts.noglobstar===!0){consume(value);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,output:""});continue}let isBrace=state3.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,output:""});continue}for(;rest.slice(0,3)==="/**";){let after2=input[state3.index+4];if(after2&&after2!=="/")break;rest=rest.slice(3),consume("/**",3)}let isEnd=eos()||state3.parens>0&&rest===")".repeat(state3.parens)&&!extglobs.some(extglob=>extglob.type==="negate");if(prior.type==="bos"&&eos()){prev.type="globstar",prev.value+=value,prev.output=globstar(opts),state3.output=prev.output,state3.globstar=!0,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&!afterStar&&isEnd){state3.output=state3.output.slice(0,-(prior.output+prev.output).length),prior.output=`(?:${prior.output}`,prev.type="globstar",prev.output=globstar(opts)+(opts.strictSlashes?")":"|$)"),prev.value+=value,state3.globstar=!0,state3.output+=prior.output+prev.output,consume(value);continue}if(prior.type==="slash"&&prior.prev.type!=="bos"&&rest[0]==="/"){let end=rest[1]!==void 0?"|$":"";state3.output=state3.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+=value,state3.output+=prior.output+prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}if(prior.type==="bos"&&rest[0]==="/"){prev.type="globstar",prev.value+=value,prev.output=`(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`,state3.output=prev.output,state3.globstar=!0,consume(value+advance()),push({type:"slash",value:"/",output:""});continue}state3.output=state3.output.slice(0,-prev.output.length),prev.type="globstar",prev.output=globstar(opts),prev.value+=value,state3.output+=prev.output,state3.globstar=!0,consume(value);continue}let token={type:"star",value,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=value,push(token);continue}(state3.index===state3.start||prev.type==="slash"||prev.type==="dot")&&(prev.type==="dot"?(state3.output+=NO_DOT_SLASH,prev.output+=NO_DOT_SLASH):opts.dot===!0?(state3.output+=NO_DOTS_SLASH,prev.output+=NO_DOTS_SLASH):(state3.output+=nodot,prev.output+=nodot),peek()!=="*"&&(state3.output+=ONE_CHAR,prev.output+=ONE_CHAR)),push(token)}for(;state3.brackets>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","]"));state3.output=utils.escapeLast(state3.output,"["),decrement("brackets")}for(;state3.parens>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing",")"));state3.output=utils.escapeLast(state3.output,"("),decrement("parens")}for(;state3.braces>0;){if(opts.strictBrackets===!0)throw new SyntaxError(syntaxError("closing","}"));state3.output=utils.escapeLast(state3.output,"{"),decrement("braces")}if(opts.strictSlashes!==!0&&(prev.type==="star"||prev.type==="bracket")&&push({type:"maybe_slash",value:"",output:`${SLASH_LITERAL}?`}),state3.backtrack===!0){state3.output="";for(let token of state3.tokens)state3.output+=token.output!=null?token.output:token.value,token.suffix&&(state3.output+=token.suffix)}return state3};parse6.fastpaths=(input,options)=>{let opts={...options},max=typeof opts.maxLength=="number"?Math.min(MAX_LENGTH,opts.maxLength):MAX_LENGTH,len=input.length;if(len>max)throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);input=REPLACEMENTS[input]||input;let{DOT_LITERAL,SLASH_LITERAL,ONE_CHAR,DOTS_SLASH,NO_DOT,NO_DOTS,NO_DOTS_SLASH,STAR,START_ANCHOR}=constants11.globChars(opts.windows),nodot=opts.dot?NO_DOTS:NO_DOT,slashDot=opts.dot?NO_DOTS_SLASH:NO_DOT,capture=opts.capture?"":"?:",state3={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,state3),source2=create2(output);return source2&&opts.strictSlashes!==!0&&(source2+=`${SLASH_LITERAL}?`),source2};module.exports=parse6}});var require_picomatch=__commonJS({"packages/coding-agent/node_modules/picomatch/lib/picomatch.js"(exports,module){"use strict";var scan2=require_scan(),parse6=require_parse(),utils=require_utils(),constants11=require_constants(),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 state4=isMatch(str3);if(state4)return state4}return!1}}let isState2=isObject4(glob)&&glob.tokens&&glob.input;if(glob===""||typeof glob!="string"&&!isState2)throw new TypeError("Expected pattern to be a non-empty string");let opts=options||{},posix6=opts.windows,regex2=isState2?picomatch4.compileRe(glob,options):picomatch4.makeRe(glob,options,!1,!0),state3=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:posix6}),result3={glob,state:state3,regex:regex2,posix:posix6,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=state3),matcher};picomatch4.test=(input,regex2,options,{glob,posix:posix6}={})=>{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||(posix6?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,posix6):match=regex2.exec(output)),{isMatch:!!match,match,output}};picomatch4.matchBase=(input,glob,options,posix6=options&&options.windows)=>(glob instanceof RegExp?glob:picomatch4.makeRe(glob,options)).test(utils.basename(input,{windows:posix6}));picomatch4.isMatch=(str3,patterns,options)=>picomatch4(patterns,options)(str3);picomatch4.parse=(pattern,options)=>Array.isArray(pattern)?pattern.map(p=>picomatch4.parse(p,options)):parse6(pattern,{...options,fastpaths:!1});picomatch4.scan=(input,options)=>scan2(input,options);picomatch4.compileRe=(state3,options,returnOutput=!1,returnState=!1)=>{if(returnOutput===!0)return state3.output;let opts=options||{},prepend=opts.contains?"":"^",append=opts.contains?"":"$",source2=`${prepend}(?:${state3.output})${append}`;state3&&state3.negated===!0&&(source2=`^(?!${source2}).*$`);let regex2=picomatch4.toRegex(source2,options);return returnState===!0&&(regex2.state=state3),regex2};picomatch4.makeRe=(input,options={},returnOutput=!1,returnState=!1)=>{if(!input||typeof input!="string")throw new TypeError("Expected a non-empty string");let parsed={negated:!1,fastpaths:!0};return options.fastpaths!==!1&&(input[0]==="."||input[0]==="*")&&(parsed.output=parse6.fastpaths(input,options)),parsed.output||(parsed=parse6(input,options)),picomatch4.compileRe(parsed,options,returnOutput,returnState)};picomatch4.toRegex=(source2,options)=>{try{let opts=options||{};return new RegExp(source2,opts.flags||(opts.nocase?"i":""))}catch(err){if(options&&options.debug===!0)throw err;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}});function toJsonAssistantMessageEvent(event){if(event.type==="toolcall_start"){let toolCall=event.partial.content[event.contentIndex];if(toolCall?.type!=="toolCall")throw new Error(`toolcall_start content at index ${event.contentIndex} is not a tool call`);let{partial:_partial2,...deltaEvent2}=event;return{...deltaEvent2,id:toolCall.id,toolName:toolCall.name}}if(!("partial"in event))return event;let{partial:_partial,...deltaEvent}=event;return deltaEvent}function toJsonEvent(event){if(event.type!=="message_update")return event;if(event.message.role!=="assistant")throw new Error("message_update message is not an assistant message");return{type:"message_update",usage:event.message.usage,assistantMessageEvent:toJsonAssistantMessageEvent(event.assistantMessageEvent),...event.resolvedToolName===void 0?{}:{resolvedToolName:event.resolvedToolName}}}import{realpathSync as realpathSync2,statSync as statSync2}from"node:fs";import{homedir as homedir2}from"node:os";import{isAbsolute,join as join2,resolve as resolve2,win32}from"node:path";import{existsSync,realpathSync,statSync}from"node:fs";import{homedir}from"node:os";import{dirname,join,resolve}from"node:path";var PROJECT_MARKERS=[".git","pnpm-workspace.yaml","package.json","pyproject.toml","Cargo.toml","go.mod",".venv"],PROJECT_RULE_SUBDIRS=[[".pi","rules"],[".omo","rules"],[".claude","rules"],[".cursor","rules"],[".github","instructions"]],PROJECT_SINGLE_FILES=[".github/copilot-instructions.md","AGENTS.md","CLAUDE.md","CONTEXT.md"],USER_HOME_RULE_SUBDIRS=[".pi/rules",".omo/rules",".opencode/rules",".claude/rules"],USER_HOME_SINGLE_FILES=[".config/opencode/AGENTS.md",".claude/CLAUDE.md"],RULE_FILE_EXTENSIONS=[".md",".mdc"],SOURCE_PRIORITY=new Map([[".pi/rules",0],[".omo/rules",1],[".claude/rules",2],[".cursor/rules",3],[".github/instructions",4],[".github/copilot-instructions.md",5],["AGENTS.md",6],["CLAUDE.md",7],["CONTEXT.md",8],["~/.pi/rules",100],["~/.omo/rules",101],["~/.opencode/rules",102],["~/.claude/rules",103],["~/.config/opencode/AGENTS.md",104],["~/.claude/CLAUDE.md",105]]),GLOBAL_DISTANCE=9999,DEFAULT_MAX_RULE_CHARS=12e3,DEFAULT_MAX_RESULT_CHARS=4e4,TRUNCATION_NOTICE=`
|
|
3
3
|
|
|
4
4
|
[Rule truncated. Read full rule: {path}]`,TRACKED_BUILTIN_TOOLS=["read","edit","write"],TRACKED_BUILTIN_TOOL_SET=new Set(TRACKED_BUILTIN_TOOLS),PROJECT_RULES_START_MARKER="<project_rules>",PROJECT_RULES_END_MARKER="</project_rules>",PROJECT_RULES_HEADING="## Project Instructions",PROJECT_RULES_REGION_START_MARKER="<!--senpi:project-rules:1:start-->",PROJECT_RULES_REGION_END_MARKER="<!--senpi:project-rules:1:end-->",SCANNER_EXCLUDED_DIRS=["node_modules",".git","dist","build",".turbo",".next","coverage"];function findProjectRoot(startPath,markers=PROJECT_MARKERS){let normalizedStartPath=resolve(startPath);if(!existsSync(normalizedStartPath))return null;let resolvedStartPath;try{resolvedStartPath=realpathSync.native(normalizedStartPath)}catch{return null}let currentDirectory;try{currentDirectory=statSync(resolvedStartPath).isDirectory()?resolvedStartPath:dirname(resolvedStartPath)}catch{return null}let filesystemRoot=resolve("/");for(;;){for(let marker of markers)if(existsSync(join(currentDirectory,marker)))return currentDirectory;if(currentDirectory===filesystemRoot)return null;let parentDirectory=dirname(currentDirectory);if(parentDirectory===currentDirectory)return null;currentDirectory=parentDirectory}}function widenToRepositoryRoot(projectRoot2){if(projectRoot2===null)return null;let repositoryFilesystemRoot=resolve("/"),homeDirectory=resolveExistingPath(homedir()),currentDirectory=resolveExistingPath(projectRoot2);for(;;){if(currentDirectory===homeDirectory)return projectRoot2;if(existsSync(join(currentDirectory,".git")))return currentDirectory;if(currentDirectory===repositoryFilesystemRoot)return projectRoot2;let parentDirectory=dirname(currentDirectory);if(parentDirectory===currentDirectory)return projectRoot2;currentDirectory=parentDirectory}}function resolveExistingPath(path14){try{return realpathSync.native(resolve(path14))}catch{return resolve(path14)}}function isLocalMessagePath(path14,platform5=process.platform){return path14.includes("\0")?!1:platform5==="win32"?/^[A-Za-z]:[\\/]/.test(path14):isAbsolute(path14)&&!path14.startsWith("//")}function messagePathProjectRoot(cwd){let home=resolve2(homedir2()),candidate=findProjectRoot(cwd,[".git"])??findProjectRoot(cwd)??void 0;return candidate===void 0||resolve2(candidate)===home?void 0:candidate}function existing(candidate){try{let realpath4=realpathSync2.native(candidate),stats=statSync2(realpath4);return stats.isFile()?{realpath:realpath4,kind:"file"}:stats.isDirectory()?{realpath:realpath4,kind:"directory"}:void 0}catch{return}}function expandHome(path14){return path14==="~"?homedir2():path14.startsWith("~/")||path14.startsWith("~\\")?join2(homedir2(),path14.slice(2)):path14}function resolveMessagePath(input){let platform5=input.platform??process.platform,pathApi=platform5==="win32"?win32:{isAbsolute,resolve:resolve2},path14=expandHome(input.path.trim());if(path14.length===0||path14.includes("\0"))return{status:"not_found",tried:[]};let bases=pathApi.isAbsolute(path14)?[["absolute",path14]]:[["cwd",pathApi.resolve(input.cwd,path14)],...input.projectRoot!==void 0&&pathApi.resolve(input.projectRoot)!==pathApi.resolve(input.cwd)?[["project-root",pathApi.resolve(input.projectRoot,path14)]]:[]],local=bases.filter(([,candidate])=>isLocalMessagePath(candidate,platform5));if(local.length!==bases.length)return{status:"not_found",tried:[]};for(let[base,candidate]of local){let found=existing(candidate);if(found!==void 0&&isLocalMessagePath(found.realpath,platform5))return{status:"found",...found,base}}return{status:"not_found",tried:local.map(([,candidate])=>candidate)}}import*as crypto2 from"node:crypto";import{basename as basename38,dirname as dirname71,extname as extname6}from"node:path";var BUILT_IN_PROVIDER_DISPLAY_NAMES={anthropic:"Anthropic","anthropic-subscription":"Anthropic Subscription","amazon-bedrock":"Amazon Bedrock","ant-ling":"Ant Ling","azure-openai-responses":"Azure OpenAI Responses",cerebras:"Cerebras","cloudflare-ai-gateway":"Cloudflare AI Gateway","cloudflare-workers-ai":"Cloudflare Workers AI",cursor:"Cursor","cursor-cli-oauth":"Cursor CLI (OAuth)",deepseek:"DeepSeek",fireworks:"Fireworks",google:"Google Gemini","google-vertex":"Google Vertex AI",groq:"Groq",huggingface:"Hugging Face","kimi-coding":"Kimi For Coding",minimax:"MiniMax","minimax-cn":"MiniMax (China)",moonshotai:"Moonshot AI","moonshotai-cn":"Moonshot AI (China)",nvidia:"NVIDIA NIM",opencode:"OpenCode Zen","opencode-go":"OpenCode Go",openai:"OpenAI","chatgpt-subscription":"ChatGPT Subscription",opengateway:"OpenGateway",ollama:"Ollama Cloud",openrouter:"OpenRouter",together:"Together AI",venice:"Venice AI","vercel-ai-gateway":"Vercel AI Gateway",xai:"xAI",zai:"ZAI Coding Plan (Global)","zai-coding-cn":"ZAI Coding Plan (China)",xiaomi:"Xiaomi MiMo","xiaomi-token-plan-cn":"Xiaomi MiMo Token Plan (China)","xiaomi-token-plan-ams":"Xiaomi MiMo Token Plan (Amsterdam)","xiaomi-token-plan-sgp":"Xiaomi MiMo Token Plan (Singapore)","alibaba-token-plan":"Alibaba Token Plan"};var BUILT_IN_MODEL_PROVIDERS=new Set(getProviders());function isApiKeyLoginProvider(providerId,oauthProviderIds,builtInProviderIds=BUILT_IN_MODEL_PROVIDERS){return BUILT_IN_PROVIDER_DISPLAY_NAMES[providerId]?!0:builtInProviderIds.has(providerId)?!1:!oauthProviderIds.has(providerId)}function buildLoginProviderInfos(modelRegistry,authType){let oauthProviders=modelRegistry.authStorage.getOAuthProviders(),oauthProviderIds=new Set(oauthProviders.map(provider=>provider.id)),options=oauthProviders.map(provider=>({id:provider.id,name:provider.name,authType:"oauth"})),modelProviders=new Set(modelRegistry.getAll().map(model=>model.provider));for(let providerId of modelProviders)isApiKeyLoginProvider(providerId,oauthProviderIds)&&options.push({id:providerId,name:modelRegistry.getProviderDisplayName(providerId),authType:"api_key"});return(authType?options.filter(option=>option.authType===authType):options).sort((a,b)=>a.name.localeCompare(b.name))}function authMethodStatus(modelRegistry,info){if(modelRegistry.authStorage.get(info.id)?.type===info.authType)return{configured:!0,source:"stored"};let{status,signIn}=modelRegistry.resolveProviderAuth(info.id);return!status.configured||status.source==="stored"?{configured:!1}:(signIn?"oauth":"api_key")===info.authType?status:{configured:!1}}function loginRowStatus(modelRegistry,provider,authType){for(let type2 of[authType,authType==="oauth"?"api_key":"oauth"]){let status=authMethodStatus(modelRegistry,{...provider,authType:type2});if(!status.configured)continue;let source2=status.label??status.source;return source2===void 0?{type:type2}:{type:type2,source:source2}}}import{dirname as dirname2,join as join3}from"node:path";var listeners=new Set;function subscribeProviderAccountEvents(listener){return listeners.add(listener),()=>listeners.delete(listener)}function emitProviderAccountsChanged(provider){emit({type:"accounts_changed",provider})}function emitProviderAccountFailover(provider,from,to,reason){emit({type:"failover",provider,from,to,reason})}function emit(event){for(let listener of listeners)listener(event)}import{createHash}from"node:crypto";var SENTINEL_OAUTH_FIELDS={access:"claude-sdk-oauth-managed",refresh:"claude-sdk-oauth-managed",expires:41024448e5};function emptyCredential(){return{type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]}}function storedSlots(credential){return credential.accounts??[]}function isSentinelSlot(slot2){return slot2.access===SENTINEL_OAUTH_FIELDS.access&&slot2.refresh===SENTINEL_OAUTH_FIELDS.refresh}function authGrantDigest(refresh){return createHash("sha256").update(refresh).digest("hex").slice(0,32)}function listAccounts(credential,env){let slots=storedSlots(credential).filter(slot2=>!isSentinelSlot(slot2));if(env){let state3=credential.slotState??{};for(let slot2 of envSlots(env)){let persisted=state3[slot2.name];slots.push(persisted?{...slot2,...persisted}:slot2)}}return slots}var ACCOUNT_NAME_PATTERN=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName(name){if(!ACCOUNT_NAME_PATTERN.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function addAccount(credential,slot2){if(assertValidAccountName(slot2.name),storedSlots(credential).some(existing2=>existing2.name===slot2.name))throw new Error(`Account '${slot2.name}' already exists`);return{...credential,accounts:[...storedSlots(credential),slot2]}}function upsertAccount(credential,slot2){assertValidAccountName(slot2.name);let existing2=storedSlots(credential).find(candidate=>candidate.name===slot2.name);if(!existing2)return{...credential,accounts:[...storedSlots(credential),slot2]};let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,modelBlocks:_modelBlocks,authRecoveryGrant:_authRecoveryGrant,...identity}=existing2,refreshed={...identity,access:slot2.access,refresh:slot2.refresh,expires:slot2.expires,source:slot2.source};return{...credential,accounts:storedSlots(credential).map(candidate=>candidate.name===slot2.name?refreshed:candidate)}}function removeAccount(credential,name){let accounts=storedSlots(credential).filter(slot2=>slot2.name!==name),next={...credential,accounts};return credential.pinned===name&&delete next.pinned,withoutOrderedAccount(next,name)}function pinAccount(credential,name){return{...credential,pinned:name}}function envSlots(env){let slots=[],read2=suffix=>env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`),names=[{slot:"env"}];for(let index=2;index<=16;index++)names.push({suffix:String(index),slot:`env-${index}`});for(let{suffix,slot:slot2}of names)read2(suffix)&&slots.push({name:slot2,refresh:"",access:"",expires:0,source:"env"});return slots}function envSlotToken(env,slotName){let match=/^env(?:-(\d+))?$/.exec(slotName);if(!match)return;let suffix=match[1];return env(suffix===void 0?"CLAUDE_CODE_OAUTH_TOKEN":`CLAUDE_CODE_OAUTH_TOKEN_${suffix}`)}async function refreshSlot(store,providerId,slotName,refresher,signal,isExpiring=expires=>Date.now()>=expires){return store.modify(providerId,async current=>{if(current?.type!=="oauth")return;let credential=current,slot2=storedSlots(credential).find(candidate=>candidate.name===slotName);if(!slot2||!isExpiring(slot2.expires))return current;let refreshed=await refresher(slot2.refresh,signal),accounts=storedSlots(credential).map(candidate=>candidate.name===slotName?{...candidate,refresh:refreshed.refresh,access:refreshed.access,expires:refreshed.expires}:candidate);return{...credential,accounts}})}var ACCOUNT_NAME_PATTERN2=/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;function assertValidAccountName2(name){if(!ACCOUNT_NAME_PATTERN2.test(name))throw new Error(`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`)}function pooledFrom(credential){return credential===void 0?void 0:credential}function pinnedName(credential){return credential?.pinned}function numberField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="number"?found:void 0}function credentialPoolRepository(storage){let authPath=storage.getStoragePath();return new CredentialSlotRepository(authPath?join3(dirname2(authPath),"credential-pool-state.json"):void 0)}function stringField(value,key){let found=Object.entries(value).find(([candidate])=>candidate===key)?.[1];return typeof found=="string"?found:void 0}function slotBlocked(slot2,sidecar,now2){if(slotHealth(sidecar,now2)==="blocked"||stringField(slot2,"blockReason")==="account_disabled")return!0;let blockedUntil=numberField(slot2,"blockedUntil");return blockedUntil!==void 0&&blockedUntil>now2}function storedModelBlocks(slot2){let found=Object.entries(slot2).find(([candidate])=>candidate==="modelBlocks")?.[1];if(found===null||typeof found!="object")return;let entries=Object.entries(found).flatMap(([model,block])=>{let until=block!==null&&typeof block=="object"?numberField(block,"blockedUntil"):void 0;return until===void 0?[]:[[model,{blockedUntil:until}]]});return entries.length===0?void 0:Object.fromEntries(entries)}function blockedModels(now2,...sources){let until=new Map;for(let blocks of sources)for(let[model,block]of Object.entries(pruneModelBlocks(blocks,now2)??{}))until.set(model,Math.max(until.get(model)??0,block.blockedUntil));return until.size===0?{}:{blockedModels:[...until].map(([model,at])=>({model,until:at}))}}async function getCredentialAccounts(storage,provider,env=process.env,repository){return summarizeCredentialAccounts(provider,storage.get(provider),env,repository??credentialPoolRepository(storage))}async function summarizeCredentialAccounts(provider,stored,env=process.env,repository=new CredentialSlotRepository){let credential=pooledFrom(stored);return applyAccountOrder(credential?.order,await summarizeInStoredOrder(provider,credential,env,repository))}async function summarizeInStoredOrder(provider,credential,env,repository){let now2=Date.now(),pinned=pinnedName(credential),summaries=[];if(credential){let state4=await repository.listSlots(provider,"stored"),storedAccounts3=normalizeProviderId(provider)==="anthropic-subscription"?Array.isArray(credential.accounts)?listSlots(credential):[]:listSlots(credential),usable2=new Set(slotsOfOwnKind(credential).map(slot2=>slot2.name));for(let slot2 of storedAccounts3){let displayName=accountDisplayName(slot2.displayName),persisted=state4[slot2.name],revision=await repository.storedCredentialRevision(provider,slot2.name,{key:slot2.key,access:slot2.access,refresh:slot2.refresh}),applicable=persisted?.credentialRevision===revision?persisted:void 0;summaries.push({name:slot2.name,...displayName===void 0?{}:{displayName},source:slot2.source??"login",blocked:slotBlocked(slot2,applicable,now2),pinned:pinned===slot2.name,...blockedModels(now2,applicable?.modelBlocks,storedModelBlocks(slot2)),...usable2.has(slot2.name)?{}:{unused:!0}})}if(normalizeProviderId(provider)!=="anthropic-subscription")return summaries}let state3=await repository.listSlots(provider,"env");for(let slot2 of discoverEnvSlots(provider,name=>env[name])){let persisted=state3[slot2.name],revision=await repository.envCredentialRevision(slot2.envVarName,slot2.key),applicable=persisted?.credentialRevision===revision?persisted:void 0;summaries.push({name:slot2.name,source:"env",blocked:slotHealth(applicable,now2)==="blocked",pinned:pinned===slot2.name,...blockedModels(now2,applicable?.modelBlocks)})}return summaries}async function renameCredentialAccount(storage,provider,name,displayName){await storage.modify(provider,async current=>{if(!current)throw new Error(`No stored credential for provider: ${provider}`);if(current.type==="oauth"&&!Array.isArray(current.accounts)&¤t.access===current.refresh&¤t.access.endsWith("-managed"))throw new Error(`Stored provider account not found: ${name}`);return renameSlotDisplayName(current,name,displayName)}),emitProviderAccountsChanged(provider)}async function pinCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage);if(name!==null){assertValidAccountName2(name);let account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.unused)throw new Error(`Account ${name} holds a login of the other kind and is never used, so it cannot be pinned. To switch ${provider} to it, save it again with /login.`)}await storage.modify(provider,async current=>{if(current===void 0){if(normalizeProviderId(provider)!=="anthropic-subscription"||name===null)throw new Error(`No stored credential for provider: ${provider}`);return pinSlot({type:"oauth",...SENTINEL_OAUTH_FIELDS,accounts:[]},name)}if(name===null){if(pinnedName(current)===void 0)return current;let{pinned:_pinned,...unpinned}={...current,pinned:void 0};return unpinned}return pinSlot(current,name)}),emitProviderAccountsChanged(provider)}async function removeCredentialAccount(storage,provider,name,env=process.env,repository){let repo=repository??credentialPoolRepository(storage),account=(await getCredentialAccounts(storage,provider,env,repo)).find(candidate=>candidate.name===name);if(!account)throw new Error(`Provider account not found: ${name}`);if(account.source==="env")throw new Error(`Environment provider account cannot be removed: ${name}`);let next=await storage.read(provider);if(next===void 0)throw new Error(`No stored credential for provider: ${provider}`);let removed=removeSlot(next,name),remaining=removed===void 0?void 0:withoutOrderedAccount(removed,name);remaining===void 0?await storage.delete(provider):await storage.modify(provider,async()=>remaining),await repo.mutateSlotState(provider,"stored",name,()=>{}),emitProviderAccountsChanged(provider)}function storedOrder(credential){return credential?.order??[]}async function listCredentialAccounts(storage,provider,env=process.env,repository){let accounts=await getCredentialAccounts(storage,provider,env,repository),order=storedOrder(storage.get(provider));return{accounts,ordered:accounts.some(account=>order.includes(account.name))}}function assertOrderNames(names,known){if(names.length===0)throw new Error("Account order must name at least one account");let seen=new Set;for(let name of names){if(assertValidAccountName2(name),seen.has(name))throw new Error(`Duplicate provider account in order: ${name}`);if(seen.add(name),!known.some(account=>account.name===name))throw new Error(`Provider account not found: ${name}`)}}function withOrder(credential,names){let{order:_previous,...rest}=credential;return names===null?rest:{...rest,order:[...names]}}async function orderCredentialAccounts(storage,provider,names,env=process.env,repository){let repo=repository??credentialPoolRepository(storage);await storage.modify(provider,async current=>{if(current===void 0)throw new Error(`No stored credential for provider: ${provider}`);return names!==null&&assertOrderNames(names,await summarizeCredentialAccounts(provider,current,env,repo)),withOrder(current,names)}),emitProviderAccountsChanged(provider)}var EDIT_CODES={empty:"empty","not-assistant":"not_assistant","not-found":"not_found","stale-leaf":"stale_leaf"},AssistantEditError=class extends Error{constructor(reason,message){super(message),this.name="AssistantEditError",this.reason=reason}get code(){return EDIT_CODES[this.reason]}},SessionStreamingError=class extends Error{constructor(){super("Wait for the current response to finish before navigating the session tree."),this.code="streaming",this.name="SessionStreamingError"}};function assertExpectedLeaf(expectedLeafId,currentLeafId){if(!(expectedLeafId===void 0||expectedLeafId===currentLeafId))throw new AssistantEditError("stale-leaf",`Session leaf moved (expected ${expectedLeafId}, now ${currentLeafId??"root"})`)}function assistantTextEquals(original,text3){return contentText(original.content,"").trim()===text3.trim()}function buildEditedAssistantMessage(original,text3){let trimmed=text3.trim();if(trimmed.length===0)throw new AssistantEditError("empty","Edited assistant response cannot be empty");return{role:"assistant",content:[{type:"text",text:trimmed}],api:original.api,provider:original.provider,model:original.model,...original.responseModel!==void 0?{responseModel:original.responseModel}:{},usage:original.usage,stopReason:"stop",timestamp:Date.now()}}var EDIT_CODES2={empty:"empty","not-user":"not_user","not-found":"not_found","stale-leaf":"stale_leaf"},UserEditError=class extends Error{constructor(reason,message){super(message),this.name="UserEditError",this.reason=reason}get code(){return EDIT_CODES2[this.reason]}};function assertExpectedUserLeaf(expectedLeafId,currentLeafId){if(!(expectedLeafId===void 0||expectedLeafId===currentLeafId))throw new UserEditError("stale-leaf",`Session leaf moved (expected ${expectedLeafId}, now ${currentLeafId??"root"})`)}function userTextEquals(original,text3){return contentText(original.content,"").trim()===text3.trim()}function buildEditedUserMessage(original,text3){let trimmed=text3.trim();if(trimmed.length===0)throw new UserEditError("empty","Edited user message cannot be empty");let attachments=Array.isArray(original.content)?original.content.filter(block=>block.type!=="text"):[];return{role:"user",content:[{type:"text",text:trimmed},...attachments],timestamp:Date.now()}}import{createHash as createHash2}from"node:crypto";var DEFAULT_AFFINITY_KEY="claude-sdk-oauth-default",AllAccountsBlockedError=class extends Error{constructor(soonestUnblockAt3,blockReason,limitedModel2,unavailableAccount){let until=soonestUnblockAt3===void 0?void 0:new Date(soonestUnblockAt3).toISOString();super(limitedModel2!==void 0&&until!==void 0?`All Anthropic Subscription accounts have hit the usage limit for model ${limitedModel2} until ${until}.`:until===void 0?"All Anthropic Subscription accounts are blocked until re-login.":`All Anthropic Subscription accounts are blocked until ${until}.`),this.limitedModel=limitedModel2,this.name="AllAccountsBlockedError",this.soonestUnblockAt=soonestUnblockAt3,this.blockReason=blockReason,this.unavailableAccount=unavailableAccount}};function getAffinityKey(options){return options.affinityKey??options.sessionId??DEFAULT_AFFINITY_KEY}function score(key,accountName2){return createHash2("sha256").update(`${key}\0${accountName2}`).digest().readBigUInt64BE(0)}function rendezvousOrder2(key,accounts){return[...accounts].map(account=>({account,score:score(key,account.name)})).sort((left,right)=>right.score>left.score?1:right.score<left.score?-1:0).map(({account})=>account)}function isAccountBlocked(account,now2){return account.blockedUntil!==void 0&&account.blockedUntil>now2}function isBlockedFor(account,now2,model){return isAccountBlocked(account,now2)||activeModelBlockUntil(account.modelBlocks,model,now2)!==void 0}function clearExpiredBlocks(accounts,now2=Date.now()){return accounts.map(account=>{let available=account;if(account.blockReason!==void 0&&(account.blockedUntil===void 0||account.blockedUntil<=now2)){let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,...rest2}=account;available=rest2}if(available.modelBlocks===void 0)return available;let{modelBlocks,...rest}=available,live=pruneModelBlocks(modelBlocks,now2);return live===void 0?rest:{...rest,modelBlocks:live}})}function selectUnblocked(accounts,options,now2){let pinned=options.pinnedAccount===void 0?void 0:accounts.find(account=>account.name===options.pinnedAccount);if(pinned&&!isBlockedFor(pinned,now2,options.model))return pinned;let preferred=options.preferredAccount===void 0?void 0:accounts.find(account=>account.name===options.preferredAccount);return preferred&&!isBlockedFor(preferred,now2,options.model)?preferred:applyAccountOrder(options.accountOrder,rendezvousOrder2(getAffinityKey(options),accounts)).find(account=>!isBlockedFor(account,now2,options.model))}function unblockAt(account,now2,model){let accountUntil=account.blockedUntil!==void 0&&account.blockedUntil>now2?account.blockedUntil:void 0,modelUntil=activeModelBlockUntil(account.modelBlocks,model,now2);return accountUntil===void 0?modelUntil:modelUntil===void 0?accountUntil:Math.max(accountUntil,modelUntil)}function soonestUnblockAt(accounts,now2,model){let candidates=accounts.map(account=>unblockAt(account,now2,model)).filter(value=>value!==void 0);return candidates.length===0?void 0:Math.min(...candidates)}function limitedModel(accounts,now2,model){return accounts.some(account=>!isAccountBlocked(account,now2)&&activeModelBlockUntil(account.modelBlocks,model,now2)!==void 0)?model:void 0}function selectAccount(accounts,options={}){let now2=options.now??Date.now(),candidates=accounts,unavailableAccount;if(options.accountFallback===!1){let name=options.pinnedAccount??options.preferredAccount??applyAccountOrder(options.accountOrder,rendezvousOrder2(getAffinityKey(options),accounts))[0]?.name;candidates=accounts.filter(account=>account.name===name);let pinnedBy=options.pinnedAccount!==void 0?options.pinSource:void 0;name!==void 0&&(unavailableAccount={name,configured:candidates.length>0,...pinnedBy===void 0?{}:{pinnedBy}})}let selected=selectUnblocked(candidates,options,now2);if(selected)return selected;let cleared=clearExpiredBlocks(candidates,now2),afterClear=selectUnblocked(cleared,options,now2);if(afterClear)return afterClear;throw new AllAccountsBlockedError(soonestUnblockAt(candidates,now2,options.model),candidates.length>0&&candidates.every(account=>account.blockReason==="auth_error")?"auth_error":void 0,limitedModel(candidates,now2,options.model),unavailableAccount)}var CODEX_FAMILY=/^x-([a-z0-9-]+)-(?:primary|secondary)-used-percent$/;function number(value){if(value===void 0||value.trim()==="")return;let parsed=Number(value);return Number.isFinite(parsed)?parsed:void 0}function iso(epochSeconds){return epochSeconds===void 0?void 0:new Date(epochSeconds*1e3).toISOString()}function windowLabel(minutes,fallback){return minutes===void 0||minutes<=0?fallback:minutes%1440===0?`${minutes/1440}d`:minutes%60===0?`${minutes/60}h`:`${minutes}m`}function lower(headers){return new Map(Object.entries(headers).map(([name,value])=>[name.toLowerCase(),value]))}function codexWindow(headers,family,slot2){let used=number(headers.get(`x-${family}-${slot2}-used-percent`));if(used===void 0)return;let minutes=number(headers.get(`x-${family}-${slot2}-window-minutes`)),resetAt=number(headers.get(`x-${family}-${slot2}-reset-at`));if(used===0&&(minutes??0)===0&&resetAt===void 0)return;let limit=family.replace(/-/g,"_"),resetsAt=iso(resetAt);return{id:`${limit}:${slot2}`,label:limit==="codex"?windowLabel(minutes,slot2):`${windowLabel(minutes,slot2)} ${limit}`,...minutes===void 0?{}:{windowMinutes:minutes},usedPercent:used,...resetsAt===void 0?{}:{resetsAt}}}function codexWindowsFromHeaders(raw){let headers=lower(raw),families=new Set;for(let name of headers.keys()){let family=CODEX_FAMILY.exec(name)?.[1];family!==void 0&&families.add(family)}return[...families].sort().flatMap(family=>["primary","secondary"].flatMap(slot2=>codexWindow(headers,family,slot2)??[]))}var CLAUDE_WINDOWS=[{key:"5h",minutes:300},{key:"7d",minutes:10080}];function claudeWindowsFromHeaders(raw){let headers=lower(raw);return CLAUDE_WINDOWS.flatMap(({key,minutes})=>{let utilization=number(headers.get(`anthropic-ratelimit-unified-${key}-utilization`));if(utilization===void 0)return[];let resetsAt=iso(number(headers.get(`anthropic-ratelimit-unified-${key}-reset`)));return[{id:`claude:${key}`,label:key,windowMinutes:minutes,usedPercent:Math.round(utilization*1e4)/100,...resetsAt===void 0?{}:{resetsAt}}]})}var SDK_WINDOWS={five_hour:{id:"claude:5h",label:"5h",minutes:300},seven_day:{id:"claude:7d",label:"7d",minutes:10080},seven_day_opus:{id:"claude:7d_opus",label:"7d opus",minutes:10080},seven_day_sonnet:{id:"claude:7d_sonnet",label:"7d sonnet",minutes:10080}};function claudeWindowsFromSdkEvent(data){if(typeof data!="object"||data===null||!("type"in data)||data.type!=="rate_limit_event")return[];let info=data.rate_limit_info,window=typeof info?.rateLimitType=="string"?SDK_WINDOWS[info.rateLimitType]:void 0;if(window===void 0||typeof info?.utilization!="number")return[];let resetsAt=iso(typeof info.resetsAt=="number"?info.resetsAt:void 0);return[{id:window.id,label:window.label,windowMinutes:window.minutes,usedPercent:Math.round(info.utilization*1e4)/100,...resetsAt===void 0?{}:{resetsAt}}]}var SubscriptionLimitStore=class{#accounts=new Map;#listeners=new Set;#mirrorListeners=new Set;record(provider,account,windows,now2=new Date){if(windows.length===0)return;let key=`${provider}\0${account}`,previous=this.#accounts.get(key),merged=new Map((previous?.windows??[]).map(window=>[window.id,window]));for(let window of windows)merged.set(window.id,window);this.#write(key,previous,{provider,account,windows:[...merged.values()],reportedAt:now2.toISOString(),...previous?.plan===void 0?{}:{plan:previous.plan}})}report(provider,account,report){let key=`${provider}\0${account}`,previous=this.#accounts.get(key),reportedAt=report.reportedAt.toISOString();if(!(previous!==void 0&&reportedAt<changedAtOf(previous))){if("error"in report){if(previous?.error===report.error)return;let{updatedAt:_changedAt,revision:_revision,...base}=previous??{provider,account,windows:[],reportedAt};this.#write(key,previous,{...base,error:report.error},reportedAt);return}report.windows.length===0&&previous===void 0||this.#write(key,previous,{provider,account,windows:[...report.windows],reportedAt,...report.plan===void 0?{}:{plan:report.plan}})}}adopt(limits){this.#offer(`${limits.provider}\0${limits.account}`,limits)}#write(key,previous,limits,changedAt=limits.reportedAt){let held=previous===void 0?void 0:changedAtOf(previous),later=held===void 0||changedAt>held,time2=later?changedAt:held,revision=later?0:(previous?.revision??0)+1;this.#publish(key,{...limits,...time2===limits.reportedAt?{}:{updatedAt:time2},...revision===0?{}:{revision}})}#offer(key,limits){let previous=this.#accounts.get(key);if(previous===void 0){this.#publish(key,limits);return}if(canonical(limits)!==canonical(previous)){if(changedAtOf(limits)===changedAtOf(previous)&&(limits.revision??0)===(previous.revision??0)){let combined=combineConcurrent(previous,limits);canonical(combined)!==canonical(previous)&&this.#publish(key,combined);return}compareRecords(limits,previous)<=0||this.#publish(key,limits)}}#publish(key,limits){this.#accounts.set(key,limits);let shown=publicShape(limits),calls=[...[...this.#mirrorListeners].map(listener=>()=>listener(limits)),...[...this.#listeners].map(listener=>()=>listener(shown))];for(let call of calls)try{call()}catch(error2){process.stderr.write(`senpi subscription limits: a listener failed: ${String(error2)}
|
|
5
5
|
`)}}snapshot(){return[...this.#accounts.values()].map(publicShape)}mirrorSnapshot(){return[...this.#accounts.values()]}subscribe(listener){return this.#listeners.add(listener),()=>this.#listeners.delete(listener)}subscribeMirror(listener){return this.#mirrorListeners.add(listener),()=>this.#mirrorListeners.delete(listener)}};function changedAtOf(limits){return limits.updatedAt??limits.reportedAt}function compareRecords(a,b){let[first,second]=[changedAtOf(a),changedAtOf(b)];if(first!==second)return first<second?-1:1;let[firstRevision,secondRevision]=[a.revision??0,b.revision??0];if(firstRevision!==secondRevision)return firstRevision<secondRevision?-1:1;let[left,right]=[canonical(a),canonical(b)];return left<right?-1:left>right?1:0}function combineConcurrent(a,b){let later=(x,y)=>x===void 0?y:y===void 0||canonical(x)>=canonical(y)?x:y;if(a.reportedAt!==b.reportedAt){let newer=a.reportedAt<b.reportedAt?b:a;return concurrentRecord(a,newer.windows,newer.plan,later(a.error,b.error),newer.reportedAt)}let windows=new Map(a.windows.map(window=>[window.id,window]));for(let window of b.windows)windows.set(window.id,later(windows.get(window.id),window)??window);return concurrentRecord(a,[...windows.values()],later(a.plan,b.plan),later(a.error,b.error),a.reportedAt)}function concurrentRecord(a,windows,plan,error2,reportedAt){let updatedAt=changedAtOf(a);return{provider:a.provider,account:a.account,windows:[...windows].sort((x,y)=>x.id<y.id?-1:x.id>y.id?1:0),reportedAt,...plan===void 0?{}:{plan},...error2===void 0?{}:{error:error2},...updatedAt===reportedAt?{}:{updatedAt},...a.revision===void 0||a.revision===0?{}:{revision:a.revision}}}function publicShape({updatedAt:_changedAt,revision:_revision,...limits}){return limits}function canonical(value){return JSON.stringify(value,(_key,field3)=>field3!==null&&typeof field3=="object"&&!Array.isArray(field3)?Object.fromEntries(Object.entries(field3).sort(([a],[b])=>a<b?-1:a>b?1:0)):field3)}var subscriptionLimits=new SubscriptionLimitStore;function limitAccountOf(slotAuth){return slotAuth?.slotName!==void 0?slotAuth.slotName:slotAuth?.apiKey!==void 0?"env":"default"}function withLimitCapture(options,provider,account,store=subscriptionLimits){let inner=options.onResponse;return{...options,onResponse:(response,model)=>(store.record(provider,account,[...codexWindowsFromHeaders(response.headers),...claudeWindowsFromHeaders(response.headers)]),inner?.(response,model))}}var PROVIDER="anthropic-subscription",HOUR_MS=3600*1e3,CLAUDE_USAGE_LIMIT=/^(?:You['\u2019]ve|You have) (?:hit|reached) your (?:(session|weekly|daily|monthly|\d+-hour|usage) )?limit(?=$|\s*[\u00b7\u2219.,{(]|\s+resets?\b)|^Claude AI usage limit reached\b/i,TERMINAL_LIMIT_REASON=/\bblocking_limit\b/,NAMED_STATUS=/\b(?:HTTP|status(?: code)?)\s*(\d{3})\b/i,WINDOW_MS={session:5*HOUR_MS,daily:24*HOUR_MS,weekly:168*HOUR_MS,monthly:744*HOUR_MS},UNNAMED_WINDOW_MS=5*HOUR_MS;function namedWindowMs(word){if(word===void 0)return;let lower2=word.toLowerCase(),hours=/^(\d+)-hour$/.exec(lower2);return hours?Number(hours[1])*HOUR_MS:WINDOW_MS[lower2]}function spentWindow(accountName2,now2){let limits=subscriptionLimits.snapshot().find(entry2=>entry2.provider===PROVIDER&&entry2.account===accountName2),spent;for(let window of limits?.windows??[]){if(window.usedPercent<100||window.resetsAt===void 0)continue;let resetsAt=Date.parse(window.resetsAt);!Number.isFinite(resetsAt)||resetsAt<=now2||(spent===void 0||resetsAt-now2>spent.resetMs)&&(spent={resetMs:resetsAt-now2,windowMs:window.windowMinutes===void 0?void 0:window.windowMinutes*6e4})}return spent}function isConfirmedAccountUsageLimit(text3){let trimmed=text3.trim();if(!CLAUDE_USAGE_LIMIT.test(trimmed)&&!TERMINAL_LIMIT_REASON.test(trimmed))return!1;let status=NAMED_STATUS.exec(trimmed)?.[1];return status===void 0||status==="429"}function usageLimitBlockMs(text3,accountName2,now2){let trimmed=text3.trim();if(!isConfirmedAccountUsageLimit(trimmed))return;let shape=CLAUDE_USAGE_LIMIT.exec(trimmed),window=spentWindow(accountName2,now2),parsed=usageLimitResetMs(trimmed,now2),resetMs=parsed!==void 0&&parsed>0?parsed:window?.resetMs;if(resetMs===void 0)return;let capMs=namedWindowMs(shape?.[1])??window?.windowMs??UNNAMED_WINDOW_MS;return Math.min(resetMs,capMs)}var MAX_RATE_LIMIT_BLOCK_MS=2880*60*1e3,DEFAULT_RATE_LIMIT_BLOCK_MS=6e4,TRANSIENT_RETRIES_PER_TURN=2,TRANSIENT_RETRY_DELAY_MS=1e3,TURN_RETRY_SUPPRESSION_PREFIX2="senpi:no-turn-retry:",sessionBlocks=new Map;function isSharedVerdict(classification,error2){return classification.kind==="auth_error"||classification.kind==="billing"||classification.kind==="org_not_allowed"?!0:classification.kind==="rate_limit"&&classification.modelFamily===void 0&&isConfirmedAccountUsageLimit(errorText(error2))}function rememberSessionBlock(sessionKey,account){if(sessionKey===void 0)return;let blocks=sessionBlocks.get(sessionKey)??new Map;blocks.set(account.name,{blockedUntil:account.blockedUntil,blockReason:account.blockReason,blockedAt:account.blockedAt,modelBlocks:account.modelBlocks}),sessionBlocks.set(sessionKey,blocks)}function pruneSessionBlocks(now2){for(let[sessionKey,blocks]of sessionBlocks){for(let[name,block]of blocks)(block.blockedUntil??0)<=now2&&pruneModelBlocks(block.modelBlocks,now2)===void 0&&blocks.delete(name);blocks.size===0&&sessionBlocks.delete(sessionKey)}}function withSessionBlocks(accounts,sessionKey,now2){pruneSessionBlocks(now2);let blocks=sessionKey===void 0?void 0:sessionBlocks.get(sessionKey);return blocks===void 0?[...accounts]:accounts.map(account=>{let own=blocks.get(account.name);if(own===void 0)return account;let later=(own.blockedUntil??0)>(account.blockedUntil??0);return{...account,...later?{blockedUntil:own.blockedUntil,blockReason:own.blockReason,blockedAt:own.blockedAt}:{},modelBlocks:mergeModelBlocks(account.modelBlocks,own.modelBlocks,0)}})}function forgetSessionBlock(sessionKey,name){if(sessionKey===void 0)return;let blocks=sessionBlocks.get(sessionKey);blocks?.delete(name)&&blocks.size===0&&sessionBlocks.delete(sessionKey)}function forgetSessionBlocksFor(name){let lifted=!1;for(let[sessionKey,blocks]of[...sessionBlocks])blocks.has(name)&&(lifted=!0,forgetSessionBlock(sessionKey,name));return lifted}var ClassifiedSdkError=class extends Error{constructor(classification,original,suppressTurnRetry){let detail=original instanceof Error?original.message:String(original);super(`${suppressTurnRetry?TURN_RETRY_SUPPRESSION_PREFIX2:""}${detail}`),this.name="ClassifiedSdkError",this.classification=classification,this.original=original,this.suppressTurnRetry=suppressTurnRetry}};function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:void 0}function defaultErrorFromEvent(event){let value=record(event);return value?.type==="error"?value.error:void 0}function defaultIsVisibleDelta(event){let value=record(event);return typeof value?.type!="string"?!1:/^(?:text|thinking|toolcall)_(?:start|delta|end)$/.test(value.type)}function errorText(error2){if(typeof error2=="string")return error2;if(error2 instanceof Error)return error2.message;let value=record(error2);return typeof value?.message=="string"?value.message:String(error2)}function retryAfterMs(error2){let explicit=record(error2)?.retryAfterMs;if(typeof explicit=="number"&&Number.isFinite(explicit)&&explicit>0)return Math.ceil(explicit);let text3=errorText(error2),milliseconds=text3.match(/\bretry[-_ ]?after[-_ ]?ms\s*[:=]\s*(\d+(?:\.\d+)?)/i);if(milliseconds)return Math.ceil(Number(milliseconds[1]));let seconds2=text3.match(/\bretry[-_ ]?after\s*[:=]\s*(\d+(?:\.\d+)?)/i);return seconds2?Math.ceil(Number(seconds2[1])*1e3):void 0}function blockedAccount(account,classification,now2,attempt2,baseBlockMs,error2,model){if(classification.kind==="auth_error")return{...account,blockedUntil:now2+9e5,blockReason:"auth_error",blockedAt:now2};let fallback=Math.min(MAX_RATE_LIMIT_BLOCK_MS,baseBlockMs*2**attempt2);if(classification.modelFamily!==void 0&&model!==void 0){let resetMs=retryAfterMs(error2)??usageLimitResetMs(errorText(error2),now2),duration2=Math.min(MAX_RATE_LIMIT_BLOCK_MS,resetMs!==void 0&&resetMs>0?resetMs:fallback),key=modelBlockKey(classification.modelFamily,model);return{...account,modelBlocks:withModelBlock(account.modelBlocks,key,now2+duration2,now2)}}let hinted=retryAfterMs(error2)??usageLimitBlockMs(errorText(error2),account.name,now2),duration=Math.min(MAX_RATE_LIMIT_BLOCK_MS,hinted??fallback);return{...account,blockedUntil:now2+duration,blockReason:classification.kind,blockedAt:now2}}async function clearBlockAfterSuccess(store,providerId,name,startedAt){let clearable=slot3=>slot3?.blockedUntil!==void 0&&slot3.blockReason!=="auth_error"&&(slot3.blockedAt??0)<=startedAt,stored=await store.read(providerId);if(stored?.type!=="oauth")return;let read2=stored,slot2=read2.accounts?.find(account=>account.name===name)??read2.slotState?.[name];clearable(slot2)&&await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current,state3=credential.slotState?.[name],slotState=state3===void 0||!clearable(state3)?credential.slotState:{...credential.slotState,[name]:{...state3.modelBlocks?{modelBlocks:state3.modelBlocks}:{}}};return{...credential,...slotState===void 0?{}:{slotState},accounts:(credential.accounts??[]).map(account=>{if(account.name!==name||!clearable(account))return account;let{blockedUntil:_blockedUntil,blockReason:_blockReason,blockedAt:_blockedAt,...rest}=account;return rest})}})}function isTransient(classification){return classification.kind==="overloaded"||classification.kind==="other"}function abortableSleep(ms,signal){return new Promise((resolve55,reject)=>{if(signal?.aborted){reject(signal.reason);return}let timer=setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve55()},ms),onAbort=()=>{clearTimeout(timer),reject(signal?.reason)};signal?.addEventListener("abort",onAbort,{once:!0})})}function replaceAccount(accounts,replacement){return accounts.map(account=>account.name===replacement.name?replacement:account)}async function persistBlock(store,providerId,account,now2){let superseded;return await store.modify(providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current;if(account.source==="env")return{...credential,slotState:{...credential.slotState,[account.name]:{blockedUntil:account.blockedUntil,blockReason:account.blockReason,...account.blockedAt===void 0?{}:{blockedAt:account.blockedAt},modelBlocks:mergeModelBlocks(credential.slotState?.[account.name]?.modelBlocks,account.modelBlocks,now2)}}};let stored=(credential.accounts??[]).find(existing2=>existing2.name===account.name);if(account.blockReason==="auth_error"&&stored!==void 0&&(stored.access!==account.access||stored.refresh!==account.refresh))return superseded=stored,current;let accounts=(credential.accounts??[]).map(existing2=>existing2.name===account.name?{...existing2,blockedUntil:account.blockedUntil,blockReason:account.blockReason,...account.blockedAt===void 0?{}:{blockedAt:account.blockedAt},modelBlocks:mergeModelBlocks(existing2.modelBlocks,account.modelBlocks,now2)}:existing2);return{...credential,accounts}}),superseded}function usable(account,now2,model){return account.blockReason===void 0&&(account.blockedUntil===void 0||account.blockedUntil<=now2)&&activeModelBlockUntil(account.modelBlocks,model,now2)===void 0}async function*runFailover(options){let now2=options.now??Date.now,baseBlockMs=options.baseBlockMs??DEFAULT_RATE_LIMIT_BLOCK_MS,accounts=clearExpiredBlocks(withSessionBlocks(options.accounts,options.sessionKey,now2()),now2()),attemptLimit=options.accountFallback===!1?Math.min(accounts.length,1):accounts.length,lastError,retriedOnStoredMaterial=new Set,transientRetriesUsed=0,longContextRetried=!1,retryAccountName;for(let attempt2=0;attempt2<attemptLimit;attempt2++){let retrySlot=retryAccountName===void 0?void 0:accounts.find(slot2=>slot2.name===retryAccountName);retryAccountName=void 0;let account={...retrySlot??options.selectFn(accounts)},visibleDeltaEmitted=!1,completed=!1,startedAt=now2();try{let attemptStream=await options.runAttempt(account);for await(let event of attemptStream){let failure2=(options.errorFromEvent??defaultErrorFromEvent)(event);if(failure2!==void 0)throw failure2;visibleDeltaEmitted||=(options.isVisibleDelta??defaultIsVisibleDelta)(event),yield event}completed=!0}catch(error2){let classification=options.classify(error2),classified=new ClassifiedSdkError(classification,error2,visibleDeltaEmitted);if(lastError=classified,!classification.retryable)throw classified;if(classification.kind==="long_context_unavailable"){if(visibleDeltaEmitted||longContextRetried)throw classified;longContextRetried=!0,options.onLongContextRefused?.(),retryAccountName=account.name,attempt2--;continue}if(isTransient(classification)){if(visibleDeltaEmitted||transientRetriesUsed>=TRANSIENT_RETRIES_PER_TURN)throw classified;let delayMs=TRANSIENT_RETRY_DELAY_MS*2**transientRetriesUsed;transientRetriesUsed+=1;try{await(options.sleep??abortableSleep)(delayMs,options.signal)}catch{throw classified}retryAccountName=account.name,attempt2--;continue}let blocked=blockedAccount(account,classification,now2(),attempt2,baseBlockMs,error2,options.model),shared=isSharedVerdict(classification,error2)||options.sessionKey===void 0;shared||rememberSessionBlock(options.sessionKey,blocked);let superseded=shared?await persistBlock(options.store,options.providerId,blocked,now2()):void 0;if(superseded&&!visibleDeltaEmitted&&usable(superseded,now2(),options.model)&&!retriedOnStoredMaterial.has(account.name)){retriedOnStoredMaterial.add(account.name),accounts=replaceAccount(accounts,superseded),attempt2--;continue}accounts=replaceAccount(accounts,blocked);let event={account:blocked,classification,attempt:attempt2+1,visibleDeltaEmitted};try{!visibleDeltaEmitted&&attempt2+1<attemptLimit&&(event.nextAccount=options.selectFn(accounts))}finally{await options.onFailover?.(event)}if(visibleDeltaEmitted)throw classified}if(completed){forgetSessionBlock(options.sessionKey,account.name),await clearBlockAfterSuccess(options.store,options.providerId,account.name,startedAt).catch(error2=>{process.stderr.write(`senpi anthropic-subscription: could not clear a stored block on ${account.name}: ${error2 instanceof Error?error2.message:String(error2)}
|
|
@@ -149,7 +149,7 @@ Next: ${anchors.next}
|
|
|
149
149
|
${final?TODO_OWED_SECOND_PREFIX:""}The turn ended with open todo work and no question to the user. Ask: ${anchors.ask}. Now: ${anchors.now}. Next: ${anchors.next}. Either continue the next open task now with real tool calls, or mark it done/dropped via the todo tool and tell the user in one sentence why you stopped. Do not restate the plan.
|
|
150
150
|
</system-reminder>`}function buildTodoOwedStopNotice(openTasks,now2,continuations){return`Agent stopped with ${openTasks===1?"1 open todo task":`${openTasks} open todo tasks`} (Now: ${now2}): ${continuations} automatic continuations in a row ended without closing a task. Reply to resume it, or close the work with /todo done or /todo drop.`}function endsWithQuestion(text3){let last=text3.split(/\n\s*\n/).map(paragraph=>paragraph.trim()).filter(paragraph=>paragraph!=="").at(-1);return last!==void 0&&QUESTION_SENTENCE_END.test(last)}function assistantText(message){return message===void 0?"":message.content.filter(content=>content.type==="text").map(content=>content.text).join(`
|
|
151
151
|
`)}function calledAskUser(messages){return messages.some(message=>message.role==="assistant"&&message.content.some(content=>content.type==="toolCall"&&ASK_USER_TOOLS.has(content.name)))}function readTurnEndBackstopSetting(ctx){return SettingsManager.create(ctx.cwd,ctx.agentDir,{projectTrusted:ctx.isProjectTrusted()}).getTodoTurnEndBackstop()}function firstTodoOwedSuppression(input){let{ctx,event}=input;if(ctx.sessionManager.getHeader?.()?.parentSession!==void 0)return"subagent";if(NON_INTERACTIVE_MODES.has(ctx.mode))return"non-interactive";if(event.aborted===!0||!didAgentEndCleanly(event.messages))return"not-clean";if(lastAssistantMessage(event.messages)?.stopReason==="length")return"length";if(openTodoTaskContents(ctx.sessionManager.getBranch()).length===0)return"no-open-tasks";if(collectOnDutySources(input).length>0)return"waiting";if(input.goal?.status==="active"&&input.goal.continuationStoppedAt!==void 0)return"goal-stopped";if(calledAskUser(event.messages))return"ask-user-call";if(endsWithQuestion(assistantText(lastAssistantMessage(event.messages))))return"question";if(!readTurnEndBackstopSetting(ctx))return"disabled"}var TodoOwedBackstop=class{#pi;#remindersThisChain=0;#notifiedThisChain=!1;#openTasksAtLastNudge;#logger;constructor(pi){this.#pi=pi}resetChain(){this.#remindersThisChain=0,this.#notifiedThisChain=!1,this.#openTasksAtLastNudge=void 0}afterAgentEnd(input){let suppression=firstTodoOwedSuppression(input);if(suppression!==void 0){let sources=suppression==="waiting"?collectOnDutySources(input):void 0;if(this.#logSuppression(input.ctx,suppression,sources),sources!==void 0){let{ctx:ctx2}=input,branch2=ctx2.sessionManager.getBranch(),anchors2=describeAskNowNext(getLatestTodoStateFromBranchEntries(branch2));ctx2.ui.setStatus("todo-waiting",`waiting: ${sources.join(", ")}`),this.#emit({sessionId:ctx2.sessionManager.getSessionId(),chainCount:this.#remindersThisChain,openTasks:openTodoTaskContents(branch2).length,now:anchors2.now,next:anchors2.next,reason:"waiting",sources})}return suppression}let{ctx}=input,branch=ctx.sessionManager.getBranch(),openTaskContents=openTodoTaskContents(branch),openTasks=openTaskContents.length,stillOpen=new Set(openTaskContents),previous=this.#openTasksAtLastNudge;previous!==void 0&&[...previous].some(task=>!stillOpen.has(task))&&this.resetChain();let anchors=describeAskNowNext(getLatestTodoStateFromBranchEntries(branch)),sessionId=ctx.sessionManager.getSessionId();if(this.#remindersThisChain>=TODO_OWED_CHAIN_LIMIT)return this.#notifiedThisChain?(this.#logSuppression(ctx,"cap"),"cap"):(this.#notifiedThisChain=!0,ctx.ui.notify(buildTodoOwedStopNotice(openTasks,anchors.now,this.#remindersThisChain),"warning"),this.#emit({sessionId,chainCount:this.#remindersThisChain,openTasks,now:anchors.now,next:anchors.next,reason:"capped"}),"capped");this.#remindersThisChain+=1,this.#openTasksAtLastNudge=stillOpen;let content=buildTodoOwedReminder(anchors,this.#remindersThisChain===TODO_OWED_CHAIN_LIMIT);return this.#pi.sendMessage({customType:TODO_OWED_CUSTOM_TYPE,content,display:!1},{triggerTurn:!0,deliverAs:"followUp"}),this.#emit({sessionId,chainCount:this.#remindersThisChain,openTasks,now:anchors.now,next:anchors.next,reason:"delivered"}),"delivered"}#emit(event){this.#pi.events.emit(TODO_OWED_REMINDER_EVENT,event)}#logSuppression(ctx,reason,sources){this.#logger??=createSessionLogger(ctx.agentDir),this.#logger.debug("todo_owed_backstop_suppressed",{reason,...sources===void 0?{}:{source:sources.join(", ")}})}};var SDK_OAUTH_EXHAUSTION_MARKERS=["API Error: Server is temporarily limiting requests","accounts exhausted"];function isSdkOauthAccountExhaustion(message){if(message?.api!=="claude-sdk-oauth"||message.stopReason!=="stop")return!1;let text3=Array.isArray(message.content)?message.content.map(part=>part?.type==="text"?part.text:"").join(`
|
|
152
|
-
`):"";return SDK_OAUTH_EXHAUSTION_MARKERS.every(marker=>text3.includes(marker))}var CODEX_POLICY_ERROR_PATTERN=/^(?:Codex error: )?This request was blocked by our safety systems\.(?: Reason: .+)?$/i,CODEX_RESPONSES_API2="openai-codex-responses";function isCodexPolicyRejection(message){return message.api!==CODEX_RESPONSES_API2||message.stopReason!=="error"?!1:CODEX_POLICY_ERROR_PATTERN.test(message.errorMessage??"")}function didTerminalPolicyRejectionEndTurn(event){if(event.willRetry!==!1)return!1;let message=lastAssistantMessage(event.messages);return message===void 0?!1:isClassifierRefusal(message)||isCodexPolicyRejection(message)}var LEADING_AUTH_STATUS_PATTERN=/^(401|403)\b/;function authStatusOf(message){let diagnostic2=message.providerDiagnostic;if(diagnostic2!==void 0)return diagnostic2.httpStatus===401||diagnostic2.httpStatus===403?diagnostic2.httpStatus:diagnostic2.category==="auth"?401:void 0;let status=LEADING_AUTH_STATUS_PATTERN.exec(message.errorMessage??"")?.[1];return status==="401"?401:status==="403"?403:void 0}function terminalProviderAuthFailure(event){if(event.abortSource==="system"||event.willRetry!==!1)return;let message=lastAssistantMessage(event.messages);if(message?.stopReason!=="error")return;let httpStatus=authStatusOf(message);if(httpStatus!==void 0)return{httpStatus,provider:message.provider,model:message.model}}function didTerminalProviderErrorEndTurn(event){if(event.abortSource==="system"||event.willRetry!==!1)return!1;let message=lastAssistantMessage(event.messages);return isSdkOauthAccountExhaustion(message)?!0:message?.stopReason==="error"||message?.stopReason==="aborted"&&event.abortSource!=="user"}var TURN_END_LIVENESS_EVENT="turn_end_liveness",TURN_END_LIVENESS_ENTRY_TYPE="turn-end-liveness",NON_INTERACTIVE_MODES2=new Set(["print","json"]);function classifyTurnEnd(event){return event.aborted===!0&&event.abortSource==="user"?"user-abort":event.aborted===!0&&event.abortSource==="system"?"system-abort":event.abortSource==="provider"?"provider-abort":event.aborted===!0?"unknown-abort":didTerminalPolicyRejectionEndTurn(event)?"policy-rejection":didTerminalProviderErrorEndTurn(event)?"provider-error":didAgentEndCleanly(event.messages)?"clean":"unknown-abort"}function isGoalOwnedWake(expectation){return expectation.kind==="armed-timer"||expectation.kind==="recovery-staged"}function effectiveWakes(input){return input.expectations.filter(expectation=>!(expectation.kind==="question-to-user"&&input.endedBy!=="clean")&&!(input.deadlineStop&&isGoalOwnedWake(expectation)))}function hasQueuedUserInput(input){return input.expectations.some(expectation=>expectation.kind==="user-input-queued")}function heldReason(input){if(input.deadlineStop)return"deadline-stop";if(input.endedBy==="user-abort")return"user-abort";if(input.ledgerHold!==void 0)return input.ledgerHold;if(input.isChildSession)return"child-session";if(input.goalStopped)return"goal-stopped"}function abortSourceOf(endedBy){return endedBy==="system-abort"?"system":endedBy==="provider-abort"?"provider":void 0}var TURN_END_RULES=[{id:"retry",when:i=>i.willRetry,verdict:()=>({kind:"continuing",via:"retry"})},{id:"ledger-hold",when:i=>i.ledgerHold!==void 0&&!hasQueuedUserInput(i),verdict:i=>({kind:"held",reason:i.ledgerHold??"unattended"})},{id:"continuation-queued",when:i=>i.continuationQueued!==void 0,verdict:i=>({kind:"continuing",via:i.continuationQueued??"goal"})},{id:"non-interactive",when:i=>NON_INTERACTIVE_MODES2.has(i.mode),verdict:()=>({kind:"held",reason:"non-interactive"})},{id:"wake",when:i=>effectiveWakes(i).length>0,verdict:i=>{let held=heldReason(i);return{kind:"waiting",on:effectiveWakes(i),...held!==void 0?{heldBy:held}:{}}}},{id:"held",when:i=>heldReason(i)!==void 0,verdict:i=>({kind:"held",reason:heldReason(i)??"goal-stopped"})},{id:"provider-error",when:i=>i.endedBy==="provider-error"||i.endedBy==="policy-rejection",verdict:i=>i.providerRetryAtMs===void 0?{kind:"stalled",reason:"provider-error"}:{kind:"stalled",reason:"provider-error",retryAtMs:i.providerRetryAtMs}},{id:"aborted",when:i=>i.endedBy==="system-abort"||i.endedBy==="provider-abort"||i.endedBy==="unknown-abort",verdict:i=>{let abortSource=abortSourceOf(i.endedBy);return{kind:"stalled",reason:"aborted",...abortSource!==void 0?{abortSource}:{}}}},{id:"budget",when:i=>i.openWork.kind!=="none"&&i.budgetSpent,verdict:()=>({kind:"stalled",reason:"budget"})},{id:"no-wake",when:i=>i.openWork.kind!=="none",verdict:()=>({kind:"stalled",reason:"no-wake"})},{id:"done",when:()=>!0,verdict:()=>({kind:"done"})}];function evaluateTurnEndLiveness(input){return(TURN_END_RULES.find(candidate=>candidate.when(input))??TURN_END_RULES[TURN_END_RULES.length-1]).verdict(input)}function repeatsLastStall(branch,verdict){for(let index=branch.length-1;index>=0;index--){let entry2=branch[index];if(entry2?.type==="message"&&entry2.message.role==="user")return!1;if(entry2?.type!=="custom"||entry2.customType!==TURN_END_LIVENESS_ENTRY_TYPE)continue;let recorded=entry2.data?.verdict;return recorded?.reason===verdict.reason&&recorded.retryAtMs===verdict.retryAtMs&&recorded.abortSource===verdict.abortSource}return!1}function personInputQueued(ctx){return ctx.hasQueuedPersonInput?.()===!0}function engineTurnsHeld(ctx){if(!("engineTurnsHeld"in ctx))return!1;let probe=ctx.engineTurnsHeld;return typeof probe=="function"&&probe.call(ctx)===!0}function collectTurnEndLivenessInput(ctx,event,state3){let{goal,todoOutcome,monitor}=state3,openTodos=openTodoTaskContents(ctx.sessionManager.getBranch()).length,openWork=goal?.status==="active"?{kind:"active-goal",goalId:goal.id}:openTodos>0?{kind:"open-todos",count:openTodos}:{kind:"none"},expectations=monitor.liveWakeSources().map(source2=>({kind:"wake-source",source:source2})),timer=monitor.scheduledContinuation();return timer!==void 0&&expectations.push({kind:"armed-timer",timer}),monitor.hasStagedRecovery()&&expectations.push({kind:"recovery-staged"}),ctx.hasPendingMessages()&&expectations.push(personInputQueued(ctx)?{kind:"user-input-queued"}:{kind:"pending-messages"}),(calledAskUser(event.messages)||endsWithQuestion(lastAssistantText(event.messages)))&&expectations.push({kind:"question-to-user"}),{isChildSession:ctx.sessionManager.getHeader?.()?.parentSession!==void 0,mode:ctx.mode,ledgerHold:engineTurnsHeld(ctx)?"unattended":void 0,endedBy:classifyTurnEnd(event),willRetry:event.willRetry===!0,deadlineStop:state3.deadlineStop,goalStopped:goal?.status==="paused"||goal?.status==="blocked",openWork,continuationQueued:state3.continuationPending?"goal":todoOutcome==="delivered"?"todo-backstop":void 0,expectations,budgetSpent:goal?.status==="active"&&goal.continuationStoppedAt!==void 0||todoOutcome==="capped"||todoOutcome==="cap",providerRetryAtMs:providerRetryAt(event.messages,Date.now())}}function reportTurnEndLiveness(pi,ctx,event,state3){let input=collectTurnEndLivenessInput(ctx,event,state3),verdict=evaluateTurnEndLiveness(input);if(publishGoalContinuationEvent(pi,TURN_END_LIVENESS_EVENT,{sessionId:ctx.sessionManager.getSessionId(),verdict}),verdict.kind!=="stalled"||repeatsLastStall(ctx.sessionManager.getBranch(),verdict))return;let logger=createSessionLogger(ctx.agentDir);try{pi.appendEntry(TURN_END_LIVENESS_ENTRY_TYPE,{verdict,openWork:input.openWork})}catch(error2){logger.warn("goal_continuation_record_write_failed",{kind:TURN_END_LIVENESS_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}}import{statSync as statSync4}from"node:fs";function readLifecycleGoal(ref){try{statSync4(goalFilePath(ref))}catch(error2){if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")return Promise.resolve(null);throw error2}return readGoal(ref)}var lifecycleHistory={initial:()=>[],add:(entries,entry2)=>(entry2.type==="custom"&&(entry2.customType==="session-lifecycle"||entry2.customType==="work-custody"||entry2.customType==="child-lifecycle"||entry2.customType==="interrupted-run")&&entries.push(entry2),entries)};function bindLifecycleHumanInput(session,listener){return session.onHumanInputAdmitted(event=>listener({kind:event.kind,at:new Date(event.at).toISOString()}))}var dialogOpenedAt=new WeakMap;function readLifecycleRuntimeFacts(session){let now2=new Date().toISOString(),human=[],tuiWait=session.extensionRunner.getLifecycleHumanWait?.();tuiWait&&human.push({...tuiWait,originSessionId:session.sessionId});let dialogs=sessionDialogRequests.get(session)?.snapshot()??[],opened=dialogOpenedAt.get(session)??new Map;dialogOpenedAt.set(session,opened);for(let id of opened.keys())dialogs.some(dialog=>dialog.id===id)||opened.delete(id);for(let question of sessionQuestionBridges.get(session)?.pendingQuestions()??[])human.push({kind:"question",originSessionId:session.sessionId,requestId:question.requestId,revision:1,since:new Date(question.askedAtMs).toISOString()});for(let dialog of dialogs)opened.has(dialog.id)||opened.set(dialog.id,now2),human.push({kind:dialog.method==="confirm"?"approval":"question",originSessionId:session.sessionId,requestId:dialog.id,revision:1,since:opened.get(dialog.id)??now2});let holds2=session.holds.flatMap(hold=>{switch(hold.kind){case"unattended":case"session_hold":case"run_fence":case"inherited_hold":return[{kind:hold.kind,since:hold.since}];default:return[]}});return{activity:session.activitySnapshot,pendingMessages:session.pendingMessageCount,holds:holds2,human,inputAdmissionPending:session.externalAdmission.hasInputWork}}var LifecycleChildren=class{constructor(store){this.records=new Map,this.store=store;for(let entry2 of store.entries){if(entry2.type!=="custom"||entry2.customType!=="child-lifecycle")continue;let report=readChildReport(entry2.data);report&&this.accept(report,!1)}}get reports(){return[...this.records.values()]}get activeCount(){return this.reports.filter(report=>report.terminal===void 0).length}report(report){let parsed=readChildReport(report);if(!parsed)throw new Error("Invalid child lifecycle report");this.accept(parsed,!0)&&this.store.changed()}accept(report,persist2){let previous=this.records.get(report.taskId);if(previous&&(report.runEpoch<previous.runEpoch||report.runEpoch===previous.runEpoch&&(previous.terminal!==void 0||report.generation<=previous.generation)))return!1;let accepted={...report,...report.waitingOn?{waitingOn:{...report.waitingOn,human:[]}}:{}};return persist2&&this.store.append(accepted),this.records.set(report.taskId,accepted),!0}};function readLifecycleState(value){switch(value){case"running":case"waiting_children":case"waiting_background":case"waiting_human":case"paused":case"held":case"done":case"failed":case"cancelled":return value;default:return}}function readChildReport(value){if(!isRecord5(value))return;let state3=readLifecycleState(value.state);if(!state3||typeof value.taskId!="string"||typeof value.childSessionId!="string"||typeof value.runEpoch!="number"||!Number.isSafeInteger(value.runEpoch)||value.runEpoch<0||typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<0)return;let terminal2=readTerminal(value.terminal),waitingOn;if(isRecord5(value.waitingOn)&&typeof value.waitingOn.children=="number"){let background=[];if(Array.isArray(value.waitingOn.background))for(let item of value.waitingOn.background)!isRecord5(item)||typeof item.source!="string"||typeof item.activeCount!="number"||background.push({source:item.source,activeCount:item.activeCount,...typeof item.retryAtMs=="number"?{retryAtMs:item.retryAtMs}:{}});waitingOn={children:value.waitingOn.children,background,human:[]}}return{taskId:value.taskId,childSessionId:value.childSessionId,runEpoch:value.runEpoch,generation:value.generation,state:state3,...waitingOn?{waitingOn}:{},...terminal2===void 0?{}:{terminal:terminal2}}}function readTerminal(value){switch(value){case"completed":case"error":case"lost":case"interrupted":case"cancelled":return value;default:return}}var LifecycleAttention=class{constructor(sessionId,restored){this.open=new Map,this.sessionId=sessionId,this.sequence=restored?.attentionSeq??0;for(let occurrence of restored?.synthetic??[])this.open.set(occurrence.key,occurrence.wait)}get attentionSeq(){return this.sequence}get synthetic(){return[...this.open].map(([key,wait])=>({key,wait}))}reconcile(requests){let wanted=new Set(requests.map(request2=>request2.key));for(let key of this.open.keys())wanted.has(key)||this.open.delete(key);return requests.map(({key,kind})=>{let existing2=this.open.get(key);if(existing2?.kind===kind)return existing2;let wait={kind,originSessionId:this.sessionId,requestId:`${key}:${++this.sequence}`,revision:1,since:new Date().toISOString()};return this.open.set(key,wait),wait})}};function readHumanWait(value){if(isRecord5(value)){switch(value.kind){case"question":case"approval":case"goal_blocked":case"goal_paused":case"stalled":case"interrupted_run":break;default:return}if(!(typeof value.originSessionId!="string"||typeof value.requestId!="string"||typeof value.revision!="number"||typeof value.since!="string"))return{kind:value.kind,originSessionId:value.originSessionId,requestId:value.requestId,revision:value.revision,since:value.since,...typeof value.childSessionId=="string"?{childSessionId:value.childSessionId}:{},...typeof value.childLabel=="string"?{childLabel:value.childLabel}:{}}}}function readLifecycleRecord(value){if(!isRecord5(value))return;let state3=readLifecycleState(value.state);if(!state3||typeof value.sessionId!="string"||typeof value.seq!="number"||typeof value.epoch!="number"||value.epochOrigin!=="human"&&value.epochOrigin!=="automatic"||typeof value.humanInputRevision!="number"||typeof value.selfSettleEligible!="boolean"||typeof value.runPaused!="boolean"||typeof value.since!="string"||value.role!=="root"&&value.role!=="child"||typeof value.rootSessionId!="string")return;let synthetic=[];if(Array.isArray(value.synthetic))for(let occurrence of value.synthetic){if(!isRecord5(occurrence)||typeof occurrence.key!="string")continue;let wait=readHumanWait(occurrence.wait);wait&&synthetic.push({key:occurrence.key,wait})}let waitingOn=readWaits(value.waitingOn),holds2=readHolds(value.holds),completion=readCompletion(value.completion),failure2=readFailure(value.failure),lastTurnEnd=readTurnEnd(value.lastTurnEnd);return{sessionId:value.sessionId,state:state3,seq:value.seq,epoch:value.epoch,epochOrigin:value.epochOrigin,humanInputRevision:value.humanInputRevision,selfSettleEligible:value.selfSettleEligible,runPaused:value.runPaused,since:value.since,role:value.role,rootSessionId:value.rootSessionId,restoring:!0,persisted:value.persisted===!0,attentionSeq:typeof value.attentionSeq=="number"?value.attentionSeq:0,synthetic,epochSealed:value.epochSealed===!0,runActive:value.runActive===!0,interrupted:value.interrupted===!0,...typeof value.completedGoalId=="string"?{completedGoalId:value.completedGoalId}:{},...typeof value.completedRunId=="string"?{completedRunId:value.completedRunId}:{},...typeof value.completionId=="string"?{completionId:value.completionId}:{},...typeof value.parentSessionId=="string"?{parentSessionId:value.parentSessionId}:{},...typeof value.taskId=="string"?{taskId:value.taskId}:{},...typeof value.runId=="string"?{runId:value.runId}:{},...waitingOn?{waitingOn}:{},...holds2?{holds:holds2}:{},...completion?{completion}:{},...failure2?{failure:failure2}:{},...lastTurnEnd?{lastTurnEnd}:{},...isRecord5(value.settleDecision)&&typeof value.settleDecision.decisionId=="string"?{settleDecision:{decisionId:value.settleDecision.decisionId}}:{},...isRecord5(value.settleRequest)&&typeof value.settleRequest.epoch=="number"&&typeof value.settleRequest.revision=="number"?{settleRequest:{epoch:value.settleRequest.epoch,revision:value.settleRequest.revision}}:{}}}function readTurnEnd(value){if(!(!isRecord5(value)||typeof value.deadlineStop!="boolean"||typeof value.budgetSpent!="boolean"))switch(value.endedBy){case"clean":case"user-abort":case"system-abort":case"provider-abort":case"unknown-abort":case"provider-error":case"policy-rejection":return{endedBy:value.endedBy,deadlineStop:value.deadlineStop,budgetSpent:value.budgetSpent,providerRetryAtMs:typeof value.providerRetryAtMs=="number"?value.providerRetryAtMs:void 0};default:return}}function readWaits(value){if(!isRecord5(value)||typeof value.children!="number")return;let background=[];if(Array.isArray(value.background))for(let source2 of value.background)!isRecord5(source2)||typeof source2.source!="string"||typeof source2.activeCount!="number"||background.push({source:source2.source,activeCount:source2.activeCount,...typeof source2.retryAtMs=="number"?{retryAtMs:source2.retryAtMs}:{}});let human=Array.isArray(value.human)?value.human.flatMap(request2=>{let wait=readHumanWait(request2);return wait?[wait]:[]}):[];return{children:value.children,background,human}}function readHolds(value){if(Array.isArray(value))return value.flatMap(hold=>{if(!isRecord5(hold)||typeof hold.since!="string")return[];switch(hold.kind){case"session_hold":case"run_fence":case"inherited_hold":case"unattended":return[{kind:hold.kind,since:hold.since}];default:return[]}})}function readCompletion(value){if(!(!isRecord5(value)||typeof value.at!="string"))switch(value.kind){case"goal":case"run":case"agent":case"reply":return{kind:value.kind,at:value.at,...typeof value.goalId=="string"?{goalId:value.goalId}:{},...typeof value.runId=="string"?{runId:value.runId}:{}};default:return}}function readFailure(value){if(isRecord5(value))switch(value.reason){case"provider_error":case"tool_error":case"task_error":case"lost":case"interrupted":return{reason:value.reason,...typeof value.message=="string"?{message:value.message}:{},...typeof value.retryAtMs=="number"?{retryAtMs:value.retryAtMs}:{},...typeof value.taskId=="string"?{taskId:value.taskId}:{},...typeof value.runEpoch=="number"?{runEpoch:value.runEpoch}:{}};default:return}}function lifecycleState(facts){let stopHeld=facts.holds.some(hold=>hold.kind==="session_hold"||hold.kind==="inherited_hold");if(facts.role==="child"&&facts.terminal!==void 0)switch(facts.terminal){case"completed":if(facts.holds.length===0)return"done";break;case"cancelled":return"cancelled";case"error":case"lost":return"failed";case"interrupted":if(!stopHeld)return"failed";break;default:return facts.terminal}return stopHeld||facts.holds.some(hold=>hold.kind==="run_fence")&&!facts.running?"paused":facts.holds.length>0&&facts.holds.every(hold=>hold.kind==="unattended")?"held":facts.waits.human.length>0?"waiting_human":facts.running?"running":facts.waits.children>0?"waiting_children":facts.waits.background.length>0?"waiting_background":facts.role==="child"?"running":facts.failure!==void 0?"failed":"done"}function lifecycleTerminal(state3){switch(state3){case"done":case"failed":case"cancelled":return!0;case"running":case"waiting_children":case"waiting_background":case"waiting_human":case"paused":case"held":return!1;default:return state3}}var LifecycleLedger=class{constructor(persistence){this.sealed=!1,this.admissionWriteFailed=!1,this.unwritten=!1,this.runActive=!1,this.interrupted=!1,this.persistence=persistence;let restored;for(let entry2 of persistence.entries){if(entry2.type!=="custom"||entry2.customType!=="session-lifecycle")continue;let parsed=readLifecycleRecord(entry2.data);parsed?.sessionId===persistence.sessionId&&(!restored||parsed.seq>restored.seq)&&(restored=parsed)}let spawnedBy=persistence.spawnedBy;this.current=restored?wireSnapshot(restored):{state:"done",seq:0,epoch:0,epochOrigin:"automatic",humanInputRevision:0,selfSettleEligible:!0,restoring:!0,persisted:!1,runPaused:!1,since:new Date().toISOString(),role:spawnedBy?"child":"root",rootSessionId:spawnedBy?.rootSessionId??persistence.sessionId,...spawnedBy?{parentSessionId:spawnedBy.parentSessionId,taskId:spawnedBy.taskId}:{}},this.attention=new LifecycleAttention(persistence.sessionId,restored),this.sealed=restored?.epochSealed??!1,this.runId=restored?.runId,this.interrupted=restored?.interrupted===!0||restored?.runActive===!0&&!this.sealed,this.goalCompleted=restored?.completedGoalId,this.runCompleted=restored?.completedRunId,this.lastTurnEnd=restored?.lastTurnEnd,restored?.settleRequest&&!this.sealed&&(this.current={...this.current,selfSettleEligible:!1})}get snapshot(){return this.current}custodyWriteFailed(){this.current={...this.current,persisted:!1,selfSettleEligible:!1}}releaseRestoreBarrier(){this.current={...this.current,restoring:!1}}humanInput(at){this.request=void 0;let{settleDecision:_decision,...current}=this.current,preparingFirstTurn=current.epoch===0&&lifecycleTerminal(current.state),next={...current,state:preparingFirstTurn?"running":current.state,humanInputRevision:current.humanInputRevision+1,since:preparingFirstTurn?at:current.since};!this.runActive&&(this.sealed||current.epoch===0)?(this.current=next,this.unwritten=!0):this.write(next,!0)||(this.admissionWriteFailed=!0)}startRun(origin){this.lastTurnEnd=void 0,this.openEpoch(origin),this.runId=crypto.randomUUID(),this.runActive=!0,this.admissionWriteFailed=!1,this.unwritten=!0}openEpoch(origin){if(!this.sealed&&this.current.epoch>0)return;this.sealed=!1,this.request=void 0,this.goalCompleted=void 0,this.runCompleted=void 0;let{completionId:_id,completion:_completion,failure:_failure,settleDecision:_decision,...current}=this.current;this.current={...current,epoch:current.epoch+1,epochOrigin:origin,selfSettleEligible:!this.admissionWriteFailed},this.unwritten=!0}markGoalCompleted(goalId){this.current.epoch===0||this.sealed||this.goalCompleted===goalId||(this.goalCompleted=goalId,this.checkpoint())}markRunCompleted(runId){this.current.epoch===0||this.sealed||this.runCompleted===runId||(this.runCompleted=runId,this.checkpoint())}requestSelfSettle(){let base={epoch:this.current.epoch,humanInputRevision:this.current.humanInputRevision};return(this.current.holds?.length??0)>0?{...base,recorded:!1,reason:"held"}:this.current.epoch===0||this.sealed?{...base,recorded:!1,reason:"no_epoch"}:!this.current.selfSettleEligible||this.current.role!=="root"?{...base,recorded:!1,reason:"not_eligible"}:(this.request={epoch:this.current.epoch,revision:this.current.humanInputRevision},this.write(this.current,!1)?{...base,recorded:!0}:(this.request=void 0,this.current={...this.current,selfSettleEligible:!1},{...base,recorded:!1,reason:"not_eligible"}))}update(input){(input.holds.length>0||input.state==="failed")&&(this.request=void 0);let terminal2=input.state==="done"||input.state==="failed",{completionId:_id,completion:_completion,failure:_failure,settleDecision:_decision,...base}=this.current,now2=new Date().toISOString(),standingRequest=this.request?.epoch===base.epoch&&this.request.revision===base.humanInputRevision&&base.selfSettleEligible&&input.holds.length===0,completion=input.state==="done"&&base.epoch>0?this.goalCompleted?{kind:"goal",at:now2,goalId:this.goalCompleted}:this.runCompleted?{kind:"run",at:now2,runId:this.runCompleted}:{kind:standingRequest?"agent":"reply",at:now2}:void 0,next={...base,state:input.state,waitingOn:input.waits,holds:input.holds,runPaused:input.holds.some(hold=>hold.kind==="run_fence"),since:input.state===this.current.state?this.current.since:now2,...terminal2&&base.epoch>0?{completionId:`${this.persistence.sessionId}:${base.epoch}`}:{},...completion?{completion:this.current.state==="done"&&this.sealed?this.current.completion??completion:completion}:{},...input.state==="failed"&&input.failure?{failure:input.failure}:{},...input.state==="done"&&standingRequest?{settleDecision:this.current.settleDecision??{decisionId:crypto.randomUUID()}}:{},...input.state==="done"&&this.sealed&&this.current.settleDecision?{settleDecision:this.current.settleDecision}:{}};if(terminal2&&base.epoch>0&&(this.sealed=!0),!this.current.restoring&&!(this.current.persisted&&equivalent(this.current,next))){if(terminal2&&base.epoch===0){this.current=next;return}this.write(next,!0)}}checkpoint(){this.write(this.current,!1)}publishUnwritten(){this.unwritten&&this.write(this.current,!0)}write(snapshot,emit2){let next={...snapshot,seq:this.current.seq+1,persisted:!0},record10={...next,sessionId:this.persistence.sessionId,attentionSeq:this.attention.attentionSeq,synthetic:this.attention.synthetic,epochSealed:this.sealed,runActive:this.runActive,interrupted:this.interrupted,...this.lastTurnEnd?{lastTurnEnd:this.lastTurnEnd}:{},...this.goalCompleted?{completedGoalId:this.goalCompleted}:{},...this.runCompleted?{completedRunId:this.runCompleted}:{},...this.runId?{runId:this.runId}:{},...this.request?{settleRequest:this.request}:{}};this.unwritten=!1;try{this.persistence.append(record10),this.current=next}catch(error2){if(!(error2 instanceof Error))throw error2;this.current={...next,persisted:!1,selfSettleEligible:!1}}return emit2&&!this.current.restoring&&this.persistence.emit({type:"session_lifecycle",sessionId:this.persistence.sessionId,lifecycle:this.current}),this.current.persisted}};function equivalent(previous,next){return previous.state===next.state&&previous.epoch===next.epoch&&previous.humanInputRevision===next.humanInputRevision&&previous.runPaused===next.runPaused&&previous.selfSettleEligible===next.selfSettleEligible&&JSON.stringify(previous.waitingOn)===JSON.stringify(next.waitingOn)&&JSON.stringify(previous.holds)===JSON.stringify(next.holds)&&JSON.stringify(previous.failure)===JSON.stringify(next.failure)}function wireSnapshot(record10){let{sessionId:_sessionId,interrupted:_interrupted,completedGoalId:_goal,completedRunId:_completedRun,lastTurnEnd:_lastTurnEnd,attentionSeq:_attentionSeq,synthetic:_synthetic,epochSealed:_sealed,settleRequest:_request,runId:_runId,runActive:_runActive,...snapshot}=record10;return snapshot}var ENGINE_DELIVERY_KEY_PREFIX="delivery:",WAKE_SOURCE_KEY_PREFIX="wake-source:",ENGINE_CUSTODY_KEY_PREFIXES=[ENGINE_DELIVERY_KEY_PREFIX,WAKE_SOURCE_KEY_PREFIX],DeliveryTicketRefused=class extends Error{constructor(ticketId,reason){super(`Delivery ticket ${ticketId} was refused: ${reason}`),this.name="DeliveryTicketRefused",this.ticketId=ticketId,this.reason=reason}},CustodyViolation=class extends Error{constructor(key){super(`Work custody is no longer owned: ${key}`),this.name="CustodyViolation",this.key=key}},SessionWorkObligations=class{constructor(store){this.records=new Map,this.unpersisted=new Map,this.delivering=new Set,this.publishedSources=new Set,this.store=store;for(let entry2 of store.entries){if(entry2.type!=="custom"||entry2.customType!=="work-custody")continue;let record10=readWorkCustody(entry2.data);record10&&this.records.set(record10.id,record10)}}get active(){return[...this.records.values()].filter(custodyIsOpen)}get activeCount(){return this.active.reduce((sum,record10)=>sum+(record10.activeCount??1),0)}get persisted(){return this.unpersisted.size===0}open(key,kind,detail){let existing2=this.active.find(record11=>record11.key===key);if(existing2)return this.token(existing2.id);let record10={id:crypto.randomUUID(),key,kind,state:"open",...detail===void 0?{}:{detail}};return this.install(record10),this.store.changed(),this.token(record10.id)}syncSource(source2,kind,activeCount){let key=`${WAKE_SOURCE_KEY_PREFIX}${source2}`;this.publishedSources.add(key);let current=this.active.find(record10=>record10.key===key);if(activeCount<=0){current&&this.close(current.id,"passive");return}current?.activeCount===activeCount&¤t.kind===kind||(this.install({...current,id:current?.id??crypto.randomUUID(),key,source:source2,kind,activeCount,state:current?.state??"open"}),this.store.changed())}retireRestoredSources(){for(let record10 of this.active)record10.key.startsWith(WAKE_SOURCE_KEY_PREFIX)&&!this.publishedSources.has(record10.key)&&this.close(record10.id,"passive")}admission(ticketId){let record10=[...this.records.values()].find(value=>value.ticketId===ticketId);return record10?custodyIsOpen(record10)?record10.state==="consumed"?"consumed":this.delivering.has(ticketId)?"delivering":"admitted":"closed":"unknown"}queue(ticketId,payload){let admission=this.admission(ticketId);if(admission==="unknown")throw new CustodyViolation(ticketId);if(admission!=="admitted")return!1;let record10=this.ticketRecord(ticketId),itemIds=payload.itemIds??(record10.state==="queued"?record10.payload?.itemIds:void 0);return this.install({...record10,state:"queued",payload:{...payload,...itemIds?{itemIds}:{}},delivery:void 0}),this.delivering.add(ticketId),this.store.changed(),!0}queuedItemIds(ticketId){let record10=[...this.records.values()].find(value=>value.ticketId===ticketId);return record10?.state==="queued"?record10.payload?.itemIds:void 0}endDelivery(ticketId){this.delivering.delete(ticketId)}passive(ticketId){let record10=this.ticketRecord(ticketId);custodyIsOpen(record10)&&this.close(record10.id,"passive")}consumed(ticketId,run2){let record10=this.ticketRecord(ticketId);!custodyIsOpen(record10)||record10.state==="consumed"||(this.install({...record10,state:"consumed",...run2,delivery:void 0}),this.store.changed())}failed(ticketId){let record10=this.ticketRecord(ticketId);!custodyIsOpen(record10)||record10.state==="consumed"||(this.install({...record10,state:"queued",delivery:"failed"}),this.store.changed())}held(ticketId,noticeId){let record10=this.ticketRecord(ticketId);custodyIsOpen(record10)&&this.close(record10.id,"held",noticeId)}retire(ticketId){let record10=this.ticketRecord(ticketId);!custodyIsOpen(record10)||record10.state==="consumed"||(this.install({...record10,state:"open",delivery:"retired",payload:void 0}),this.store.changed())}cancel(ticketId){let record10=this.ticketRecord(ticketId);custodyIsOpen(record10)&&record10.state!=="consumed"&&this.close(record10.id,"cancelled")}settleRun(runId){for(let record10 of this.active)record10.state==="consumed"&&record10.runId===runId&&this.install({...record10,state:"settled"});this.store.changed()}install(record10){try{this.store.append(record10),this.unpersisted.delete(record10.id)}catch(error2){if(!(error2 instanceof Error))throw error2;this.unpersisted.set(record10.id,record10)}this.records.set(record10.id,record10)}flush(){for(let[id,record10]of this.unpersisted)this.store.append(record10),this.unpersisted.delete(id)}owned(id){let record10=this.records.get(id);if(!record10||!custodyIsOpen(record10))throw new CustodyViolation(record10?.key??id);return record10}ticketRecord(ticketId){let record10=[...this.records.values()].find(value=>value.ticketId===ticketId);if(!record10)throw new CustodyViolation(ticketId);return record10}close(id,state3,noticeId){let record10=this.owned(id);this.install({...record10,state:state3,...noticeId===void 0?{}:{noticeId}}),this.store.changed()}token(id){return{transfer:(nextKey,kind)=>{let current=this.owned(id);if(nextKey===current.key)throw new CustodyViolation(nextKey);let next=this.active.find(record10=>record10.key===nextKey)??{id:crypto.randomUUID(),key:nextKey,kind:kind??current.kind,state:"open"};try{this.install(next),this.install({...current,state:"cancelled"})}finally{this.store.changed()}return this.token(next.id)},ticket:()=>{let record10=this.owned(id);if(record10.ticketId)return record10.ticketId;let ticketId=crypto.randomUUID();return this.install({...record10,state:"queued",ticketId}),this.store.changed(),ticketId},heldAsNotice:noticeId=>this.close(id,"held",noticeId),close:reason=>this.close(id,reason==="consumed"?"settled":reason)}}};var SessionLifecycleController=class{constructor(options){this.idleBoundaryPassed=!1,this.pendingHuman=!1,this.admittingHuman=!1,this.runAdmitted=!1,this.goal=null,this.evaluating=!1,this.deferred=!1,this.options=options,this.ledger=new LifecycleLedger({...options,append:record10=>{this.obligations.flush(),options.append(record10)}}),this.ledger.lastTurnEnd&&(this.liveness={...this.ledger.lastTurnEnd,isChildSession:this.ledger.snapshot.role==="child",mode:"rpc",ledgerHold:void 0,willRetry:!1,continuationQueued:void 0,goalStopped:!1,openWork:{kind:"none"},expectations:[]}),this.obligations=new SessionWorkObligations({entries:options.entries,append:record10=>options.appendCustody(record10),changed:()=>this.recompute()}),this.children=new LifecycleChildren({entries:options.entries,append:report=>options.appendChild(report),changed:()=>{this.ownTask=this.children.reports.find(report=>report.childSessionId===options.sessionId&&report.taskId===options.spawnedBy?.taskId),this.recompute()}});for(let report of this.children.reports)report.childSessionId===options.sessionId&&report.taskId===options.spawnedBy?.taskId&&(this.ownTask=report)}get snapshot(){return this.recompute(),this.ledger.snapshot}get lastTurnInput(){return this.liveness}get requiresHumanContinuation(){return this.ledger.interrupted&&!this.pendingHuman}get nextRunOrigin(){return this.pendingHuman?"human":"automatic"}restoreComplete(){this.ledger.releaseRestoreBarrier(),this.idleBoundaryPassed=!0,this.recompute(),this.ledger.snapshot.seq>0&&this.ledger.checkpoint()}humanInput(at){this.admittingHuman=!0,this.pendingHuman||=!this.ledger.runActive,this.ledger.humanInput(at)}noteRunAdmitted(){this.runAdmitted=!0}admissionSettled(){this.admittingHuman=!1,!this.ledger.runActive&&!this.ledger.interrupted&&this.options.readRuntime().pendingMessages===0&&(this.pendingHuman=!1),!this.runAdmitted&&this.recompute()}startRun(origin){this.admittingHuman=!1,this.runAdmitted=!1,this.idleBoundaryPassed=!1,this.liveness=void 0;let interruptedRun=this.ledger.interrupted?this.ledger.runId:void 0;this.ledger.interrupted=!1,this.ledger.startRun(origin??(this.pendingHuman?"human":"automatic")),this.pendingHuman=!1,interruptedRun&&this.obligations.settleRun(interruptedRun),this.recompute(),this.ledger.publishUnwritten()}idle(){this.runAdmitted=!1;let seq=this.ledger.snapshot.seq;this.ledger.runActive=!1,this.idleBoundaryPassed=!0;let runId=this.ledger.runId;runId&&this.obligations.settleRun(runId),this.recompute(),seq>0&&this.ledger.snapshot.seq===seq&&this.ledger.checkpoint()}goalFacts(goal,input){this.liveness=input,input&&(this.ledger.lastTurnEnd={endedBy:input.endedBy,budgetSpent:input.budgetSpent,deadlineStop:input.deadlineStop,providerRetryAtMs:input.providerRetryAtMs}),this.goalChanged(goal)}goalChanged(goal){goal?.status==="complete"&&this.goal?.status!=="complete"&&this.ledger.markGoalCompleted(goal.id),this.goal=goal,this.recompute()}reportChild(report){this.children.report(report)}requestSelfSettle(){return this.admittingHuman||this.options.readRuntime().inputAdmissionPending?{recorded:!1,reason:"not_eligible",epoch:this.ledger.snapshot.epoch,humanInputRevision:this.ledger.snapshot.humanInputRevision}:(this.recompute(),this.ledger.requestSelfSettle())}markRunCompleted(runId){this.ledger.markRunCompleted(runId),this.recompute()}recompute(){if(this.obligations.persisted||this.ledger.custodyWriteFailed(),!(this.ledger.snapshot.restoring||this.admittingHuman)){if(this.evaluating){this.deferred=!0;return}this.evaluating=!0;try{do this.deferred=!1,this.evaluate();while(this.deferred)}finally{this.evaluating=!1}}}evaluate(){let runtime=this.options.readRuntime(),active=this.obligations.active,childRecords=this.children.reports.filter(report=>report.childSessionId!==this.options.sessionId&&report.terminal===void 0).length,background=active.filter(record10=>record10.kind==="background").map(record10=>({source:record10.source??record10.key,activeCount:record10.activeCount??1})),children=Math.max(childRecords,active.filter(record10=>record10.kind==="children").reduce((sum,record10)=>sum+(record10.activeCount??1),0)),input=this.liveness,continuationQueued=input?.willRetry===!0||input?.continuationQueued!==void 0,questionToUser=!1;for(let expectation of input?effectiveWakes(input):[])switch(expectation.kind){case"pending-messages":continuationQueued||=runtime.pendingMessages>0;break;case"user-input-queued":continuationQueued=!0;break;case"armed-timer":expectation.timer==="userGrace"?continuationQueued=!0:background.push({source:expectation.timer==="providerRetry"?"provider-retry":"goal-monitor",activeCount:1,...expectation.timer==="providerRetry"&&input?.providerRetryAtMs!==void 0?{retryAtMs:input.providerRetryAtMs}:{}});break;case"recovery-staged":background.push({source:"staged-recovery",activeCount:1});break;case"wake-source":if(active.some(record10=>record10.source===expectation.source))break;background.push({source:expectation.source,activeCount:1});break;case"question-to-user":questionToUser=!0;break;default:}let synthetic=[],root=this.ledger.snapshot.role==="root";if(root){questionToUser&&runtime.human.length===0&&synthetic.push({key:`question:${this.ledger.runId??this.ledger.snapshot.epoch}`,kind:"question"}),this.goal?.status==="blocked"?synthetic.push({key:`goal:${this.goal.id}`,kind:"goal_blocked"}):this.goal&&(this.goal.status==="paused"||this.goal.continuationStoppedAt!==void 0)&&synthetic.push({key:`goal:${this.goal.id}`,kind:"goal_paused"}),this.ledger.interrupted&&synthetic.push({key:`interrupted:${this.ledger.snapshot.epoch}`,kind:"interrupted_run"});let noWake=children===0&&background.length===0&&!continuationQueued&&runtime.pendingMessages===0;input&&noWake&&input.endedBy!=="provider-error"&&input.endedBy!=="policy-rejection"&&(input.deadlineStop||input.budgetSpent||input.endedBy==="unknown-abort"||input.endedBy==="system-abort"||input.endedBy==="provider-abort"||(input.openWork.kind==="active-goal"?this.goal?.status==="active":input.openWork.kind!=="none")&&!input.goalStopped)?synthetic.push({key:`stall:${this.ledger.snapshot.epoch}`,kind:"stalled"}):noWake&&this.goal?.status==="active"&&!this.ledger.runActive&&!runtime.activity.isStreaming&&!runtime.activity.hasSessionWork&&!runtime.activity.isCompacting&&!runtime.activity.isBashRunning&&this.goal.continuationStoppedAt===void 0&&synthetic.push({key:`stall:${this.ledger.snapshot.epoch}`,kind:"stalled"})}let human=root?[...runtime.human,...this.ledger.attention.reconcile(synthetic)]:[],running2=this.ledger.runActive||runtime.activity.isStreaming||runtime.activity.isCompacting||runtime.activity.isBashRunning||runtime.activity.hasSessionWork||runtime.pendingMessages>0||continuationQueued,failure2=input&&(input.endedBy==="provider-error"||input.endedBy==="policy-rejection")&&!continuationQueued&&background.length===0?{reason:"provider_error",...input.providerRetryAtMs===void 0?{}:{retryAtMs:input.providerRetryAtMs}}:this.ownTask?.terminal==="error"||this.ownTask?.terminal==="lost"||this.ownTask?.terminal==="interrupted"?{reason:this.ownTask.terminal==="error"?"task_error":this.ownTask.terminal,taskId:this.ownTask.taskId,runEpoch:this.ownTask.runEpoch}:void 0,waits={children,background,human},state3=lifecycleState({role:this.ledger.snapshot.role,terminal:this.ownTask?.terminal,holds:runtime.holds,waits,running:running2,failure:failure2});lifecycleTerminal(state3)&&this.ownTask?.terminal===void 0&&(!this.idleBoundaryPassed||active.length>0)||this.ledger.update({state:state3,waits,holds:runtime.holds,failure:failure2})}};var LifecycleSessionBinding=class{constructor(session,host){this.refreshGeneration=0,this.restored=!1,this.disposed=!1,this.session=session,this.host=host,this.sessionId=session.sessionId,this.controller=new SessionLifecycleController({sessionId:session.sessionId,spawnedBy:session.sessionManager.getHeader()?.spawnedBy,entries:session.sessionManager.reduceHistory(lifecycleHistory).filter(entry2=>entry2.type!=="custom"||entry2.customType!=="work-custody"&&entry2.customType!=="child-lifecycle"||isRecord5(entry2.data)&&entry2.data.sessionId===session.sessionId),append:record10=>{this.write(()=>host.append("session-lifecycle",record10))},appendChild:report=>{this.write(()=>host.append("child-lifecycle",{...report,sessionId:session.sessionId}))},appendCustody:record10=>{this.write(()=>host.append("work-custody",{...record10,sessionId:session.sessionId}))},emit:event=>{this.write(()=>host.emit(event))},readRuntime:()=>readLifecycleRuntimeFacts(session)});let deliveryEntries=session.sessionManager.reduceHistory(lifecycleDeliveryEntries);for(let record10 of this.controller.obligations.active){if(record10.state!=="queued"||!record10.payload||!record10.ticketId)continue;let ticketId=record10.ticketId,message={role:"custom",...record10.payload.message,timestamp:0},deliveryId=deliveryIdOf(message);deliveryId!==void 0&&(deliveryEntries.has(ticketId)?session.externalAdmission.observePersisted(message):session.externalAdmission.restoreQueued(deliveryId,()=>session.sessionManager.reduceHistory(lifecycleDeliveryEntries).has(ticketId)||this.controller.obligations.active.some(current=>current.ticketId===ticketId&¤t.state==="queued")))}this.unsubscribeHuman=bindLifecycleHumanInput(session,event=>this.controller.humanInput(event.at)),this.unsubscribeAdmission=session.externalAdmission.onInputsSettled(()=>this.controller.admissionSettled()),this.unsubscribeGoal=onGoalLifecycleChange(session.sessionManager,goal=>{this.refreshFacts(goal).catch(error2=>host.factsFailed(error2)),this.controller.goalChanged(goal)})}bindFactEvents(runner){this.retireFactEvents?.();let refresh=()=>{this.refreshFacts().catch(error2=>this.host.factsFailed(error2))},retire=[runner.onBusEvent("wake_source_state",data=>{this.observeWakeSource(data),refresh()}),runner.onBusEvent("goal_continuation_timer_state",refresh),runner.onBusEvent("goal_store_changed",data=>{isRecord5(data)&&data.threadId===this.sessionId&&refresh()})];this.retireFactEvents=()=>{for(let unsubscribe of retire)unsubscribe()}}prepareRun(){this.nextRunOrigin=this.controller.nextRunOrigin,this.controller.noteRunAdmitted()}get isRestored(){return this.restored}startRun(){this.lastEnd=void 0;let origin=this.nextRunOrigin;this.nextRunOrigin=void 0,this.controller.startRun(origin)}consume(message){return this.write(()=>consumeLifecycleDelivery(this.session,this.controller,message))}consumedEntry(message){if(message.role!=="custom")return;let ticketId=messageTicket(message);return ticketId?this.session.sessionManager.reduceHistory(lifecycleDeliveryEntries).get(ticketId):void 0}async turnEnded(event){this.lastEnd=event,await this.refreshFacts()}async refreshFacts(changedGoal){let generation2=++this.refreshGeneration,saved=this.lastEnd?void 0:this.controller.lastTurnInput,end=this.lastEnd??(saved?{type:"agent_end",messages:[]}:void 0),collected;try{collected=await collectGoalLifecycleFacts(this.session.sessionManager,end,changedGoal)}catch(error2){if(error2 instanceof StaleExtensionContextError)return;throw error2}let goal=collected?collected.goal:changedGoal===void 0?await readLifecycleGoal(goalStoreRef(this.session.sessionManager,this.session.cwd)):changedGoal;if(generation2!==this.refreshGeneration)return;let input=collected?.input;if(!input&&end&&this.session.extensionRunner.isActive){let ctx=this.session.extensionRunner.createContext();input=collectTurnEndLivenessInput(ctx,end,{goal,todoOutcome:void 0,deadlineStop:!1,continuationPending:!1,monitor:{liveWakeSources:()=>[...this.session.activeWakeSources],scheduledContinuation:()=>{},hasStagedRecovery:()=>!1}})}input&&saved&&(input={...input,endedBy:saved.endedBy,budgetSpent:input.budgetSpent||saved.budgetSpent,deadlineStop:input.deadlineStop||saved.deadlineStop,providerRetryAtMs:input.providerRetryAtMs??saved.providerRetryAtMs}),this.controller.goalFacts(goal,input)}async idle(){await this.refreshFacts(),this.controller.idle()}restore(){return this.restored?Promise.resolve():(this.restoring??=this.recover(),this.restoring)}async recover(){if(await this.refreshFacts(),this.disposed)return;let entries=this.session.sessionManager.reduceHistory(lifecycleHistory),active=this.controller.obligations.active;for(let record10 of active){if(!record10.ticketId)continue;let ticketId=record10.ticketId,entryId=this.session.sessionManager.reduceHistory(lifecycleDeliveryEntries).get(ticketId),transcript=entryId?this.session.sessionManager.getEntry(entryId):void 0;record10.state!=="consumed"&&!transcript||(transcript&&record10.state!=="consumed"&&this.controller.obligations.consumed(ticketId,{runId:record10.runId??this.controller.ledger.runId??crypto.randomUUID(),transcriptEntryId:transcript.id}),this.controller.ledger.interrupted=!0,entries.some(entry2=>entry2.type==="custom"&&entry2.customType==="interrupted-run"&&isRecord5(entry2.data)&&entry2.data.ticketId===ticketId)||this.hostAppendInterruption(ticketId,record10.runId),this.recordInterruptedTools(transcript?.id??record10.transcriptEntryId))}this.restored=!0,this.controller.obligations.retireRestoredSources(),this.controller.restoreComplete();for(let record10 of this.controller.obligations.active)if(!(record10.state!=="queued"||!record10.payload||!record10.ticketId)){if(this.disposed)return;await this.session.sendCustomMessage(record10.payload.message,{triggerTurn:!0,deliverAs:record10.payload.deliverAs,ticket:record10.ticketId})}}recordInterruptedTools(transcriptEntryId){if(!transcriptEntryId)return;let entries=this.session.sessionManager.getEntries(),start=entries.findIndex(entry2=>entry2.id===transcriptEntryId);if(start<0)return;let pending=new Map;for(let entry2 of entries.slice(start))if(entry2.type==="message")if(entry2.message.role==="assistant")for(let part of entry2.message.content)part.type==="toolCall"&&pending.set(part.id,part);else entry2.message.role==="toolResult"&&pending.delete(entry2.message.toolCallId);for(let call of pending.values())this.write(()=>this.session.sessionManager.appendMessage({role:"toolResult",toolCallId:call.id,toolName:call.name,content:[{type:"text",text:"INTERRUPTED: the consuming run ended before this tool result was recorded. Side effects may be partial. The tool was not re-run."}],details:{interrupted:{reason:"host_restart"}},isError:!0,timestamp:Date.now()}));pending.size>0&&(this.session.agent.state.messages=this.session.sessionManager.buildSessionContext().messages)}hostAppendInterruption(ticketId,runId){this.write(()=>this.session.sessionManager.appendCustomEntry("interrupted-run",{ticketId,runId,status:"INTERRUPTED",reason:"host_restart",at:new Date().toISOString()}))}write(record10){if(!this.disposed)return record10()}observeWakeSource(data){!isRecord5(data)||typeof data.source!="string"||typeof data.activeCount!="number"||Number.isFinite(data.activeCount)&&this.controller.obligations.syncSource(data.source,data.kind==="children"?"children":"background",data.activeCount)}dispose(){this.disposed=!0,this.refreshGeneration++,this.retireFactEvents?.(),this.unsubscribeHuman(),this.unsubscribeAdmission(),this.unsubscribeGoal()}};function memoryReportEnabled(env=process.env){return envValue("MEMORY_REPORT",env)==="1"}function memoryReportSnapshotEnabled(env=process.env){return envValue("MEMORY_REPORT_SNAPSHOT",env)==="1"}var RESERVED_MEMORY_REPORT_KEYS=new Set(["sessionId","takenAt","pid","main","kernels","residentStore","tuiRenderCache","heapSnapshot","reporterErrors"]),STATE_KEY=Symbol.for("senpi.memory-report.state");function state(){let existing2=Reflect.get(globalThis,STATE_KEY);if(isState(existing2))return existing2;let created={sessions:new Map,tuiRenderCache:void 0};return Reflect.set(globalThis,STATE_KEY,created),created}function isState(value){return typeof value=="object"&&value!==null&&Reflect.get(value,"sessions")instanceof Map}function registerMemoryReportSession(owner,source2){if(!memoryReportEnabled())return()=>{};let{sessions:sessions2}=state();return sessions2.set(owner,source2),()=>{sessions2.get(owner)===source2&&sessions2.delete(owner)}}function memoryReportSessionFor(owner){return state().sessions.get(owner)}function memoryReportSessions(){return[...state().sessions.values()]}function registerTuiRenderCacheSource(read2){state().tuiRenderCache=read2}function tuiRenderCacheTotals(){return state().tuiRenderCache?.()}var SDK_MODEL_CHANGE={source:"sdk"};function heldSwitchOrigin(first){return{source:"held-switch",actor:first.actor===void 0?first.source:`${first.source}:${first.actor}`,...first.effectId===void 0?{}:{effectId:first.effectId}}}function modelChangeLogFields(input){return{source:input.origin.source,...input.origin.actor===void 0?{}:{actor:input.origin.actor},...input.from===void 0?{}:{from:`${input.from.provider}/${input.from.id}`},to:`${input.to.provider}/${input.to.id}`,duringTurn:input.duringTurn,persistDefault:input.persistDefault}}import{join as join21}from"node:path";var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync5,mkdirSync as mkdirSync3,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync5,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname15,join as join18}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve55,reject)=>{let settled2=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled2||(settled2=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled2||(settled2=!0,cleanup(),resolve55(value))},error2=>{settled2||(settled2=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isOAuthGrant(value){return typeof value.access=="string"&&typeof value.refresh=="string"&&typeof value.expires=="number"}function isKeySlot(value){return typeof value.key=="string"&&value.access===void 0&&value.refresh===void 0}function isSlotList(value){return Array.isArray(value)&&value.every(isPlainObject)}function readSource(entry2){if(entry2.accounts===void 0)return isOAuthGrant(entry2)?{grants:[entry2],keySlots:[],pooled:!1,pinned:void 0}:"it holds no complete OAuth grant";if(!isSlotList(entry2.accounts))return"its accounts list is not a list of account objects";let slotGrants=entry2.accounts.filter(isOAuthGrant),keySlots=entry2.accounts.filter(isKeySlot);if(slotGrants.length+keySlots.length!==entry2.accounts.length)return"an account in it is neither a complete OAuth grant nor an API key";let grants=isOAuthGrant(entry2)&&!slotGrants.some(slot2=>slot2.refresh===entry2.refresh)?[...slotGrants,{...entry2,name:void 0}]:slotGrants;return grants.length===0?"it holds no complete OAuth grant":{grants,keySlots,pooled:!0,pinned:entry2.pinned}}function readSubscription(stored){return stored===void 0?emptyCredential():isPlainObject(stored)?stored.accounts===void 0?stored:!isSlotList(stored.accounts)||!stored.accounts.every(slot2=>typeof slot2.name=="string")?"the existing anthropic-subscription accounts are not account objects":stored:"the existing anthropic-subscription entry is not an object"}function importedSlotName(slot2,pooled,taken){let base=pooled&&typeof slot2.name=="string"&&slot2.name?`imported-anthropic-${slot2.name}`:"imported-anthropic",name=base.slice(0,64);for(let suffix=2;taken.has(name);suffix++)name=`${base.slice(0,58)}-${suffix}`;return name}function remainingApiKeyEntry(keySlots,pinned){let accounts=keySlots,pinnedSlot=typeof pinned=="string"?accounts.find(slot2=>slot2.name===pinned):void 0,key=(pinnedSlot??accounts[0])?.key;if(key!==void 0)return{type:"api_key",key,accounts,...pinnedSlot?{pinned:pinnedSlot.name}:{}}}var IMPORTED_GRANTS_FIELD="importedToSubscription";function importedDigests(entry2){let recorded=entry2[IMPORTED_GRANTS_FIELD];return new Set(Array.isArray(recorded)?recorded.filter(digest3=>typeof digest3=="string"):[])}function copyGrants(data,entry2,source2,subscription,unrecorded){let accounts=[...subscription.accounts??[]],taken=new Set(accounts.map(slot2=>slot2.name)),pinned=subscription.pinned;for(let grant of unrecorded){let digest3=authGrantDigest(grant.refresh),account=accounts.find(slot2=>slot2.refresh===grant.refresh||slot2.importedFrom===digest3);if(!account){let name=importedSlotName(grant,source2.pooled,taken);taken.add(name);let displayName=typeof grant.displayName=="string"?{displayName:grant.displayName}:{};account={name,...displayName,access:grant.access,refresh:grant.refresh,expires:grant.expires,source:"import",importedFrom:digest3},accounts.push(account)}pinned===void 0&&typeof grant.name=="string"&&grant.name===source2.pinned&&(pinned=account.name)}let recorded=[...new Set([...importedDigests(entry2),...source2.grants.map(grant=>authGrantDigest(grant.refresh))])];return{...data,anthropic:Object.assign({},data.anthropic,{[IMPORTED_GRANTS_FIELD]:recorded}),[ANTHROPIC_SUBSCRIPTION_PROVIDER_ID]:{...subscription,accounts,...pinned===void 0?{}:{pinned}}}}function migrate(data){let entry2=data.anthropic;if(!isPlainObject(entry2)||entry2.type!=="oauth")return{data,migrated:!1};let source2=readSource(entry2);if(typeof source2=="string")return{data,migrated:!1,skipped:source2};let subscription=readSubscription(data[ANTHROPIC_SUBSCRIPTION_PROVIDER_ID]);if(typeof subscription=="string")return{data,migrated:!1,skipped:subscription};let recorded=importedDigests(entry2),unrecorded=source2.grants.filter(grant=>!recorded.has(authGrantDigest(grant.refresh)));if(unrecorded.length>0)return{data:copyGrants(data,entry2,source2,subscription,unrecorded),migrated:!0};let next={...data},remaining=remainingApiKeyEntry(source2.keySlots,source2.pinned);return remaining?next.anthropic=remaining:delete next.anthropic,{data:next,migrated:!0}}function migrateAnthropicOAuthToSubscription(data){try{return migrate(data)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return{data,migrated:!1,skipped:`it could not be read (${reason})`}}}import{dirname as dirname14}from"node:path";function assertKeyShape(value,field3){if(typeof value=="object"&&value!==null&&!isConfigReference(value))throw new ConfigReferenceError(field3,value,"malformed")}function assertCredentialReferences(providerId,credential){if("type"in credential&&credential.type==="api_key"&&"key"in credential&&assertKeyShape(credential.key,`${providerId}.key`),!(!("accounts"in credential)||!Array.isArray(credential.accounts)))for(let[index,account]of credential.accounts.entries())typeof account=="object"&&account!==null&&"key"in account&&assertKeyShape(account.key,`${providerId}.accounts.${index}.key`)}function resolveStoredReference(reference3,source2){let context=source2.authPath===void 0?void 0:{origin:source2.authPath,baseDir:dirname14(source2.authPath),authority:"trusted",field:source2.field};return resolveConfigReference(reference3,context,source2.env&&{...process.env,...source2.env})}function validateReadOnlyAuthData(parsed){if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);assertCredentialReferences(providerId,credential);let value=credential;if(value.type==="api_key"){let validKey=value.key===void 0||typeof value.key=="string"||isConfigReference(value.key),validEnv=value.env===void 0||typeof value.env=="object"&&value.env!==null&&!Array.isArray(value.env)&&Object.values(value.env).every(entry2=>typeof entry2=="string");if(validKey&&validEnv)continue}else if(value.type==="oauth"&&typeof value.access=="string"&&typeof value.refresh=="string"&&typeof value.expires=="number"&&Number.isFinite(value.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}}async function resolveReadOnlyCredential(credential,providerId,authPath){if(!credential)return;let key=credential.type==="api_key"?credential.key:void 0;if(credential.type==="api_key"&&isConfigReference(key)){let field3=`${providerId}.key`;return{...credential,key:await resolveStoredReference(key,{field:field3,authPath,env:credential.env})}}return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async function resolveStoredCredential(credential,providerId,authPath){if(credential?.type!=="api_key"||(assertCredentialReferences(providerId,credential),credential.key===void 0))return credential;let key=credential.key;if(isConfigReference(key)){let field3=`${providerId}.key`;return{...credential,key:await resolveStoredReference(key,{field:field3,authPath,env:credential.env})}}return{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async function resolveStoredSlot(credential,slot2,readFlat){if(credential===void 0)return;assertCredentialReferences(slot2.providerId,credential);let accounts="accounts"in credential&&Array.isArray(credential.accounts)?credential.accounts:[];if(accounts.length===0)return projectSlot(await readFlat(credential),slot2.slotName);let projected=projectSlot(credential,slot2.slotName),key=projected?.type==="api_key"?projected.key:void 0;if(projected?.type!=="api_key"||!isConfigReference(key))return projected;let index=accounts.findIndex(account=>typeof account=="object"&&account!==null&&"name"in account&&account.name===slot2.slotName),field3=`${slot2.providerId}.accounts.${index}.key`;return{...projected,key:await resolveStoredReference(key,{field:field3,authPath:slot2.authPath,env:projected.env})}}function isPlainObject2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject2(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var KIND_LABEL={oauth:"OAuth login",api_key:"API key"};function unusedLoginNotices(data){let notices=[];for(let[provider,credential]of Object.entries(data))if(!(typeof credential!="object"||credential===null))for(let kind of unusedSlotKinds(credential)){let slots=listSlots(credential).filter(slot2=>slotKind(slot2)===kind),inUse=KIND_LABEL[credential.type],names=slots.map(slot2=>slot2.name);notices.push({id:`${provider}:${kind}:${names.join(",")}`,provider,message:`${provider}: an ${KIND_LABEL[kind]} saved earlier is stored next to your ${inUse} but is never used; the ${inUse} stays in use. It is still in auth.json (${slots.map(slot2=>slot2.name).join(", ")}); to switch to it, save it again with /login (the ${inUse} is backed up first).`})}return notices}function describeCredentialReplacement(provider,replacement){let where=replacement.backupPath?` It is saved in ${replacement.backupPath}`:" It was not backed up";return`Your ${KIND_LABEL[replacement.replaced]} for ${provider} was replaced by this login.${where}; to switch back, log in with it again.`}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join18(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname15(this.authPath);existsSync5(dir)||mkdirSync3(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync5(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync5(this.authPath)&&chmodSync(temporary,statSync5(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path14){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path14,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path14,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release4;try{release4=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync5(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release4&&release4()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let{release:release4}=await lockWithLossHandling(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onLost:onCompromised});return signal?.aborted&&(await release4(),signal.throwIfAborted()),release4}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve55=>setTimeout(resolve55,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release4,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release4=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync5(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release4)try{await release4()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join18(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}return validateReadOnlyAuthData(parsed),this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);return options?.signal?.throwIfAborted(),resolveReadOnlyCredential(credential,providerId,this.authPath)}async readSlot(providerId,slotName,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);return options?.signal?.throwIfAborted(),resolveStoredSlot(credential,{providerId,slotName,authPath:this.authPath},flat=>resolveReadOnlyCredential(flat,providerId,this.authPath))}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.reportedMigrationSkips=new Set,this.notices=[],this.seenInMemory=new Set,this.takenNotices=new Set,this.replacements=new Map,this.busyReads=0,this.dataLoaded=!1,this.dataFromBusyRead=!1,this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath&&this.readState.loaded){this.data=this.readState.data,this.dataLoaded=!0;let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join18(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data),moved=migrateAnthropicOAuthToSubscription(migrated.data);return moved.skipped&&!this.reportedMigrationSkips.has(moved.skipped)&&(this.reportedMigrationSkips.add(moved.skipped),this.recordError(new Error(`The Anthropic Claude subscription login in auth.json was not moved to Anthropic Subscription because ${moved.skipped}. It was left unchanged; sign in again with /login and choose "Anthropic Subscription (Claude Pro/Max)".`))),this.notices=unusedLoginNotices(moved.data),{data:moved.data,repaired:repaired.repaired,migrated:migrated.migrated||moved.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync5(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;return writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS),backupPath}updateReadState(data,revision){this.data=data,this.dataLoaded=!0,this.dataFromBusyRead=!1,this.readState.data=data,this.readState.loaded=!0,this.readState.revision=revision}reload(){let data={},revision;try{return this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision),"loaded"}catch(error2){return this.recordError(error2 instanceof Error?error2:new Error(String(error2))),error2 instanceof CredentialStoreBusyError?(this.dataLoaded||(this.busyReads++,this.dataFromBusyRead=!0),"busy"):"failed"}}isCredentialStoreBusy(){return this.dataFromBusyRead}getBusyReadCount(){return this.busyReads}noteBusyFallback(error2){error2 instanceof CredentialStoreBusyError&&!this.readState.loaded&&this.busyReads++}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){return this.storage.withLock(content=>{let currentData=this.parseStorageData(content),replacement=this.noteReplacement(provider,currentData[provider],credential,content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:replacement,next:JSON.stringify(nextData,null,2)}})}takeReplacement(provider){let replacement=this.replacements.get(provider);return this.replacements.delete(provider),replacement}pendingNotices(){let seen=this.seenNoticeIds();return this.notices.filter(notice2=>!seen.has(notice2.id))}takePendingNotices(options){let taken=this.pendingNotices().filter(notice2=>!this.takenNotices.has(notice2.id));for(let notice2 of taken)this.takenNotices.add(notice2.id);return options.persistSeen&&this.markNoticesSeen(taken.map(notice2=>notice2.id)),taken}markNoticesSeen(ids){if(ids.length===0)return;let path14=this.seenNoticesPath();if(!path14){for(let id of ids)this.seenInMemory.add(id);return}let current=new Set(this.notices.map(notice2=>notice2.id)),seen=[...new Set([...this.seenNoticeIds(),...ids])].filter(id=>current.has(id));try{writeFileSync3(path14,JSON.stringify(seen,null,2),AUTH_FILE_WRITE_OPTIONS)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);this.recordError(new Error(`Could not record which credential notices were shown (${path14}): ${reason}. They may be shown again on the next start; check that the file is writable.`))}}seenNoticesPath(){return this.authPath?join18(dirname15(this.authPath),"auth-notices-seen.json"):void 0}seenNoticeIds(){let path14=this.seenNoticesPath();if(!path14)return new Set(this.seenInMemory);try{let parsed=JSON.parse(readFileSync5(path14,"utf-8"));return new Set(Array.isArray(parsed)?parsed.filter(id=>typeof id=="string"):[])}catch{return new Set}}noteReplacement(provider,previous,next,content){if(previous===void 0||previous.type===next.type)return;let backupPath=this.backupAuthFile(content),replacement=backupPath?{replaced:previous.type,backupPath}:{replaced:previous.type};return this.replacements.set(provider,replacement),replacement}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot2){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot2),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.noteBusyFallback(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch(error2){return options?.signal?.throwIfAborted(),this.noteBusyFallback(error2),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),resolveStoredCredential(credential,provider,this.authPath)}async readSlot(provider,slotName,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return projectSlot({type:"api_key",key:runtimeKey},slotName);let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),resolveStoredSlot(credential,{providerId:provider,slotName,authPath:this.authPath},flat=>resolveStoredCredential(flat,provider,this.authPath))}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};this.noteReplacement(provider,currentData[provider],next,content);let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value=>{if(value===void 0)throw new Error("Login cancelled");return value});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join18(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{dirname as dirname17,join as join20}from"node:path";import{mkdirSync as mkdirSync4,readFileSync as readFileSync6,renameSync as renameSync3,writeFileSync as writeFileSync4}from"node:fs";import{dirname as dirname16}from"node:path";var CACHE_FILE="claude-code-version.json";function resolveClaudeCodeVersionCachePath(env=process.env){return`${(env.SENPI_CODING_AGENT_DIR??env.CODING_AGENT_DIR??`${(env.HOME??".").replace(/\/$/,"")}/.senpi/agent`).replace(/\/$/,"")}/${CACHE_FILE}`}function isCachedVersion(value){return typeof value=="object"&&value!==null&&typeof value.version=="string"&&typeof value.checkedAt=="number"}function createClaudeCodeVersionFileStore(path14){let savingEnabled=!0;return{load:()=>{let parsed;try{parsed=JSON.parse(readFileSync6(path14,"utf8"))}catch{return}return isCachedVersion(parsed)?parsed:void 0},save:record10=>{if(savingEnabled)try{mkdirSync4(dirname16(path14),{recursive:!0});let temporaryPath=`${path14}.${process.pid}.tmp`;writeFileSync4(temporaryPath,`${JSON.stringify(record10)}
|
|
152
|
+
`):"";return SDK_OAUTH_EXHAUSTION_MARKERS.every(marker=>text3.includes(marker))}var CODEX_POLICY_ERROR_PATTERN=/^(?:Codex error: )?This request was blocked by our safety systems\.(?: Reason: .+)?$/i,CODEX_RESPONSES_API2="openai-codex-responses";function isCodexPolicyRejection(message){return message.api!==CODEX_RESPONSES_API2||message.stopReason!=="error"?!1:CODEX_POLICY_ERROR_PATTERN.test(message.errorMessage??"")}function didTerminalPolicyRejectionEndTurn(event){if(event.willRetry!==!1)return!1;let message=lastAssistantMessage(event.messages);return message===void 0?!1:isClassifierRefusal(message)||isCodexPolicyRejection(message)}var LEADING_AUTH_STATUS_PATTERN=/^(401|403)\b/;function authStatusOf(message){let diagnostic2=message.providerDiagnostic;if(diagnostic2!==void 0)return diagnostic2.httpStatus===401||diagnostic2.httpStatus===403?diagnostic2.httpStatus:diagnostic2.category==="auth"?401:void 0;let status=LEADING_AUTH_STATUS_PATTERN.exec(message.errorMessage??"")?.[1];return status==="401"?401:status==="403"?403:void 0}function terminalProviderAuthFailure(event){if(event.abortSource==="system"||event.willRetry!==!1)return;let message=lastAssistantMessage(event.messages);if(message?.stopReason!=="error")return;let httpStatus=authStatusOf(message);if(httpStatus!==void 0)return{httpStatus,provider:message.provider,model:message.model}}function didTerminalProviderErrorEndTurn(event){if(event.abortSource==="system"||event.willRetry!==!1)return!1;let message=lastAssistantMessage(event.messages);return isSdkOauthAccountExhaustion(message)?!0:message?.stopReason==="error"||message?.stopReason==="aborted"&&event.abortSource!=="user"}var TURN_END_LIVENESS_EVENT="turn_end_liveness",TURN_END_LIVENESS_ENTRY_TYPE="turn-end-liveness",NON_INTERACTIVE_MODES2=new Set(["print","json"]);function classifyTurnEnd(event){return event.aborted===!0&&event.abortSource==="user"?"user-abort":event.aborted===!0&&event.abortSource==="system"?"system-abort":event.abortSource==="provider"?"provider-abort":event.aborted===!0?"unknown-abort":didTerminalPolicyRejectionEndTurn(event)?"policy-rejection":didTerminalProviderErrorEndTurn(event)?"provider-error":didAgentEndCleanly(event.messages)?"clean":"unknown-abort"}function isGoalOwnedWake(expectation){return expectation.kind==="armed-timer"||expectation.kind==="recovery-staged"}function effectiveWakes(input){return input.expectations.filter(expectation=>!(expectation.kind==="question-to-user"&&input.endedBy!=="clean")&&!(input.deadlineStop&&isGoalOwnedWake(expectation)))}function hasQueuedUserInput(input){return input.expectations.some(expectation=>expectation.kind==="user-input-queued")}function heldReason(input){if(input.deadlineStop)return"deadline-stop";if(input.endedBy==="user-abort")return"user-abort";if(input.ledgerHold!==void 0)return input.ledgerHold;if(input.isChildSession)return"child-session";if(input.goalStopped)return"goal-stopped"}function abortSourceOf(endedBy){return endedBy==="system-abort"?"system":endedBy==="provider-abort"?"provider":void 0}var TURN_END_RULES=[{id:"retry",when:i=>i.willRetry,verdict:()=>({kind:"continuing",via:"retry"})},{id:"ledger-hold",when:i=>i.ledgerHold!==void 0&&!hasQueuedUserInput(i),verdict:i=>({kind:"held",reason:i.ledgerHold??"unattended"})},{id:"continuation-queued",when:i=>i.continuationQueued!==void 0,verdict:i=>({kind:"continuing",via:i.continuationQueued??"goal"})},{id:"non-interactive",when:i=>NON_INTERACTIVE_MODES2.has(i.mode),verdict:()=>({kind:"held",reason:"non-interactive"})},{id:"wake",when:i=>effectiveWakes(i).length>0,verdict:i=>{let held=heldReason(i);return{kind:"waiting",on:effectiveWakes(i),...held!==void 0?{heldBy:held}:{}}}},{id:"held",when:i=>heldReason(i)!==void 0,verdict:i=>({kind:"held",reason:heldReason(i)??"goal-stopped"})},{id:"provider-error",when:i=>i.endedBy==="provider-error"||i.endedBy==="policy-rejection",verdict:i=>i.providerRetryAtMs===void 0?{kind:"stalled",reason:"provider-error"}:{kind:"stalled",reason:"provider-error",retryAtMs:i.providerRetryAtMs}},{id:"aborted",when:i=>i.endedBy==="system-abort"||i.endedBy==="provider-abort"||i.endedBy==="unknown-abort",verdict:i=>{let abortSource=abortSourceOf(i.endedBy);return{kind:"stalled",reason:"aborted",...abortSource!==void 0?{abortSource}:{}}}},{id:"budget",when:i=>i.openWork.kind!=="none"&&i.budgetSpent,verdict:()=>({kind:"stalled",reason:"budget"})},{id:"no-wake",when:i=>i.openWork.kind!=="none",verdict:()=>({kind:"stalled",reason:"no-wake"})},{id:"done",when:()=>!0,verdict:()=>({kind:"done"})}];function evaluateTurnEndLiveness(input){return(TURN_END_RULES.find(candidate=>candidate.when(input))??TURN_END_RULES[TURN_END_RULES.length-1]).verdict(input)}function repeatsLastStall(branch,verdict){for(let index=branch.length-1;index>=0;index--){let entry2=branch[index];if(entry2?.type==="message"&&entry2.message.role==="user")return!1;if(entry2?.type!=="custom"||entry2.customType!==TURN_END_LIVENESS_ENTRY_TYPE)continue;let recorded=entry2.data?.verdict;return recorded?.reason===verdict.reason&&recorded.retryAtMs===verdict.retryAtMs&&recorded.abortSource===verdict.abortSource}return!1}function personInputQueued(ctx){return ctx.hasQueuedPersonInput?.()===!0}function engineTurnsHeld(ctx){if(!("engineTurnsHeld"in ctx))return!1;let probe=ctx.engineTurnsHeld;return typeof probe=="function"&&probe.call(ctx)===!0}function collectTurnEndLivenessInput(ctx,event,state3){let{goal,todoOutcome,monitor}=state3,openTodos=openTodoTaskContents(ctx.sessionManager.getBranch()).length,openWork=goal?.status==="active"?{kind:"active-goal",goalId:goal.id}:openTodos>0?{kind:"open-todos",count:openTodos}:{kind:"none"},expectations=monitor.liveWakeSources().map(source2=>({kind:"wake-source",source:source2})),timer=monitor.scheduledContinuation();return timer!==void 0&&expectations.push({kind:"armed-timer",timer}),monitor.hasStagedRecovery()&&expectations.push({kind:"recovery-staged"}),ctx.hasPendingMessages()&&expectations.push(personInputQueued(ctx)?{kind:"user-input-queued"}:{kind:"pending-messages"}),(calledAskUser(event.messages)||endsWithQuestion(lastAssistantText(event.messages)))&&expectations.push({kind:"question-to-user"}),{isChildSession:ctx.sessionManager.getHeader?.()?.parentSession!==void 0,mode:ctx.mode,ledgerHold:engineTurnsHeld(ctx)?"unattended":void 0,endedBy:classifyTurnEnd(event),willRetry:event.willRetry===!0,deadlineStop:state3.deadlineStop,goalStopped:goal?.status==="paused"||goal?.status==="blocked",openWork,continuationQueued:state3.continuationPending?"goal":todoOutcome==="delivered"?"todo-backstop":void 0,expectations,budgetSpent:goal?.status==="active"&&goal.continuationStoppedAt!==void 0||todoOutcome==="capped"||todoOutcome==="cap",providerRetryAtMs:providerRetryAt(event.messages,Date.now())}}function reportTurnEndLiveness(pi,ctx,event,state3){let input=collectTurnEndLivenessInput(ctx,event,state3),verdict=evaluateTurnEndLiveness(input);if(publishGoalContinuationEvent(pi,TURN_END_LIVENESS_EVENT,{sessionId:ctx.sessionManager.getSessionId(),verdict}),verdict.kind!=="stalled"||repeatsLastStall(ctx.sessionManager.getBranch(),verdict))return;let logger=createSessionLogger(ctx.agentDir);try{pi.appendEntry(TURN_END_LIVENESS_ENTRY_TYPE,{verdict,openWork:input.openWork})}catch(error2){logger.warn("goal_continuation_record_write_failed",{kind:TURN_END_LIVENESS_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}}import{statSync as statSync4}from"node:fs";function readLifecycleGoal(ref){try{statSync4(goalFilePath(ref))}catch(error2){if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")return Promise.resolve(null);throw error2}return readGoal(ref)}var lifecycleHistory={initial:()=>[],add:(entries,entry2)=>(entry2.type==="custom"&&(entry2.customType==="session-lifecycle"||entry2.customType==="work-custody"||entry2.customType==="child-lifecycle"||entry2.customType==="interrupted-run")&&entries.push(entry2),entries)};function bindLifecycleHumanInput(session,listener){return session.onHumanInputAdmitted(event=>listener({kind:event.kind,at:new Date(event.at).toISOString()}))}var dialogOpenedAt=new WeakMap;function readLifecycleRuntimeFacts(session){let now2=new Date().toISOString(),human=[],tuiWait=session.extensionRunner.getLifecycleHumanWait?.();tuiWait&&human.push({...tuiWait,originSessionId:session.sessionId});let dialogs=sessionDialogRequests.get(session)?.snapshot()??[],opened=dialogOpenedAt.get(session)??new Map;dialogOpenedAt.set(session,opened);for(let id of opened.keys())dialogs.some(dialog=>dialog.id===id)||opened.delete(id);for(let question of sessionQuestionBridges.get(session)?.pendingQuestions()??[])human.push({kind:"question",originSessionId:session.sessionId,requestId:question.requestId,revision:1,since:new Date(question.askedAtMs).toISOString()});for(let dialog of dialogs)opened.has(dialog.id)||opened.set(dialog.id,now2),human.push({kind:dialog.method==="confirm"?"approval":"question",originSessionId:session.sessionId,requestId:dialog.id,revision:1,since:opened.get(dialog.id)??now2});let holds2=session.holds.flatMap(hold=>{if(hold.kind==="session_hold"&&hold.key==="interrupted-run")return[];switch(hold.kind){case"unattended":case"session_hold":case"run_fence":case"inherited_hold":return[{kind:hold.kind,since:hold.since}];default:return[]}});return{activity:session.activitySnapshot,pendingMessages:session.pendingMessageCount,holds:holds2,human,inputAdmissionPending:session.externalAdmission.hasInputWork}}var LifecycleChildren=class{constructor(store){this.records=new Map,this.store=store;for(let entry2 of store.entries){if(entry2.type!=="custom"||entry2.customType!=="child-lifecycle")continue;let report=readChildReport(entry2.data);report&&this.accept(report,!1)}}get reports(){return[...this.records.values()]}get activeCount(){return this.reports.filter(report=>report.terminal===void 0).length}report(report){let parsed=readChildReport(report);if(!parsed)throw new Error("Invalid child lifecycle report");this.accept(parsed,!0)&&this.store.changed()}accept(report,persist2){let previous=this.records.get(report.taskId);if(previous&&(report.runEpoch<previous.runEpoch||report.runEpoch===previous.runEpoch&&(previous.terminal!==void 0||report.generation<=previous.generation)))return!1;let accepted={...report,...report.waitingOn?{waitingOn:{...report.waitingOn,human:[]}}:{}};return persist2&&this.store.append(accepted),this.records.set(report.taskId,accepted),!0}};function readLifecycleState(value){switch(value){case"running":case"waiting_children":case"waiting_background":case"waiting_human":case"paused":case"held":case"done":case"failed":case"cancelled":return value;default:return}}function readChildReport(value){if(!isRecord5(value))return;let state3=readLifecycleState(value.state);if(!state3||typeof value.taskId!="string"||typeof value.childSessionId!="string"||typeof value.runEpoch!="number"||!Number.isSafeInteger(value.runEpoch)||value.runEpoch<0||typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<0)return;let terminal2=readTerminal(value.terminal),waitingOn;if(isRecord5(value.waitingOn)&&typeof value.waitingOn.children=="number"){let background=[];if(Array.isArray(value.waitingOn.background))for(let item of value.waitingOn.background)!isRecord5(item)||typeof item.source!="string"||typeof item.activeCount!="number"||background.push({source:item.source,activeCount:item.activeCount,...typeof item.retryAtMs=="number"?{retryAtMs:item.retryAtMs}:{}});waitingOn={children:value.waitingOn.children,background,human:[]}}return{taskId:value.taskId,childSessionId:value.childSessionId,runEpoch:value.runEpoch,generation:value.generation,state:state3,...waitingOn?{waitingOn}:{},...terminal2===void 0?{}:{terminal:terminal2}}}function readTerminal(value){switch(value){case"completed":case"error":case"lost":case"interrupted":case"cancelled":return value;default:return}}var LifecycleAttention=class{constructor(sessionId,restored){this.open=new Map,this.sessionId=sessionId,this.sequence=restored?.attentionSeq??0;for(let occurrence of restored?.synthetic??[])this.open.set(occurrence.key,occurrence.wait)}get attentionSeq(){return this.sequence}get synthetic(){return[...this.open].map(([key,wait])=>({key,wait}))}reconcile(requests){let wanted=new Set(requests.map(request2=>request2.key));for(let key of this.open.keys())wanted.has(key)||this.open.delete(key);return requests.map(({key,kind})=>{let existing2=this.open.get(key);if(existing2?.kind===kind)return existing2;let wait={kind,originSessionId:this.sessionId,requestId:`${key}:${++this.sequence}`,revision:1,since:new Date().toISOString()};return this.open.set(key,wait),wait})}};function readHumanWait(value){if(isRecord5(value)){switch(value.kind){case"question":case"approval":case"goal_blocked":case"goal_paused":case"stalled":case"interrupted_run":break;default:return}if(!(typeof value.originSessionId!="string"||typeof value.requestId!="string"||typeof value.revision!="number"||typeof value.since!="string"))return{kind:value.kind,originSessionId:value.originSessionId,requestId:value.requestId,revision:value.revision,since:value.since,...typeof value.childSessionId=="string"?{childSessionId:value.childSessionId}:{},...typeof value.childLabel=="string"?{childLabel:value.childLabel}:{}}}}function readLifecycleRecord(value){if(!isRecord5(value))return;let state3=readLifecycleState(value.state);if(!state3||typeof value.sessionId!="string"||typeof value.seq!="number"||typeof value.epoch!="number"||value.epochOrigin!=="human"&&value.epochOrigin!=="automatic"||typeof value.humanInputRevision!="number"||typeof value.selfSettleEligible!="boolean"||typeof value.runPaused!="boolean"||typeof value.since!="string"||value.role!=="root"&&value.role!=="child"||typeof value.rootSessionId!="string")return;let synthetic=[];if(Array.isArray(value.synthetic))for(let occurrence of value.synthetic){if(!isRecord5(occurrence)||typeof occurrence.key!="string")continue;let wait=readHumanWait(occurrence.wait);wait&&synthetic.push({key:occurrence.key,wait})}let waitingOn=readWaits(value.waitingOn),holds2=readHolds(value.holds),completion=readCompletion(value.completion),failure2=readFailure(value.failure),lastTurnEnd=readTurnEnd(value.lastTurnEnd);return{sessionId:value.sessionId,state:state3,seq:value.seq,epoch:value.epoch,epochOrigin:value.epochOrigin,humanInputRevision:value.humanInputRevision,selfSettleEligible:value.selfSettleEligible,runPaused:value.runPaused,since:value.since,role:value.role,rootSessionId:value.rootSessionId,restoring:!0,persisted:value.persisted===!0,attentionSeq:typeof value.attentionSeq=="number"?value.attentionSeq:0,synthetic,epochSealed:value.epochSealed===!0,runActive:value.runActive===!0,interrupted:value.interrupted===!0,...typeof value.completedGoalId=="string"?{completedGoalId:value.completedGoalId}:{},...typeof value.completedRunId=="string"?{completedRunId:value.completedRunId}:{},...typeof value.completionId=="string"?{completionId:value.completionId}:{},...typeof value.parentSessionId=="string"?{parentSessionId:value.parentSessionId}:{},...typeof value.taskId=="string"?{taskId:value.taskId}:{},...typeof value.runId=="string"?{runId:value.runId}:{},...waitingOn?{waitingOn}:{},...holds2?{holds:holds2}:{},...completion?{completion}:{},...failure2?{failure:failure2}:{},...lastTurnEnd?{lastTurnEnd}:{},...isRecord5(value.settleDecision)&&typeof value.settleDecision.decisionId=="string"?{settleDecision:{decisionId:value.settleDecision.decisionId}}:{},...isRecord5(value.settleRequest)&&typeof value.settleRequest.epoch=="number"&&typeof value.settleRequest.revision=="number"?{settleRequest:{epoch:value.settleRequest.epoch,revision:value.settleRequest.revision}}:{}}}function readTurnEnd(value){if(!(!isRecord5(value)||typeof value.deadlineStop!="boolean"||typeof value.budgetSpent!="boolean"))switch(value.endedBy){case"clean":case"user-abort":case"system-abort":case"provider-abort":case"unknown-abort":case"provider-error":case"policy-rejection":return{endedBy:value.endedBy,deadlineStop:value.deadlineStop,budgetSpent:value.budgetSpent,providerRetryAtMs:typeof value.providerRetryAtMs=="number"?value.providerRetryAtMs:void 0};default:return}}function readWaits(value){if(!isRecord5(value)||typeof value.children!="number")return;let background=[];if(Array.isArray(value.background))for(let source2 of value.background)!isRecord5(source2)||typeof source2.source!="string"||typeof source2.activeCount!="number"||background.push({source:source2.source,activeCount:source2.activeCount,...typeof source2.retryAtMs=="number"?{retryAtMs:source2.retryAtMs}:{}});let human=Array.isArray(value.human)?value.human.flatMap(request2=>{let wait=readHumanWait(request2);return wait?[wait]:[]}):[];return{children:value.children,background,human}}function readHolds(value){if(Array.isArray(value))return value.flatMap(hold=>{if(!isRecord5(hold)||typeof hold.since!="string")return[];switch(hold.kind){case"session_hold":case"run_fence":case"inherited_hold":case"unattended":return[{kind:hold.kind,since:hold.since}];default:return[]}})}function readCompletion(value){if(!(!isRecord5(value)||typeof value.at!="string"))switch(value.kind){case"goal":case"run":case"agent":case"reply":return{kind:value.kind,at:value.at,...typeof value.goalId=="string"?{goalId:value.goalId}:{},...typeof value.runId=="string"?{runId:value.runId}:{}};default:return}}function readFailure(value){if(isRecord5(value))switch(value.reason){case"provider_error":case"tool_error":case"task_error":case"lost":case"interrupted":return{reason:value.reason,...typeof value.message=="string"?{message:value.message}:{},...typeof value.retryAtMs=="number"?{retryAtMs:value.retryAtMs}:{},...typeof value.taskId=="string"?{taskId:value.taskId}:{},...typeof value.runEpoch=="number"?{runEpoch:value.runEpoch}:{}};default:return}}function lifecycleState(facts){let stopHeld=facts.holds.some(hold=>hold.kind==="session_hold"||hold.kind==="inherited_hold");if(facts.role==="child"&&facts.terminal!==void 0)switch(facts.terminal){case"completed":if(facts.holds.length===0)return"done";break;case"cancelled":return"cancelled";case"error":case"lost":return"failed";case"interrupted":if(!stopHeld)return"failed";break;default:return facts.terminal}return stopHeld||facts.holds.some(hold=>hold.kind==="run_fence")&&!facts.running?"paused":facts.holds.length>0&&facts.holds.every(hold=>hold.kind==="unattended")?"held":facts.waits.human.length>0?"waiting_human":facts.running?"running":facts.waits.children>0?"waiting_children":facts.waits.background.length>0?"waiting_background":facts.role==="child"?"running":facts.failure!==void 0?"failed":"done"}function lifecycleTerminal(state3){switch(state3){case"done":case"failed":case"cancelled":return!0;case"running":case"waiting_children":case"waiting_background":case"waiting_human":case"paused":case"held":return!1;default:return state3}}var LifecycleLedger=class{constructor(persistence){this.sealed=!1,this.admissionWriteFailed=!1,this.unwritten=!1,this.runActive=!1,this.interrupted=!1,this.persistence=persistence;let restored;for(let entry2 of persistence.entries){if(entry2.type!=="custom"||entry2.customType!=="session-lifecycle")continue;let parsed=readLifecycleRecord(entry2.data);parsed?.sessionId===persistence.sessionId&&(!restored||parsed.seq>restored.seq)&&(restored=parsed)}let spawnedBy=persistence.spawnedBy;this.current=restored?wireSnapshot(restored):{state:"done",seq:0,epoch:0,epochOrigin:"automatic",humanInputRevision:0,selfSettleEligible:!0,restoring:!0,persisted:!1,runPaused:!1,since:new Date().toISOString(),role:spawnedBy?"child":"root",rootSessionId:spawnedBy?.rootSessionId??persistence.sessionId,...spawnedBy?{parentSessionId:spawnedBy.parentSessionId,taskId:spawnedBy.taskId}:{}},this.attention=new LifecycleAttention(persistence.sessionId,restored),this.sealed=restored?.epochSealed??!1,this.runId=restored?.runId,this.interrupted=restored?.interrupted===!0||restored?.runActive===!0&&!this.sealed,this.goalCompleted=restored?.completedGoalId,this.runCompleted=restored?.completedRunId,this.lastTurnEnd=restored?.lastTurnEnd,restored?.settleRequest&&!this.sealed&&(this.current={...this.current,selfSettleEligible:!1})}get snapshot(){return this.current}custodyWriteFailed(){this.current={...this.current,persisted:!1,selfSettleEligible:!1}}releaseRestoreBarrier(){this.current={...this.current,restoring:!1}}humanInput(at){this.request=void 0;let{settleDecision:_decision,...current}=this.current,preparingFirstTurn=current.epoch===0&&lifecycleTerminal(current.state),next={...current,state:preparingFirstTurn?"running":current.state,humanInputRevision:current.humanInputRevision+1,since:preparingFirstTurn?at:current.since};!this.runActive&&(this.sealed||current.epoch===0)?(this.current=next,this.unwritten=!0):this.write(next,!0)||(this.admissionWriteFailed=!0)}startRun(origin){this.lastTurnEnd=void 0,this.openEpoch(origin),this.runId=crypto.randomUUID(),this.runActive=!0,this.admissionWriteFailed=!1,this.unwritten=!0}openEpoch(origin){if(!this.sealed&&this.current.epoch>0)return;this.sealed=!1,this.request=void 0,this.goalCompleted=void 0,this.runCompleted=void 0;let{completionId:_id,completion:_completion,failure:_failure,settleDecision:_decision,...current}=this.current;this.current={...current,epoch:current.epoch+1,epochOrigin:origin,selfSettleEligible:!this.admissionWriteFailed},this.unwritten=!0}markGoalCompleted(goalId){this.current.epoch===0||this.sealed||this.goalCompleted===goalId||(this.goalCompleted=goalId,this.checkpoint())}markRunCompleted(runId){this.current.epoch===0||this.sealed||this.runCompleted===runId||(this.runCompleted=runId,this.checkpoint())}requestSelfSettle(){let base={epoch:this.current.epoch,humanInputRevision:this.current.humanInputRevision};return(this.current.holds?.length??0)>0?{...base,recorded:!1,reason:"held"}:this.current.epoch===0||this.sealed?{...base,recorded:!1,reason:"no_epoch"}:!this.current.selfSettleEligible||this.current.role!=="root"?{...base,recorded:!1,reason:"not_eligible"}:(this.request={epoch:this.current.epoch,revision:this.current.humanInputRevision},this.write(this.current,!1)?{...base,recorded:!0}:(this.request=void 0,this.current={...this.current,selfSettleEligible:!1},{...base,recorded:!1,reason:"not_eligible"}))}update(input){(input.holds.length>0||input.state==="failed")&&(this.request=void 0);let terminal2=input.state==="done"||input.state==="failed",{completionId:_id,completion:_completion,failure:_failure,settleDecision:_decision,...base}=this.current,now2=new Date().toISOString(),standingRequest=this.request?.epoch===base.epoch&&this.request.revision===base.humanInputRevision&&base.selfSettleEligible&&input.holds.length===0,completion=input.state==="done"&&base.epoch>0?this.goalCompleted?{kind:"goal",at:now2,goalId:this.goalCompleted}:this.runCompleted?{kind:"run",at:now2,runId:this.runCompleted}:{kind:standingRequest?"agent":"reply",at:now2}:void 0,next={...base,state:input.state,waitingOn:input.waits,holds:input.holds,runPaused:input.holds.some(hold=>hold.kind==="run_fence"),since:input.state===this.current.state?this.current.since:now2,...terminal2&&base.epoch>0?{completionId:`${this.persistence.sessionId}:${base.epoch}`}:{},...completion?{completion:this.current.state==="done"&&this.sealed?this.current.completion??completion:completion}:{},...input.state==="failed"&&input.failure?{failure:input.failure}:{},...input.state==="done"&&standingRequest?{settleDecision:this.current.settleDecision??{decisionId:crypto.randomUUID()}}:{},...input.state==="done"&&this.sealed&&this.current.settleDecision?{settleDecision:this.current.settleDecision}:{}};if(terminal2&&base.epoch>0&&(this.sealed=!0),!this.current.restoring&&!(this.current.persisted&&equivalent(this.current,next))){if(terminal2&&base.epoch===0){this.current=next;return}this.write(next,!0)}}checkpoint(){this.write(this.current,!1)}publishUnwritten(){this.unwritten&&this.write(this.current,!0)}write(snapshot,emit2){let next={...snapshot,seq:this.current.seq+1,persisted:!0},record10={...next,sessionId:this.persistence.sessionId,attentionSeq:this.attention.attentionSeq,synthetic:this.attention.synthetic,epochSealed:this.sealed,runActive:this.runActive,interrupted:this.interrupted,...this.lastTurnEnd?{lastTurnEnd:this.lastTurnEnd}:{},...this.goalCompleted?{completedGoalId:this.goalCompleted}:{},...this.runCompleted?{completedRunId:this.runCompleted}:{},...this.runId?{runId:this.runId}:{},...this.request?{settleRequest:this.request}:{}};this.unwritten=!1;try{this.persistence.append(record10),this.current=next}catch(error2){if(!(error2 instanceof Error))throw error2;this.current={...next,persisted:!1,selfSettleEligible:!1}}return emit2&&!this.current.restoring&&this.persistence.emit({type:"session_lifecycle",sessionId:this.persistence.sessionId,lifecycle:this.current}),this.current.persisted}};function equivalent(previous,next){return previous.state===next.state&&previous.epoch===next.epoch&&previous.humanInputRevision===next.humanInputRevision&&previous.runPaused===next.runPaused&&previous.selfSettleEligible===next.selfSettleEligible&&JSON.stringify(previous.waitingOn)===JSON.stringify(next.waitingOn)&&JSON.stringify(previous.holds)===JSON.stringify(next.holds)&&JSON.stringify(previous.failure)===JSON.stringify(next.failure)}function wireSnapshot(record10){let{sessionId:_sessionId,interrupted:_interrupted,completedGoalId:_goal,completedRunId:_completedRun,lastTurnEnd:_lastTurnEnd,attentionSeq:_attentionSeq,synthetic:_synthetic,epochSealed:_sealed,settleRequest:_request,runId:_runId,runActive:_runActive,...snapshot}=record10;return snapshot}var ENGINE_DELIVERY_KEY_PREFIX="delivery:",WAKE_SOURCE_KEY_PREFIX="wake-source:",ENGINE_CUSTODY_KEY_PREFIXES=[ENGINE_DELIVERY_KEY_PREFIX,WAKE_SOURCE_KEY_PREFIX],DeliveryTicketRefused=class extends Error{constructor(ticketId,reason){super(`Delivery ticket ${ticketId} was refused: ${reason}`),this.name="DeliveryTicketRefused",this.ticketId=ticketId,this.reason=reason}},CustodyViolation=class extends Error{constructor(key){super(`Work custody is no longer owned: ${key}`),this.name="CustodyViolation",this.key=key}},SessionWorkObligations=class{constructor(store){this.records=new Map,this.unpersisted=new Map,this.delivering=new Set,this.publishedSources=new Set,this.store=store;for(let entry2 of store.entries){if(entry2.type!=="custom"||entry2.customType!=="work-custody")continue;let record10=readWorkCustody(entry2.data);record10&&this.records.set(record10.id,record10)}}get active(){return[...this.records.values()].filter(custodyIsOpen)}get activeCount(){return this.active.reduce((sum,record10)=>sum+(record10.activeCount??1),0)}get persisted(){return this.unpersisted.size===0}open(key,kind,detail){let existing2=this.active.find(record11=>record11.key===key);if(existing2)return this.token(existing2.id);let record10={id:crypto.randomUUID(),key,kind,state:"open",...detail===void 0?{}:{detail}};return this.install(record10),this.store.changed(),this.token(record10.id)}syncSource(source2,kind,activeCount){let key=`${WAKE_SOURCE_KEY_PREFIX}${source2}`;this.publishedSources.add(key);let current=this.active.find(record10=>record10.key===key);if(activeCount<=0){current&&this.close(current.id,"passive");return}current?.activeCount===activeCount&¤t.kind===kind||(this.install({...current,id:current?.id??crypto.randomUUID(),key,source:source2,kind,activeCount,state:current?.state??"open"}),this.store.changed())}retireRestoredSources(){for(let record10 of this.active)record10.key.startsWith(WAKE_SOURCE_KEY_PREFIX)&&!this.publishedSources.has(record10.key)&&this.close(record10.id,"passive")}admission(ticketId){let record10=[...this.records.values()].find(value=>value.ticketId===ticketId);return record10?custodyIsOpen(record10)?record10.state==="consumed"?"consumed":this.delivering.has(ticketId)?"delivering":"admitted":"closed":"unknown"}queue(ticketId,payload){let admission=this.admission(ticketId);if(admission==="unknown")throw new CustodyViolation(ticketId);if(admission!=="admitted")return!1;let record10=this.ticketRecord(ticketId),itemIds=payload.itemIds??(record10.state==="queued"?record10.payload?.itemIds:void 0);return this.install({...record10,state:"queued",payload:{...payload,...itemIds?{itemIds}:{}},delivery:void 0}),this.delivering.add(ticketId),this.store.changed(),!0}queuedItemIds(ticketId){let record10=[...this.records.values()].find(value=>value.ticketId===ticketId);return record10?.state==="queued"?record10.payload?.itemIds:void 0}endDelivery(ticketId){this.delivering.delete(ticketId)}passive(ticketId){let record10=this.ticketRecord(ticketId);custodyIsOpen(record10)&&this.close(record10.id,"passive")}consumed(ticketId,run2){let record10=this.ticketRecord(ticketId);!custodyIsOpen(record10)||record10.state==="consumed"||(this.install({...record10,state:"consumed",...run2,delivery:void 0}),this.store.changed())}failed(ticketId){let record10=this.ticketRecord(ticketId);!custodyIsOpen(record10)||record10.state==="consumed"||(this.install({...record10,state:"queued",delivery:"failed"}),this.store.changed())}held(ticketId,noticeId){let record10=this.ticketRecord(ticketId);custodyIsOpen(record10)&&this.close(record10.id,"held",noticeId)}retire(ticketId){let record10=this.ticketRecord(ticketId);!custodyIsOpen(record10)||record10.state==="consumed"||(this.install({...record10,state:"open",delivery:"retired",payload:void 0}),this.store.changed())}cancel(ticketId){let record10=this.ticketRecord(ticketId);custodyIsOpen(record10)&&record10.state!=="consumed"&&this.close(record10.id,"cancelled")}settleRun(runId){for(let record10 of this.active)record10.state==="consumed"&&record10.runId===runId&&this.install({...record10,state:"settled"});this.store.changed()}install(record10){try{this.store.append(record10),this.unpersisted.delete(record10.id)}catch(error2){if(!(error2 instanceof Error))throw error2;this.unpersisted.set(record10.id,record10)}this.records.set(record10.id,record10)}flush(){for(let[id,record10]of this.unpersisted)this.store.append(record10),this.unpersisted.delete(id)}owned(id){let record10=this.records.get(id);if(!record10||!custodyIsOpen(record10))throw new CustodyViolation(record10?.key??id);return record10}ticketRecord(ticketId){let record10=[...this.records.values()].find(value=>value.ticketId===ticketId);if(!record10)throw new CustodyViolation(ticketId);return record10}close(id,state3,noticeId){let record10=this.owned(id);this.install({...record10,state:state3,...noticeId===void 0?{}:{noticeId}}),this.store.changed()}token(id){return{transfer:(nextKey,kind)=>{let current=this.owned(id);if(nextKey===current.key)throw new CustodyViolation(nextKey);let next=this.active.find(record10=>record10.key===nextKey)??{id:crypto.randomUUID(),key:nextKey,kind:kind??current.kind,state:"open"};try{this.install(next),this.install({...current,state:"cancelled"})}finally{this.store.changed()}return this.token(next.id)},ticket:()=>{let record10=this.owned(id);if(record10.ticketId)return record10.ticketId;let ticketId=crypto.randomUUID();return this.install({...record10,state:"queued",ticketId}),this.store.changed(),ticketId},heldAsNotice:noticeId=>this.close(id,"held",noticeId),close:reason=>this.close(id,reason==="consumed"?"settled":reason)}}};var SessionLifecycleController=class{constructor(options){this.idleBoundaryPassed=!1,this.pendingHuman=!1,this.admittingHuman=!1,this.runAdmitted=!1,this.goal=null,this.evaluating=!1,this.deferred=!1,this.options=options,this.ledger=new LifecycleLedger({...options,append:record10=>{this.obligations.flush(),options.append(record10)}}),this.ledger.lastTurnEnd&&(this.liveness={...this.ledger.lastTurnEnd,isChildSession:this.ledger.snapshot.role==="child",mode:"rpc",ledgerHold:void 0,willRetry:!1,continuationQueued:void 0,goalStopped:!1,openWork:{kind:"none"},expectations:[]}),this.obligations=new SessionWorkObligations({entries:options.entries,append:record10=>options.appendCustody(record10),changed:()=>this.recompute()}),this.children=new LifecycleChildren({entries:options.entries,append:report=>options.appendChild(report),changed:()=>{this.ownTask=this.children.reports.find(report=>report.childSessionId===options.sessionId&&report.taskId===options.spawnedBy?.taskId),this.recompute()}});for(let report of this.children.reports)report.childSessionId===options.sessionId&&report.taskId===options.spawnedBy?.taskId&&(this.ownTask=report)}get snapshot(){return this.recompute(),this.ledger.snapshot}get lastTurnInput(){return this.liveness}get requiresHumanContinuation(){return this.ledger.interrupted&&!this.pendingHuman}get nextRunOrigin(){return this.pendingHuman?"human":"automatic"}restoreComplete(){this.ledger.releaseRestoreBarrier(),this.idleBoundaryPassed=!0,this.recompute(),this.ledger.snapshot.seq>0&&this.ledger.checkpoint()}humanInput(at){this.admittingHuman=!0,this.pendingHuman||=!this.ledger.runActive,this.ledger.humanInput(at)}noteRunAdmitted(){this.runAdmitted=!0}admissionSettled(){this.admittingHuman=!1,!this.ledger.runActive&&!this.ledger.interrupted&&this.options.readRuntime().pendingMessages===0&&(this.pendingHuman=!1),!this.runAdmitted&&this.recompute()}startRun(origin){this.admittingHuman=!1,this.runAdmitted=!1,this.idleBoundaryPassed=!1,this.liveness=void 0;let interruptedRun=this.ledger.interrupted?this.ledger.runId:void 0;this.ledger.interrupted=!1,this.ledger.startRun(origin??(this.pendingHuman?"human":"automatic")),this.pendingHuman=!1,interruptedRun&&this.obligations.settleRun(interruptedRun),this.recompute(),this.ledger.publishUnwritten()}idle(){this.runAdmitted=!1;let seq=this.ledger.snapshot.seq;this.ledger.runActive=!1,this.idleBoundaryPassed=!0;let runId=this.ledger.runId;runId&&this.obligations.settleRun(runId),this.recompute(),seq>0&&this.ledger.snapshot.seq===seq&&this.ledger.checkpoint()}goalFacts(goal,input){this.liveness=input,input&&(this.ledger.lastTurnEnd={endedBy:input.endedBy,budgetSpent:input.budgetSpent,deadlineStop:input.deadlineStop,providerRetryAtMs:input.providerRetryAtMs}),this.goalChanged(goal)}goalChanged(goal){goal?.status==="complete"&&this.goal?.status!=="complete"&&this.ledger.markGoalCompleted(goal.id),this.goal=goal,this.recompute()}reportChild(report){this.children.report(report)}requestSelfSettle(){return this.admittingHuman||this.options.readRuntime().inputAdmissionPending?{recorded:!1,reason:"not_eligible",epoch:this.ledger.snapshot.epoch,humanInputRevision:this.ledger.snapshot.humanInputRevision}:(this.recompute(),this.ledger.requestSelfSettle())}markRunCompleted(runId){this.ledger.markRunCompleted(runId),this.recompute()}recompute(){if(this.obligations.persisted||this.ledger.custodyWriteFailed(),!(this.ledger.snapshot.restoring||this.admittingHuman)){if(this.evaluating){this.deferred=!0;return}this.evaluating=!0;try{do this.deferred=!1,this.evaluate();while(this.deferred)}finally{this.evaluating=!1}}}evaluate(){let runtime=this.options.readRuntime(),active=this.obligations.active,childRecords=this.children.reports.filter(report=>report.childSessionId!==this.options.sessionId&&report.terminal===void 0).length,background=active.filter(record10=>record10.kind==="background").map(record10=>({source:record10.source??record10.key,activeCount:record10.activeCount??1})),children=Math.max(childRecords,active.filter(record10=>record10.kind==="children").reduce((sum,record10)=>sum+(record10.activeCount??1),0)),input=this.liveness,continuationQueued=input?.willRetry===!0||input?.continuationQueued!==void 0,questionToUser=!1;for(let expectation of input?effectiveWakes(input):[])switch(expectation.kind){case"pending-messages":continuationQueued||=runtime.pendingMessages>0;break;case"user-input-queued":continuationQueued=!0;break;case"armed-timer":expectation.timer==="userGrace"?continuationQueued=!0:background.push({source:expectation.timer==="providerRetry"?"provider-retry":"goal-monitor",activeCount:1,...expectation.timer==="providerRetry"&&input?.providerRetryAtMs!==void 0?{retryAtMs:input.providerRetryAtMs}:{}});break;case"recovery-staged":background.push({source:"staged-recovery",activeCount:1});break;case"wake-source":if(active.some(record10=>record10.source===expectation.source))break;background.push({source:expectation.source,activeCount:1});break;case"question-to-user":questionToUser=!0;break;default:}let synthetic=[],root=this.ledger.snapshot.role==="root";if(root){questionToUser&&runtime.human.length===0&&synthetic.push({key:`question:${this.ledger.runId??this.ledger.snapshot.epoch}`,kind:"question"}),this.goal?.status==="blocked"?synthetic.push({key:`goal:${this.goal.id}`,kind:"goal_blocked"}):this.goal&&(this.goal.status==="paused"||this.goal.continuationStoppedAt!==void 0)&&synthetic.push({key:`goal:${this.goal.id}`,kind:"goal_paused"}),this.ledger.interrupted&&synthetic.push({key:`interrupted:${this.ledger.snapshot.epoch}`,kind:"interrupted_run"});let noWake=children===0&&background.length===0&&!continuationQueued&&runtime.pendingMessages===0;input&&noWake&&input.endedBy!=="provider-error"&&input.endedBy!=="policy-rejection"&&(input.deadlineStop||input.budgetSpent||input.endedBy==="unknown-abort"||input.endedBy==="system-abort"||input.endedBy==="provider-abort"||(input.openWork.kind==="active-goal"?this.goal?.status==="active":input.openWork.kind!=="none")&&!input.goalStopped)?synthetic.push({key:`stall:${this.ledger.snapshot.epoch}`,kind:"stalled"}):noWake&&this.goal?.status==="active"&&!this.ledger.runActive&&!runtime.activity.isStreaming&&!runtime.activity.hasSessionWork&&!runtime.activity.isCompacting&&!runtime.activity.isBashRunning&&this.goal.continuationStoppedAt===void 0&&synthetic.push({key:`stall:${this.ledger.snapshot.epoch}`,kind:"stalled"})}let human=root?[...runtime.human,...this.ledger.attention.reconcile(synthetic)]:[],running2=this.ledger.runActive||runtime.activity.isStreaming||runtime.activity.isCompacting||runtime.activity.isBashRunning||runtime.activity.hasSessionWork||runtime.pendingMessages>0||continuationQueued,failure2=input&&(input.endedBy==="provider-error"||input.endedBy==="policy-rejection")&&!continuationQueued&&background.length===0?{reason:"provider_error",...input.providerRetryAtMs===void 0?{}:{retryAtMs:input.providerRetryAtMs}}:this.ownTask?.terminal==="error"||this.ownTask?.terminal==="lost"||this.ownTask?.terminal==="interrupted"?{reason:this.ownTask.terminal==="error"?"task_error":this.ownTask.terminal,taskId:this.ownTask.taskId,runEpoch:this.ownTask.runEpoch}:void 0,waits={children,background,human},state3=lifecycleState({role:this.ledger.snapshot.role,terminal:this.ownTask?.terminal,holds:runtime.holds,waits,running:running2,failure:failure2});lifecycleTerminal(state3)&&this.ownTask?.terminal===void 0&&(!this.idleBoundaryPassed||active.length>0)||this.ledger.update({state:state3,waits,holds:runtime.holds,failure:failure2})}};var LifecycleSessionBinding=class{constructor(session,host){this.refreshGeneration=0,this.restored=!1,this.disposed=!1,this.session=session,this.host=host,this.sessionId=session.sessionId,this.controller=new SessionLifecycleController({sessionId:session.sessionId,spawnedBy:session.sessionManager.getHeader()?.spawnedBy,entries:session.sessionManager.reduceHistory(lifecycleHistory).filter(entry2=>entry2.type!=="custom"||entry2.customType!=="work-custody"&&entry2.customType!=="child-lifecycle"||isRecord5(entry2.data)&&entry2.data.sessionId===session.sessionId),append:record10=>{this.write(()=>host.append("session-lifecycle",record10))},appendChild:report=>{this.write(()=>host.append("child-lifecycle",{...report,sessionId:session.sessionId}))},appendCustody:record10=>{this.write(()=>host.append("work-custody",{...record10,sessionId:session.sessionId}))},emit:event=>{this.write(()=>host.emit(event))},readRuntime:()=>readLifecycleRuntimeFacts(session)});let deliveries=session.sessionManager.reduceHistory(lifecycleDeliveryEntries);for(let record10 of this.controller.obligations.active){if(record10.ticketId&&(record10.state==="consumed"||deliveries.has(record10.ticketId))&&(this.controller.ledger.interrupted=!0),record10.state!=="queued"||!record10.payload||!record10.ticketId)continue;let ticketId=record10.ticketId,message={role:"custom",...record10.payload.message,timestamp:0},deliveryId=deliveryIdOf(message);deliveryId!==void 0&&(deliveries.has(ticketId)?session.externalAdmission.observePersisted(message):session.externalAdmission.restoreQueued(deliveryId,()=>session.sessionManager.reduceHistory(lifecycleDeliveryEntries).has(ticketId)||this.controller.obligations.active.some(current=>current.ticketId===ticketId&¤t.state==="queued")))}this.unsubscribeHuman=bindLifecycleHumanInput(session,event=>this.controller.humanInput(event.at)),this.unsubscribeAdmission=session.externalAdmission.onInputsSettled(()=>this.controller.admissionSettled()),this.unsubscribeGoal=onGoalLifecycleChange(session.sessionManager,goal=>{this.refreshFacts(goal).catch(error2=>host.factsFailed(error2)),this.controller.goalChanged(goal)})}bindFactEvents(runner){this.retireFactEvents?.();let refresh=()=>{this.refreshFacts().catch(error2=>this.host.factsFailed(error2))},retire=[runner.onBusEvent("wake_source_state",data=>{this.observeWakeSource(data),refresh()}),runner.onBusEvent("goal_continuation_timer_state",refresh),runner.onBusEvent("goal_store_changed",data=>{isRecord5(data)&&data.threadId===this.sessionId&&refresh()})];this.retireFactEvents=()=>{for(let unsubscribe of retire)unsubscribe()}}prepareRun(){this.nextRunOrigin=this.controller.nextRunOrigin,this.controller.noteRunAdmitted()}get isRestored(){return this.restored}startRun(){this.lastEnd=void 0;let origin=this.nextRunOrigin;this.nextRunOrigin=void 0,this.controller.startRun(origin)}consume(message){return this.write(()=>consumeLifecycleDelivery(this.session,this.controller,message))}consumedEntry(message){if(message.role!=="custom")return;let ticketId=messageTicket(message);return ticketId?this.session.sessionManager.reduceHistory(lifecycleDeliveryEntries).get(ticketId):void 0}async turnEnded(event){this.lastEnd=event,await this.refreshFacts()}async refreshFacts(changedGoal){let generation2=++this.refreshGeneration,saved=this.lastEnd?void 0:this.controller.lastTurnInput,end=this.lastEnd??(saved?{type:"agent_end",messages:[]}:void 0),collected;try{collected=await collectGoalLifecycleFacts(this.session.sessionManager,end,changedGoal)}catch(error2){if(error2 instanceof StaleExtensionContextError)return;throw error2}let goal=collected?collected.goal:changedGoal===void 0?await readLifecycleGoal(goalStoreRef(this.session.sessionManager,this.session.cwd)):changedGoal;if(generation2!==this.refreshGeneration)return;let input=collected?.input;if(!input&&end&&this.session.extensionRunner.isActive){let ctx=this.session.extensionRunner.createContext();input=collectTurnEndLivenessInput(ctx,end,{goal,todoOutcome:void 0,deadlineStop:!1,continuationPending:!1,monitor:{liveWakeSources:()=>[...this.session.activeWakeSources],scheduledContinuation:()=>{},hasStagedRecovery:()=>!1}})}input&&saved&&(input={...input,endedBy:saved.endedBy,budgetSpent:input.budgetSpent||saved.budgetSpent,deadlineStop:input.deadlineStop||saved.deadlineStop,providerRetryAtMs:input.providerRetryAtMs??saved.providerRetryAtMs}),this.controller.goalFacts(goal,input)}async idle(){await this.refreshFacts(),this.controller.idle()}restore(){return this.restored?Promise.resolve():(this.restoring??=this.recover(),this.restoring)}async recover(){if(await this.refreshFacts(),this.disposed)return;let entries=this.session.sessionManager.reduceHistory(lifecycleHistory),active=this.controller.obligations.active;for(let record10 of active){if(!record10.ticketId)continue;let ticketId=record10.ticketId,entryId=this.session.sessionManager.reduceHistory(lifecycleDeliveryEntries).get(ticketId),transcript=entryId?this.session.sessionManager.getEntry(entryId):void 0;record10.state!=="consumed"&&!transcript||(transcript&&record10.state!=="consumed"&&this.controller.obligations.consumed(ticketId,{runId:record10.runId??this.controller.ledger.runId??crypto.randomUUID(),transcriptEntryId:transcript.id}),this.controller.ledger.interrupted=!0,entries.some(entry2=>entry2.type==="custom"&&entry2.customType==="interrupted-run"&&isRecord5(entry2.data)&&entry2.data.ticketId===ticketId)||this.hostAppendInterruption(ticketId,record10.runId),this.recordInterruptedTools(transcript?.id??record10.transcriptEntryId))}this.restored=!0,this.controller.obligations.retireRestoredSources(),this.controller.restoreComplete();for(let record10 of this.controller.obligations.active)if(!(record10.state!=="queued"||!record10.payload||!record10.ticketId)){if(this.disposed)return;await this.session.sendCustomMessage(record10.payload.message,{triggerTurn:!0,deliverAs:record10.payload.deliverAs,ticket:record10.ticketId})}}recordInterruptedTools(transcriptEntryId){if(!transcriptEntryId)return;let entries=this.session.sessionManager.getEntries(),start=entries.findIndex(entry2=>entry2.id===transcriptEntryId);if(start<0)return;let pending=new Map;for(let entry2 of entries.slice(start))if(entry2.type==="message")if(entry2.message.role==="assistant")for(let part of entry2.message.content)part.type==="toolCall"&&pending.set(part.id,part);else entry2.message.role==="toolResult"&&pending.delete(entry2.message.toolCallId);for(let call of pending.values())this.write(()=>this.session.sessionManager.appendMessage({role:"toolResult",toolCallId:call.id,toolName:call.name,content:[{type:"text",text:"INTERRUPTED: the consuming run ended before this tool result was recorded. Side effects may be partial. The tool was not re-run."}],details:{interrupted:{reason:"host_restart"}},isError:!0,timestamp:Date.now()}));pending.size>0&&(this.session.agent.state.messages=this.session.sessionManager.buildSessionContext().messages)}hostAppendInterruption(ticketId,runId){this.write(()=>this.session.sessionManager.appendCustomEntry("interrupted-run",{ticketId,runId,status:"INTERRUPTED",reason:"host_restart",at:new Date().toISOString()}))}write(record10){if(!this.disposed)return record10()}observeWakeSource(data){!isRecord5(data)||typeof data.source!="string"||typeof data.activeCount!="number"||Number.isFinite(data.activeCount)&&this.controller.obligations.syncSource(data.source,data.kind==="children"?"children":"background",data.activeCount)}dispose(){this.disposed=!0,this.refreshGeneration++,this.retireFactEvents?.(),this.unsubscribeHuman(),this.unsubscribeAdmission(),this.unsubscribeGoal()}};function memoryReportEnabled(env=process.env){return envValue("MEMORY_REPORT",env)==="1"}function memoryReportSnapshotEnabled(env=process.env){return envValue("MEMORY_REPORT_SNAPSHOT",env)==="1"}var RESERVED_MEMORY_REPORT_KEYS=new Set(["sessionId","takenAt","pid","main","kernels","residentStore","tuiRenderCache","heapSnapshot","reporterErrors"]),STATE_KEY=Symbol.for("senpi.memory-report.state");function state(){let existing2=Reflect.get(globalThis,STATE_KEY);if(isState(existing2))return existing2;let created={sessions:new Map,tuiRenderCache:void 0};return Reflect.set(globalThis,STATE_KEY,created),created}function isState(value){return typeof value=="object"&&value!==null&&Reflect.get(value,"sessions")instanceof Map}function registerMemoryReportSession(owner,source2){if(!memoryReportEnabled())return()=>{};let{sessions:sessions2}=state();return sessions2.set(owner,source2),()=>{sessions2.get(owner)===source2&&sessions2.delete(owner)}}function memoryReportSessionFor(owner){return state().sessions.get(owner)}function memoryReportSessions(){return[...state().sessions.values()]}function registerTuiRenderCacheSource(read2){state().tuiRenderCache=read2}function tuiRenderCacheTotals(){return state().tuiRenderCache?.()}var SDK_MODEL_CHANGE={source:"sdk"};function heldSwitchOrigin(first){return{source:"held-switch",actor:first.actor===void 0?first.source:`${first.source}:${first.actor}`,...first.effectId===void 0?{}:{effectId:first.effectId}}}function modelChangeLogFields(input){return{source:input.origin.source,...input.origin.actor===void 0?{}:{actor:input.origin.actor},...input.from===void 0?{}:{from:`${input.from.provider}/${input.from.id}`},to:`${input.to.provider}/${input.to.id}`,duringTurn:input.duringTurn,persistDefault:input.persistDefault}}import{join as join21}from"node:path";var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{chmodSync,existsSync as existsSync5,mkdirSync as mkdirSync3,readFileSync as readFileSync5,renameSync as renameSync2,rmSync,statSync as statSync5,writeFileSync as writeFileSync3}from"fs";import{dirname as dirname15,join as join18}from"path";function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error2=new Error("The operation was aborted");return error2.name="AbortError",error2}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal?signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve55,reject)=>{let settled2=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled2||(settled2=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled2||(settled2=!0,cleanup(),resolve55(value))},error2=>{settled2||(settled2=!0,cleanup(),reject(error2))}),signal.aborted&&onAbort()}):operation}function isPlainObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isOAuthGrant(value){return typeof value.access=="string"&&typeof value.refresh=="string"&&typeof value.expires=="number"}function isKeySlot(value){return typeof value.key=="string"&&value.access===void 0&&value.refresh===void 0}function isSlotList(value){return Array.isArray(value)&&value.every(isPlainObject)}function readSource(entry2){if(entry2.accounts===void 0)return isOAuthGrant(entry2)?{grants:[entry2],keySlots:[],pooled:!1,pinned:void 0}:"it holds no complete OAuth grant";if(!isSlotList(entry2.accounts))return"its accounts list is not a list of account objects";let slotGrants=entry2.accounts.filter(isOAuthGrant),keySlots=entry2.accounts.filter(isKeySlot);if(slotGrants.length+keySlots.length!==entry2.accounts.length)return"an account in it is neither a complete OAuth grant nor an API key";let grants=isOAuthGrant(entry2)&&!slotGrants.some(slot2=>slot2.refresh===entry2.refresh)?[...slotGrants,{...entry2,name:void 0}]:slotGrants;return grants.length===0?"it holds no complete OAuth grant":{grants,keySlots,pooled:!0,pinned:entry2.pinned}}function readSubscription(stored){return stored===void 0?emptyCredential():isPlainObject(stored)?stored.accounts===void 0?stored:!isSlotList(stored.accounts)||!stored.accounts.every(slot2=>typeof slot2.name=="string")?"the existing anthropic-subscription accounts are not account objects":stored:"the existing anthropic-subscription entry is not an object"}function importedSlotName(slot2,pooled,taken){let base=pooled&&typeof slot2.name=="string"&&slot2.name?`imported-anthropic-${slot2.name}`:"imported-anthropic",name=base.slice(0,64);for(let suffix=2;taken.has(name);suffix++)name=`${base.slice(0,58)}-${suffix}`;return name}function remainingApiKeyEntry(keySlots,pinned){let accounts=keySlots,pinnedSlot=typeof pinned=="string"?accounts.find(slot2=>slot2.name===pinned):void 0,key=(pinnedSlot??accounts[0])?.key;if(key!==void 0)return{type:"api_key",key,accounts,...pinnedSlot?{pinned:pinnedSlot.name}:{}}}var IMPORTED_GRANTS_FIELD="importedToSubscription";function importedDigests(entry2){let recorded=entry2[IMPORTED_GRANTS_FIELD];return new Set(Array.isArray(recorded)?recorded.filter(digest3=>typeof digest3=="string"):[])}function copyGrants(data,entry2,source2,subscription,unrecorded){let accounts=[...subscription.accounts??[]],taken=new Set(accounts.map(slot2=>slot2.name)),pinned=subscription.pinned;for(let grant of unrecorded){let digest3=authGrantDigest(grant.refresh),account=accounts.find(slot2=>slot2.refresh===grant.refresh||slot2.importedFrom===digest3);if(!account){let name=importedSlotName(grant,source2.pooled,taken);taken.add(name);let displayName=typeof grant.displayName=="string"?{displayName:grant.displayName}:{};account={name,...displayName,access:grant.access,refresh:grant.refresh,expires:grant.expires,source:"import",importedFrom:digest3},accounts.push(account)}pinned===void 0&&typeof grant.name=="string"&&grant.name===source2.pinned&&(pinned=account.name)}let recorded=[...new Set([...importedDigests(entry2),...source2.grants.map(grant=>authGrantDigest(grant.refresh))])];return{...data,anthropic:Object.assign({},data.anthropic,{[IMPORTED_GRANTS_FIELD]:recorded}),[ANTHROPIC_SUBSCRIPTION_PROVIDER_ID]:{...subscription,accounts,...pinned===void 0?{}:{pinned}}}}function migrate(data){let entry2=data.anthropic;if(!isPlainObject(entry2)||entry2.type!=="oauth")return{data,migrated:!1};let source2=readSource(entry2);if(typeof source2=="string")return{data,migrated:!1,skipped:source2};let subscription=readSubscription(data[ANTHROPIC_SUBSCRIPTION_PROVIDER_ID]);if(typeof subscription=="string")return{data,migrated:!1,skipped:subscription};let recorded=importedDigests(entry2),unrecorded=source2.grants.filter(grant=>!recorded.has(authGrantDigest(grant.refresh)));if(unrecorded.length>0)return{data:copyGrants(data,entry2,source2,subscription,unrecorded),migrated:!0};let next={...data},remaining=remainingApiKeyEntry(source2.keySlots,source2.pinned);return remaining?next.anthropic=remaining:delete next.anthropic,{data:next,migrated:!0}}function migrateAnthropicOAuthToSubscription(data){try{return migrate(data)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);return{data,migrated:!1,skipped:`it could not be read (${reason})`}}}import{dirname as dirname14}from"node:path";function assertKeyShape(value,field3){if(typeof value=="object"&&value!==null&&!isConfigReference(value))throw new ConfigReferenceError(field3,value,"malformed")}function assertCredentialReferences(providerId,credential){if("type"in credential&&credential.type==="api_key"&&"key"in credential&&assertKeyShape(credential.key,`${providerId}.key`),!(!("accounts"in credential)||!Array.isArray(credential.accounts)))for(let[index,account]of credential.accounts.entries())typeof account=="object"&&account!==null&&"key"in account&&assertKeyShape(account.key,`${providerId}.accounts.${index}.key`)}function resolveStoredReference(reference3,source2){let context=source2.authPath===void 0?void 0:{origin:source2.authPath,baseDir:dirname14(source2.authPath),authority:"trusted",field:source2.field};return resolveConfigReference(reference3,context,source2.env&&{...process.env,...source2.env})}function validateReadOnlyAuthData(parsed){if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new Error("Invalid auth.json: expected an object");for(let[providerId,credential]of Object.entries(parsed)){if(typeof credential!="object"||credential===null||Array.isArray(credential))throw new Error(`Invalid auth.json credential for provider "${providerId}"`);assertCredentialReferences(providerId,credential);let value=credential;if(value.type==="api_key"){let validKey=value.key===void 0||typeof value.key=="string"||isConfigReference(value.key),validEnv=value.env===void 0||typeof value.env=="object"&&value.env!==null&&!Array.isArray(value.env)&&Object.values(value.env).every(entry2=>typeof entry2=="string");if(validKey&&validEnv)continue}else if(value.type==="oauth"&&typeof value.access=="string"&&typeof value.refresh=="string"&&typeof value.expires=="number"&&Number.isFinite(value.expires))continue;throw new Error(`Invalid auth.json credential for provider "${providerId}"`)}}async function resolveReadOnlyCredential(credential,providerId,authPath){if(!credential)return;let key=credential.type==="api_key"?credential.key:void 0;if(credential.type==="api_key"&&isConfigReference(key)){let field3=`${providerId}.key`;return{...credential,key:await resolveStoredReference(key,{field:field3,authPath,env:credential.env})}}return credential.type!=="api_key"||!credential.key||isCommandConfigValue(credential.key)?structuredClone(credential):{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async function resolveStoredCredential(credential,providerId,authPath){if(credential?.type!=="api_key"||(assertCredentialReferences(providerId,credential),credential.key===void 0))return credential;let key=credential.key;if(isConfigReference(key)){let field3=`${providerId}.key`;return{...credential,key:await resolveStoredReference(key,{field:field3,authPath,env:credential.env})}}return{...credential,key:await resolveConfigValue(credential.key,credential.env)}}async function resolveStoredSlot(credential,slot2,readFlat){if(credential===void 0)return;assertCredentialReferences(slot2.providerId,credential);let accounts="accounts"in credential&&Array.isArray(credential.accounts)?credential.accounts:[];if(accounts.length===0)return projectSlot(await readFlat(credential),slot2.slotName);let projected=projectSlot(credential,slot2.slotName),key=projected?.type==="api_key"?projected.key:void 0;if(projected?.type!=="api_key"||!isConfigReference(key))return projected;let index=accounts.findIndex(account=>typeof account=="object"&&account!==null&&"name"in account&&account.name===slot2.slotName),field3=`${slot2.providerId}.accounts.${index}.key`;return{...projected,key:await resolveStoredReference(key,{field:field3,authPath:slot2.authPath,env:projected.env})}}function isPlainObject2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function migrateLegacyProviderKeys(data){let next;for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacy=data[legacyId];isPlainObject2(legacy)&&(next??={...data},delete next[legacyId],next[canonicalId]===void 0&&(next[canonicalId]=legacy))}return next?{data:next,migrated:!0}:{data,migrated:!1}}function repairPoisonedPoolSlots(data){let repaired;for(let[providerId,credential]of Object.entries(data)){if(typeof credential!="object"||credential===null)continue;let healed=repairManagedSentinelSlots(providerId,credential);healed&&(repaired??={...data},repaired[providerId]=healed)}return repaired?{data:repaired,repaired:!0}:{data,repaired:!1}}var KIND_LABEL={oauth:"OAuth login",api_key:"API key"};function unusedLoginNotices(data){let notices=[];for(let[provider,credential]of Object.entries(data))if(!(typeof credential!="object"||credential===null))for(let kind of unusedSlotKinds(credential)){let slots=listSlots(credential).filter(slot2=>slotKind(slot2)===kind),inUse=KIND_LABEL[credential.type],names=slots.map(slot2=>slot2.name);notices.push({id:`${provider}:${kind}:${names.join(",")}`,provider,message:`${provider}: an ${KIND_LABEL[kind]} saved earlier is stored next to your ${inUse} but is never used; the ${inUse} stays in use. It is still in auth.json (${slots.map(slot2=>slot2.name).join(", ")}); to switch to it, save it again with /login (the ${inUse} is backed up first).`})}return notices}function describeCredentialReplacement(provider,replacement){let where=replacement.backupPath?` It is saved in ${replacement.backupPath}`:" It was not backed up";return`Your ${KIND_LABEL[replacement.replaced]} for ${provider} was replaced by this login.${where}; to switch back, log in with it again.`}var AUTH_FILE_WRITE_OPTIONS={encoding:"utf-8",mode:384},sharedAuthFileReadState,FileAuthStorageBackend=class{constructor(authPath=join18(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}ensureParentDir(){let dir=dirname15(this.authPath);existsSync5(dir)||mkdirSync3(dir,{recursive:!0,mode:448})}ensureFileExists(){existsSync5(this.authPath)||writeFileSync3(this.authPath,"{}",AUTH_FILE_WRITE_OPTIONS)}writeAuthFile(content){let temporary=`${this.authPath}.${process.pid}.tmp`;try{writeFileSync3(temporary,content,AUTH_FILE_WRITE_OPTIONS),existsSync5(this.authPath)&&chmodSync(temporary,statSync5(this.authPath).mode&511),renameSync2(temporary,this.authPath)}catch(error2){try{rmSync(temporary,{force:!0})}catch{}throw error2}}acquireLockSyncWithRetry(path14){let startedAt=Date.now(),attempt2=0;for(;;)try{return import_proper_lockfile.default.lockSync(path14,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error2){if(!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path14,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt2++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}withLock(fn){this.ensureParentDir(),this.ensureFileExists();let release4;try{release4=this.acquireLockSyncWithRetry(this.authPath);let current=existsSync5(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=fn(current);return next!==void 0&&this.writeAuthFile(next),result3}finally{release4&&release4()}}async acquireLockAsync(signal,onCompromised){signal?.throwIfAborted();let startedAt=Date.now(),attempt2=0;for(;;)try{let{release:release4}=await lockWithLossHandling(this.authPath,{...FILE_STORAGE_LOCK_OPTIONS,retries:0,onLost:onCompromised});return signal?.aborted&&(await release4(),signal.throwIfAborted()),release4}catch(error2){if(signal?.throwIfAborted(),!isLockError(error2))throw error2;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(this.authPath,waitedMs,error2);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt2,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt2++,await raceWithAbortSignal(new Promise(resolve55=>setTimeout(resolve55,delayMs)),signal)}}async withLockAsync(fn,options){options?.signal?.throwIfAborted(),this.ensureParentDir(),this.ensureFileExists();let release4,lockCompromised=!1,lockCompromisedError,throwIfCompromised=()=>{if(lockCompromised)throw lockCompromisedError??new Error("Auth storage lock was compromised")};try{release4=await this.acquireLockAsync(options?.signal,error2=>{lockCompromised=!0,lockCompromisedError=error2}),throwIfCompromised(),options?.signal?.throwIfAborted();let current=existsSync5(this.authPath)?readFileSync5(this.authPath,"utf-8"):void 0,{result:result3,next}=await fn(current);return throwIfCompromised(),options?.signal?.throwIfAborted(),next!==void 0&&this.writeAuthFile(next),throwIfCompromised(),result3}finally{if(release4)try{await release4()}catch{}}}},ReadOnlyAuthStorage=class{constructor(authPath=join18(getAgentDir(),"auth.json")){this.authPath=normalizePath(authPath)}load(){if(this.data)return this.data;let parsed;try{parsed=JSON.parse(stripBom(readFileSync5(this.authPath,"utf-8")))}catch(error2){if(error2.code==="ENOENT")return this.data={},this.data;throw new Error(`Failed to read auth.json: ${error2 instanceof Error?error2.message:String(error2)}`)}return validateReadOnlyAuthData(parsed),this.data=repairPoisonedPoolSlots(parsed).data,this.data}async read(providerId,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);return options?.signal?.throwIfAborted(),resolveReadOnlyCredential(credential,providerId,this.authPath)}async readSlot(providerId,slotName,options){options?.signal?.throwIfAborted();let credential=readByProviderId(this.load(),providerId);return options?.signal?.throwIfAborted(),resolveStoredSlot(credential,{providerId,slotName,authPath:this.authPath},flat=>resolveReadOnlyCredential(flat,providerId,this.authPath))}async list(options){options?.signal?.throwIfAborted();let credentials=Object.entries(this.load()).map(([providerId,credential])=>({providerId,type:credential.type}));return options?.signal?.throwIfAborted(),credentials}async modify(_providerId,_fn,_options){throw new Error("Read-only credential storage cannot modify auth.json")}async delete(_providerId,_options){throw new Error("Read-only credential storage cannot modify auth.json")}},InMemoryAuthStorageBackend=class{constructor(){this.asyncChain=Promise.resolve()}withLock(fn){let{result:result3,next}=fn(this.value);return next!==void 0&&(this.value=next),result3}withLockAsync(fn,options){let previous=this.asyncChain,operation=(async()=>{await previous.catch(()=>{}),options?.signal?.throwIfAborted();let{result:result3,next}=await fn(this.value);return options?.signal?.throwIfAborted(),next!==void 0&&(this.value=next),result3})();return this.asyncChain=operation.catch(()=>{}),raceWithAbortSignal(operation,options?.signal)}},AuthStorage=class _AuthStorage{constructor(storage,authPath){if(this.data={},this.runtimeOverrides=new Map,this.extensionOAuthProviders=new Map,this.errors=[],this.reportedMigrationSkips=new Set,this.notices=[],this.seenInMemory=new Set,this.takenNotices=new Set,this.replacements=new Map,this.busyReads=0,this.dataLoaded=!1,this.dataFromBusyRead=!1,this.storage=storage,this.authPath=authPath,this.readState=authPath&&sharedAuthFileReadState?.authPath===authPath?sharedAuthFileReadState.readState:{data:{}},authPath&&!sharedAuthFileReadState&&(sharedAuthFileReadState={authPath,readState:this.readState}),authPath&&this.readState.loaded){this.data=this.readState.data,this.dataLoaded=!0;let revision=getFileContentRevision(authPath);if(revision!==void 0&&revision===this.readState.revision)return}this.reload()}static create(authPath=join18(getAgentDir(),"auth.json")){let normalizedAuthPath=normalizePath(authPath);return new _AuthStorage(new FileAuthStorageBackend(normalizedAuthPath),normalizedAuthPath)}getStoragePath(){return this.authPath}static fromStorage(storage){return new _AuthStorage(storage)}static inMemory(data={}){let storage=new InMemoryAuthStorageBackend;return storage.withLock(()=>({result:void 0,next:JSON.stringify(data,null,2)})),_AuthStorage.fromStorage(storage)}parseStorageData(content){return content?repairPoisonedPoolSlots(JSON.parse(stripBom(content))).data:{}}parseStorageContent(content){if(!content)return{data:{},repaired:!1,migrated:!1};let repaired=repairPoisonedPoolSlots(JSON.parse(stripBom(content))),migrated=migrateLegacyProviderKeys(repaired.data),moved=migrateAnthropicOAuthToSubscription(migrated.data);return moved.skipped&&!this.reportedMigrationSkips.has(moved.skipped)&&(this.reportedMigrationSkips.add(moved.skipped),this.recordError(new Error(`The Anthropic Claude subscription login in auth.json was not moved to Anthropic Subscription because ${moved.skipped}. It was left unchanged; sign in again with /login and choose "Anthropic Subscription (Claude Pro/Max)".`))),this.notices=unusedLoginNotices(moved.data),{data:moved.data,repaired:repaired.repaired,migrated:migrated.migrated||moved.migrated}}recordError(error2){this.errors.push(error2 instanceof Error?error2:new Error(String(error2)))}backupAuthFile(content){if(!this.authPath||content===void 0)return;let stamp=new Date().toISOString().replace(/[:.]/g,"-"),backupPath=`${this.authPath}.backup-${stamp}`;for(let attempt2=1;existsSync5(backupPath);attempt2++)backupPath=`${this.authPath}.backup-${stamp}-${attempt2}`;return writeFileSync3(backupPath,content,AUTH_FILE_WRITE_OPTIONS),backupPath}updateReadState(data,revision){this.data=data,this.dataLoaded=!0,this.dataFromBusyRead=!1,this.readState.data=data,this.readState.loaded=!0,this.readState.revision=revision}reload(){let data={},revision;try{return this.storage.withLock(current=>{let parsed=this.parseStorageContent(current);return data=parsed.data,revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath),parsed.migrated&&this.backupAuthFile(current),parsed.repaired||parsed.migrated?{result:void 0,next:JSON.stringify(parsed.data,null,2)}:{result:void 0}}),this.updateReadState(data,revision),"loaded"}catch(error2){return this.recordError(error2 instanceof Error?error2:new Error(String(error2))),error2 instanceof CredentialStoreBusyError?(this.dataLoaded||(this.busyReads++,this.dataFromBusyRead=!0),"busy"):"failed"}}isCredentialStoreBusy(){return this.dataFromBusyRead}getBusyReadCount(){return this.busyReads}noteBusyFallback(error2){error2 instanceof CredentialStoreBusyError&&!this.readState.loaded&&this.busyReads++}setRuntimeApiKey(provider,apiKey){this.runtimeOverrides.set(provider,apiKey)}removeRuntimeApiKey(provider){this.runtimeOverrides.delete(provider)}get(provider){return readByProviderId(this.data,provider)}getProviderEnv(provider){let credential=readByProviderId(this.data,provider);return credential?.type==="api_key"&&credential.env?{...credential.env}:void 0}set(provider,credential){return this.storage.withLock(content=>{let currentData=this.parseStorageData(content),replacement=this.noteReplacement(provider,currentData[provider],credential,content),next=appendLoginSlot(currentData[provider],credential),nextData={...currentData,[provider]:next};return this.data=nextData,{result:replacement,next:JSON.stringify(nextData,null,2)}})}takeReplacement(provider){let replacement=this.replacements.get(provider);return this.replacements.delete(provider),replacement}pendingNotices(){let seen=this.seenNoticeIds();return this.notices.filter(notice2=>!seen.has(notice2.id))}takePendingNotices(options){let taken=this.pendingNotices().filter(notice2=>!this.takenNotices.has(notice2.id));for(let notice2 of taken)this.takenNotices.add(notice2.id);return options.persistSeen&&this.markNoticesSeen(taken.map(notice2=>notice2.id)),taken}markNoticesSeen(ids){if(ids.length===0)return;let path14=this.seenNoticesPath();if(!path14){for(let id of ids)this.seenInMemory.add(id);return}let current=new Set(this.notices.map(notice2=>notice2.id)),seen=[...new Set([...this.seenNoticeIds(),...ids])].filter(id=>current.has(id));try{writeFileSync3(path14,JSON.stringify(seen,null,2),AUTH_FILE_WRITE_OPTIONS)}catch(error2){let reason=error2 instanceof Error?error2.message:String(error2);this.recordError(new Error(`Could not record which credential notices were shown (${path14}): ${reason}. They may be shown again on the next start; check that the file is writable.`))}}seenNoticesPath(){return this.authPath?join18(dirname15(this.authPath),"auth-notices-seen.json"):void 0}seenNoticeIds(){let path14=this.seenNoticesPath();if(!path14)return new Set(this.seenInMemory);try{let parsed=JSON.parse(readFileSync5(path14,"utf-8"));return new Set(Array.isArray(parsed)?parsed.filter(id=>typeof id=="string"):[])}catch{return new Set}}noteReplacement(provider,previous,next,content){if(previous===void 0||previous.type===next.type)return;let backupPath=this.backupAuthFile(content),replacement=backupPath?{replaced:previous.type,backupPath}:{replaced:previous.type};return this.replacements.set(provider,replacement),replacement}remove(provider){this.storage.withLock(content=>{let nextData={...this.parseStorageData(content)};return delete nextData[provider],this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}listSlots(provider){return listSlots(readByProviderId(this.data,provider))}setSlot(provider,slot2){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=upsertSlot(currentData[provider],slot2),nextData={...currentData,[provider]:next};return this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}removeSlot(provider,name){this.storage.withLock(content=>{let currentData=this.parseStorageData(content),next=removeSlot(currentData[provider],name),nextData={...currentData};return next===void 0?delete nextData[provider]:nextData[provider]=next,this.data=nextData,{result:void 0,next:JSON.stringify(nextData,null,2)}})}has(provider){return provider in this.data}hasAuth(provider){return this.runtimeOverrides.has(provider)||this.has(provider)||getEnvApiKey(provider)!==void 0}getAuthStatus(provider){if(this.has(provider))return{configured:!0,source:"stored"};if(this.runtimeOverrides.has(provider))return{configured:!0,source:"runtime",label:"--api-key"};let envName=findEnvKeys(provider)?.[0];return envName&&process.env[envName]?{configured:!0,source:"environment",label:envName}:{configured:!1}}getAll(){return{...this.data}}drainErrors(){let errors=this.errors;return this.errors=[],errors}async reloadFromStorageAsync(options){return this.storage.withLockAsync(async content=>{let parsed=this.parseStorageContent(content),revision=parsed.repaired||parsed.migrated||!this.authPath?void 0:getFileContentRevision(this.authPath);return this.updateReadState(parsed.data,revision),parsed.migrated&&this.backupAuthFile(content),parsed.repaired||parsed.migrated?{result:parsed.data,next:JSON.stringify(parsed.data,null,2)}:{result:parsed.data}},options)}async readLatestData(options){if(options?.signal?.throwIfAborted(),!this.authPath)try{return await this.reloadFromStorageAsync(options)}catch(error2){return options?.signal?.throwIfAborted(),this.recordError(error2),this.noteBusyFallback(error2),this.readState.data}let revision=getFileContentRevision(this.authPath);if(revision!==void 0&&revision===this.readState.revision)return this.readState.data;if(!this.readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorageAsync({signal:controller.signal}),readers:0};this.readState.reload=reload2,reload2.promise.then(()=>{this.readState.reload===reload2&&(this.readState.reload=void 0)},error2=>{controller.signal.aborted||this.recordError(error2),this.readState.reload===reload2&&(this.readState.reload=void 0)})}let reload=this.readState.reload;reload.readers++;try{try{return await raceWithAbortSignal(reload.promise,options?.signal)}catch(error2){return options?.signal?.throwIfAborted(),this.noteBusyFallback(error2),this.readState.data}}finally{reload.readers--,reload.readers===0&&this.readState.reload===reload&&(this.readState.reload=void 0,reload.controller.abort())}}async read(provider,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return{type:"api_key",key:runtimeKey};let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),resolveStoredCredential(credential,provider,this.authPath)}async readSlot(provider,slotName,options){options?.signal?.throwIfAborted();let runtimeKey=this.runtimeOverrides.get(provider);if(runtimeKey)return projectSlot({type:"api_key",key:runtimeKey},slotName);let credential=(await this.readLatestData(options))[provider];return options?.signal?.throwIfAborted(),resolveStoredSlot(credential,{providerId:provider,slotName,authPath:this.authPath},flat=>resolveStoredCredential(flat,provider,this.authPath))}async modify(provider,fn,options){let latestData=this.readState.data,revision,result3=await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content),next=await fn(currentData[provider]);if(next===void 0)return latestData=currentData,revision=this.authPath?getFileContentRevision(this.authPath):void 0,{result:currentData[provider]};this.noteReplacement(provider,currentData[provider],next,content);let merged={...currentData,[provider]:next};return latestData=merged,{result:next,next:JSON.stringify(merged,null,2)}},options);return this.updateReadState(latestData,revision),result3}async delete(provider,options){options?.signal?.throwIfAborted(),this.runtimeOverrides.delete(provider);let latestData=this.readState.data;await this.storage.withLockAsync(async content=>{let currentData=this.parseStorageData(content);return delete currentData[provider],latestData=currentData,{result:void 0,next:JSON.stringify(currentData,null,2)}},options),this.updateReadState(latestData)}async list(options){let entries=new Map(Object.entries(await this.readLatestData(options)).map(([providerId,credential])=>[providerId,{providerId,type:credential.type}]));options?.signal?.throwIfAborted();for(let providerId of this.runtimeOverrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}async getApiKey(providerId,options={}){let runtimeKey=this.runtimeOverrides.get(providerId);if(runtimeKey)return runtimeKey;let credential=await this.read(providerId);if(credential?.type==="api_key")return credential.key;if(credential?.type==="oauth"){let oauth=builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)return;let current=credential;if(Date.now()>=current.expires){let refreshed=await this.modify(providerId,async stored=>stored?.type!=="oauth"||Date.now()<stored.expires?stored:oauth.refresh(stored,new AbortController().signal));if(refreshed?.type!=="oauth")return;current=refreshed}return(await oauth.toAuth(current)).apiKey}if(options.includeFallback!==!1)return getEnvApiKey(providerId)}registerOAuthProvider(providerId,oauth){this.extensionOAuthProviders.set(providerId,oauth)}unregisterOAuthProvider(providerId){this.extensionOAuthProviders.delete(providerId)}getOAuthProviders(){let dynamic=[...this.extensionOAuthProviders.entries()].map(([id,oauth])=>({id,name:oauth.name})),builtin=builtinProviders().flatMap(provider=>provider.auth.oauth&&!this.extensionOAuthProviders.has(provider.id)?[{id:provider.id,name:provider.auth.oauth.name}]:[]);return[...dynamic,...builtin]}async login(providerId,callbacks){let oauth=this.extensionOAuthProviders.get(providerId)??builtinProviders().find(provider=>provider.id===providerId)?.auth.oauth;if(!oauth)throw new Error(`Unknown OAuth provider: ${providerId}`);let interaction={signal:callbacks.signal??new AbortController().signal,prompt:prompt=>this.handleLegacyPrompt(prompt,callbacks),notify:event=>this.handleLegacyEvent(event,callbacks)},credential=await oauth.login(interaction);this.set(providerId,credential)}logout(provider){this.removeRuntimeApiKey(provider),this.remove(provider)}handleLegacyPrompt(prompt,callbacks){switch(prompt.type){case"manual_code":return callbacks.onManualCodeInput?.()??callbacks.onPrompt(prompt);case"select":return callbacks.onSelect(prompt).then(value=>{if(value===void 0)throw new Error("Login cancelled");return value});case"secret":case"text":return callbacks.onPrompt(prompt)}}handleLegacyEvent(event,callbacks){switch(event.type){case"auth_url":callbacks.onAuth(event);break;case"device_code":callbacks.onDeviceCode(event);break;case"info":callbacks.onProgress?.(event.message);break;case"progress":callbacks.onProgress?.(event.message);break}}};function readStoredCredential(providerId,authPath=join18(getAgentDir(),"auth.json")){try{let data=JSON.parse(stripBom(readFileSync5(normalizePath(authPath),"utf-8")));return readByProviderId(data,providerId)}catch{return}}import{dirname as dirname17,join as join20}from"node:path";import{mkdirSync as mkdirSync4,readFileSync as readFileSync6,renameSync as renameSync3,writeFileSync as writeFileSync4}from"node:fs";import{dirname as dirname16}from"node:path";var CACHE_FILE="claude-code-version.json";function resolveClaudeCodeVersionCachePath(env=process.env){return`${(env.SENPI_CODING_AGENT_DIR??env.CODING_AGENT_DIR??`${(env.HOME??".").replace(/\/$/,"")}/.senpi/agent`).replace(/\/$/,"")}/${CACHE_FILE}`}function isCachedVersion(value){return typeof value=="object"&&value!==null&&typeof value.version=="string"&&typeof value.checkedAt=="number"}function createClaudeCodeVersionFileStore(path14){let savingEnabled=!0;return{load:()=>{let parsed;try{parsed=JSON.parse(readFileSync6(path14,"utf8"))}catch{return}return isCachedVersion(parsed)?parsed:void 0},save:record10=>{if(savingEnabled)try{mkdirSync4(dirname16(path14),{recursive:!0});let temporaryPath=`${path14}.${process.pid}.tmp`;writeFileSync4(temporaryPath,`${JSON.stringify(record10)}
|
|
153
153
|
`),renameSync3(temporaryPath,path14)}catch{savingEnabled=!1}}}}function installClaudeCodeVersionFileStore(options={}){let env=process.env,offline=options.offline??(env.PI_OFFLINE!==void 0&&env.PI_OFFLINE!==""&&env.PI_OFFLINE!=="0");installClaudeCodeVersionStore(createClaudeCodeVersionFileStore(options.path??resolveClaudeCodeVersionCachePath(env)),{offline})}var REFUSED_AFTER_REEXCHANGE="A freshly re-exchanged token for this account was refused as well; log in to this account again or switch accounts.";function refusesToken(event,statuses){if(event.type!=="error"||event.reason!=="error")return!1;let status=event.error.providerDiagnostic?.httpStatus;return status!==void 0&&statuses.includes(status)}async function*markRefusalAfterReexchange(stream2,statuses){let committed=!1;for await(let event of stream2)!committed&&event.type==="error"&&refusesToken(event,statuses)&&(event.error.errorMessage=`${event.error.errorMessage??"provider stream error"}
|
|
154
154
|
${REFUSED_AFTER_REEXCHANGE}`),committed||=isCommittedRotationOutput(event),yield event}async function retryOnceOnRejectedToken(attempt2){let first=await attempt2(void 0),statuses=first.rejectedTokenStatuses??[],rejectedAccess=first.rejectableAccess;if(rejectedAccess===void 0||statuses.length===0)return first.stream;let final=first.stream;async function*events(){let iterator=first.stream[Symbol.asyncIterator](),held=[];try{for(;;){let next=await iterator.next();if(next.done){yield*held;return}let event=next.value;if(refusesToken(event,statuses)){await iterator.return?.(void 0);let retried=await attempt2(rejectedAccess);final=retried.stream,yield*markRefusalAfterReexchange(retried.stream,statuses);return}if(isCommittedRotationOutput(event)){yield*held,yield event;break}held.push(event)}yield*{[Symbol.asyncIterator]:()=>iterator}}finally{await iterator.return?.(void 0)}}let source2=events();return typeof first.stream.result=="function"&&(source2.result=()=>final.result?.()??Promise.reject(new Error("provider stream has no result"))),source2}import{readFileSync as readFileSync8}from"node:fs";import{readFile as readFile2}from"node:fs/promises";function stripJsonComments(input){return input.replace(/"(?:\\.|[^"\\])*"|\/\/[^\n]*/g,m=>m[0]==='"'?m:"").replace(/"(?:\\.|[^"\\])*"|,(\s*[}\]])/g,(m,tail)=>tail??(m[0]==='"'?m:""))}var CredentialSlotRefSchema=typebox_exports.Object({env:typebox_exports.Optional(typebox_exports.String({minLength:1})),value:typebox_exports.Optional(NonemptyConfigValueSchema)},{additionalProperties:!1}),CredentialPolicySchema=typebox_exports.Object({rotation:typebox_exports.Optional(typebox_exports.Boolean()),affinity:typebox_exports.Optional(typebox_exports.Boolean()),cooldownBaseMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),cooldownCapMs:typebox_exports.Optional(typebox_exports.Number({minimum:0})),slots:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String({minLength:1}),CredentialSlotRefSchema))},{additionalProperties:!1});var ThinkingLevelMapValueSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]),ThinkingLevelMapSchema=typebox_exports.Object({off:typebox_exports.Optional(ThinkingLevelMapValueSchema),minimal:typebox_exports.Optional(ThinkingLevelMapValueSchema),low:typebox_exports.Optional(ThinkingLevelMapValueSchema),medium:typebox_exports.Optional(ThinkingLevelMapValueSchema),high:typebox_exports.Optional(ThinkingLevelMapValueSchema),xhigh:typebox_exports.Optional(ThinkingLevelMapValueSchema),max:typebox_exports.Optional(ThinkingLevelMapValueSchema)}),ThinkingLevelSchema=typebox_exports.Union([typebox_exports.Literal("off"),typebox_exports.Literal("minimal"),typebox_exports.Literal("low"),typebox_exports.Literal("medium"),typebox_exports.Literal("high"),typebox_exports.Literal("xhigh"),typebox_exports.Literal("max")]);var PercentileCutoffsSchema=typebox_exports.Object({p50:typebox_exports.Optional(typebox_exports.Number()),p75:typebox_exports.Optional(typebox_exports.Number()),p90:typebox_exports.Optional(typebox_exports.Number()),p99:typebox_exports.Optional(typebox_exports.Number())}),OpenRouterRoutingSchema=typebox_exports.Object({allow_fallbacks:typebox_exports.Optional(typebox_exports.Boolean()),require_parameters:typebox_exports.Optional(typebox_exports.Boolean()),data_collection:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("deny"),typebox_exports.Literal("allow")])),zdr:typebox_exports.Optional(typebox_exports.Boolean()),enforce_distillable_text:typebox_exports.Optional(typebox_exports.Boolean()),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),ignore:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),quantizations:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),sort:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Object({by:typebox_exports.Optional(typebox_exports.String()),partition:typebox_exports.Optional(typebox_exports.Union([typebox_exports.String(),typebox_exports.Null()]))})])),max_price:typebox_exports.Optional(typebox_exports.Object({prompt:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),completion:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),image:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),audio:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()])),request:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),typebox_exports.String()]))})),preferred_min_throughput:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema])),preferred_max_latency:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Number(),PercentileCutoffsSchema]))}),VercelGatewayRoutingSchema=typebox_exports.Object({only:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String())),order:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String()))}),ChatTemplateKwargScalarSchema=typebox_exports.Union([typebox_exports.String(),typebox_exports.Number(),typebox_exports.Boolean(),typebox_exports.Null()]),ChatTemplateKwargVariableSchema=typebox_exports.Object({$var:typebox_exports.Union([typebox_exports.Literal("thinking.enabled"),typebox_exports.Literal("thinking.effort")]),omitWhenOff:typebox_exports.Optional(typebox_exports.Boolean())}),ChatTemplateKwargSchema=typebox_exports.Union([ChatTemplateKwargScalarSchema,ChatTemplateKwargVariableSchema]),ModelCostRatesSchema={input:typebox_exports.Number(),output:typebox_exports.Number(),cacheRead:typebox_exports.Number(),cacheWrite:typebox_exports.Number()},ModelCostTierSchema=typebox_exports.Object({inputTokensAbove:typebox_exports.Number(),...ModelCostRatesSchema}),ModelCostSchema=typebox_exports.Object({...ModelCostRatesSchema,tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))}),ModelPromptCacheSchema=typebox_exports.Object({short:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0})),long:typebox_exports.Optional(typebox_exports.Number({exclusiveMinimum:0}))}),ImageResizeSchema=typebox_exports.Object({maxWidth:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxHeight:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),jpegQuality:typebox_exports.Optional(typebox_exports.Integer({minimum:1,maximum:100}))}),ModelInputLimitsSchema=typebox_exports.Object({maxRequestBytes:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),images:typebox_exports.Optional(typebox_exports.Object({resize:typebox_exports.Optional(ImageResizeSchema),maxPerMessage:typebox_exports.Optional(typebox_exports.Integer({minimum:1})),maxPerRequest:typebox_exports.Optional(typebox_exports.Integer({minimum:1}))}))}),OpenAICompletionsCompatSchema=typebox_exports.Object({supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean()),supportsStore:typebox_exports.Optional(typebox_exports.Boolean()),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),supportsReasoningEffort:typebox_exports.Optional(typebox_exports.Boolean()),supportsUsageInStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsFinishReason:typebox_exports.Optional(typebox_exports.Boolean()),maxTokensField:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("max_completion_tokens"),typebox_exports.Literal("max_tokens")])),requiresToolResultName:typebox_exports.Optional(typebox_exports.Boolean()),requiresAssistantAfterToolResult:typebox_exports.Optional(typebox_exports.Boolean()),requiresThinkingAsText:typebox_exports.Optional(typebox_exports.Boolean()),requiresReasoningContentOnAssistantMessages:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),thinkingFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openrouter"),typebox_exports.Literal("together"),typebox_exports.Literal("deepseek"),typebox_exports.Literal("zai"),typebox_exports.Literal("qwen"),typebox_exports.Literal("chat-template"),typebox_exports.Literal("qwen-chat-template"),typebox_exports.Literal("string-thinking"),typebox_exports.Literal("ant-ling")])),chatTemplateKwargs:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ChatTemplateKwargSchema)),cacheControlFormat:typebox_exports.Optional(typebox_exports.Literal("anthropic")),openRouterRouting:typebox_exports.Optional(OpenRouterRoutingSchema),vercelGatewayRouting:typebox_exports.Optional(VercelGatewayRoutingSchema),zaiToolStream:typebox_exports.Optional(typebox_exports.Boolean()),supportsStrictMode:typebox_exports.Optional(typebox_exports.Boolean()),toolCallFormat:typebox_exports.Optional(typebox_exports.String()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),deferredToolsMode:typebox_exports.Optional(typebox_exports.Literal("kimi")),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),OpenAIResponsesCompatSchema=typebox_exports.Object({webSearchToolType:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("web_search"),typebox_exports.Literal("web_search_preview")])),supportsDeveloperRole:typebox_exports.Optional(typebox_exports.Boolean()),sessionAffinityFormat:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("openai"),typebox_exports.Literal("openai-nosession"),typebox_exports.Literal("openrouter")])),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSocket:typebox_exports.Optional(typebox_exports.Boolean()),supportsRemoteCompactionV2:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearchPreview:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolSearch:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean())}),AnthropicMessagesCompatSchema=typebox_exports.Object({supportsEagerToolInputStreaming:typebox_exports.Optional(typebox_exports.Boolean()),supportsLongCacheRetention:typebox_exports.Optional(typebox_exports.Boolean()),sendSessionAffinityHeaders:typebox_exports.Optional(typebox_exports.Boolean()),supportsCacheControlOnTools:typebox_exports.Optional(typebox_exports.Boolean()),supportsDisabledThinking:typebox_exports.Optional(typebox_exports.Boolean()),supportsTemperature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),supportsForcedToolChoice:typebox_exports.Optional(typebox_exports.Boolean()),forceAdaptiveThinking:typebox_exports.Optional(typebox_exports.Boolean()),allowEmptySignature:typebox_exports.Optional(typebox_exports.Boolean()),supportsToolReferences:typebox_exports.Optional(typebox_exports.Boolean()),supportsWebSearch:typebox_exports.Optional(typebox_exports.Boolean()),allowedFallbackModels:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Object({provider:typebox_exports.String({minLength:1}),model:typebox_exports.String({minLength:1}),cost:ModelCostSchema}),{maxItems:3}))}),ProviderCompatSchema=typebox_exports.Union([OpenAICompletionsCompatSchema,OpenAIResponsesCompatSchema,AnthropicMessagesCompatSchema]),ExtraBodySchema=typebox_exports.Record(typebox_exports.String(),typebox_exports.Unknown()),ModelDefinitionSchema=typebox_exports.Object({id:typebox_exports.String({minLength:1}),name:typebox_exports.Optional(typebox_exports.String({minLength:1})),upstreamModelId:typebox_exports.Optional(typebox_exports.String({minLength:1})),serviceTier:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("auto"),typebox_exports.Literal("flex"),typebox_exports.Literal("priority"),typebox_exports.Literal("ultrafast")])),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),defaultThinkingLevel:typebox_exports.Optional(ThinkingLevelSchema),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(ModelCostSchema),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ModelOverrideSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),promptPreset:typebox_exports.Optional(typebox_exports.String({minLength:1})),recoverTextToolCalls:typebox_exports.Optional(typebox_exports.Boolean()),reasoning:typebox_exports.Optional(typebox_exports.Boolean()),thinkingLevelMap:typebox_exports.Optional(ThinkingLevelMapSchema),thinkingLevelMapMode:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("merge"),typebox_exports.Literal("replace")])),input:typebox_exports.Optional(typebox_exports.Array(typebox_exports.Union([typebox_exports.Literal("text"),typebox_exports.Literal("image"),typebox_exports.Literal("video")]))),inputLimits:typebox_exports.Optional(ModelInputLimitsSchema),cost:typebox_exports.Optional(typebox_exports.Object({input:typebox_exports.Optional(typebox_exports.Number()),output:typebox_exports.Optional(typebox_exports.Number()),cacheRead:typebox_exports.Optional(typebox_exports.Number()),cacheWrite:typebox_exports.Optional(typebox_exports.Number()),tiers:typebox_exports.Optional(typebox_exports.Array(ModelCostTierSchema))})),promptCache:typebox_exports.Optional(ModelPromptCacheSchema),contextWindow:typebox_exports.Optional(typebox_exports.Number()),maxTokens:typebox_exports.Optional(typebox_exports.Number()),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema)}),ProviderConfigSchema=typebox_exports.Object({name:typebox_exports.Optional(typebox_exports.String({minLength:1})),disabled:typebox_exports.Optional(typebox_exports.Boolean()),baseUrl:typebox_exports.Optional(typebox_exports.String({minLength:1})),apiKey:typebox_exports.Optional(NonemptyConfigValueSchema),api:typebox_exports.Optional(typebox_exports.String({minLength:1})),headers:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ConfigValueSchema)),extraBody:typebox_exports.Optional(ExtraBodySchema),cacheRetention:typebox_exports.Optional(typebox_exports.Union([typebox_exports.Literal("none"),typebox_exports.Literal("short"),typebox_exports.Literal("long")])),compat:typebox_exports.Optional(ProviderCompatSchema),authHeader:typebox_exports.Optional(typebox_exports.Boolean()),whitelist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),blacklist:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),hideFreeModels:typebox_exports.Optional(typebox_exports.Boolean()),models:typebox_exports.Optional(typebox_exports.Array(ModelDefinitionSchema)),modelOverrides:typebox_exports.Optional(typebox_exports.Record(typebox_exports.String(),ModelOverrideSchema)),credentials:typebox_exports.Optional(CredentialPolicySchema)}),ModelsConfigSchema=typebox_exports.Object({disabledProviders:typebox_exports.Optional(typebox_exports.Array(typebox_exports.String({minLength:1}))),providers:typebox_exports.Record(typebox_exports.String(),ProviderConfigSchema)}),validateModelsConfig=Compile(ModelsConfigSchema);function rememberModelReferenceOrigins(provider,origin,providerId){let remember=(value,field4)=>{value!==void 0&&rememberConfigReferenceOrigin(value,{origin,authority:"trusted",field:field4})},headers=(values,field4)=>{for(let[name,value]of Object.entries(values??{}))remember(value,`${field4}.${name}`)},field3=`providers.${providerId}`;remember(provider.apiKey,`${field3}.apiKey`),headers(provider.headers,`${field3}.headers`);for(let[index,model]of(provider.models??[]).entries())headers(model.headers,`${field3}.models.${index}.headers`);for(let[name,model]of Object.entries(provider.modelOverrides??{}))headers(model.headers,`${field3}.modelOverrides.${name}.headers`);for(let[name,slot2]of Object.entries(provider.credentials?.slots??{}))remember(slot2.value,`${field3}.credentials.slots.${name}.value`)}import{chmodSync as chmodSync2,existsSync as existsSync6,readFileSync as readFileSync7,renameSync as renameSync4,rmSync as rmSync2,statSync as statSync6,writeFileSync as writeFileSync5}from"node:fs";import{isDeepStrictEqual}from"node:util";var isRecord7=value=>typeof value=="object"&&value!==null&&!Array.isArray(value),JsoncSpanScanner=class{constructor(text3){this.text=text3}skipTrivia(from){let i=from;for(;i<this.text.length;){let c=this.text[i];if(c===" "||c===" "||c===`
|
|
155
155
|
`||c==="\r"||c==="\uFEFF")i++;else if(this.text.startsWith("//",i))i=this.lineEnd(i);else if(this.text.startsWith("/*",i))i=this.blockCommentEnd(i);else break}return i}value(from){let start=this.skipTrivia(from),c=this.text[start];if(c==="{")return this.object(start);if(c==="[")return this.array(start);if(c==='"')return{start,end:this.stringEnd(start)};let end=start;for(;end<this.text.length&&!/[\s,\]}/]/.test(this.text[end]??"");)end++;if(end===start)throw new Error(`unexpected character at offset ${start}`);return{start,end}}object(start){let members=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="}")return{start,end:i+1,members};if(c===","){i++;continue}if(c!=='"')throw new Error(`expected a key at offset ${i}`);let keySpan={start:i,end:this.stringEnd(i)},colon=this.skipTrivia(keySpan.end);if(this.text[colon]!==":")throw new Error(`expected ':' at offset ${colon}`);let value=this.value(colon+1);members.push({key:JSON.parse(this.text.slice(keySpan.start,keySpan.end)),keySpan,value}),i=value.end}}array(start){let elements=[],i=start+1;for(;;){i=this.skipTrivia(i);let c=this.text[i];if(c==="]")return{start,end:i+1,elements};if(c===","){i++;continue}let element=this.value(i);elements.push(element),i=element.end}}stringEnd(start){for(let i=start+1;i<this.text.length;i++)if(this.text[i]==="\\")i++;else if(this.text[i]==='"')return i+1;throw new Error("unterminated string")}blockCommentEnd(from){let close=this.text.indexOf("*/",from+2);if(close<0)throw new Error("unterminated comment");return close+2}lineEnd(from){let newline=this.text.indexOf(`
|
|
@@ -173,8 +173,8 @@ File: ${path14}`)}}getProvider(providerId){return this.providers.get(providerId)
|
|
|
173
173
|
`,start);for(;newline!==-1;){lineNumber+=1;let entry2=transitionOf(pending.slice(start,newline),lineNumber);entry2!==void 0&&entries.push(entry2),start=newline+1,newline=pending.indexOf(`
|
|
174
174
|
`,start)}pending=pending.slice(start)}let tail=finalSegmentTransition(pending,lineNumber+1);return tail!==void 0&&entries.push(tail),entries}finally{await handle.close()}}function finalSegmentTransition(segment,lineNumber){if(segment.includes(PENDING_INPUT_TRANSITION)){try{JSON.parse(segment)}catch{return}return transitionOf(segment,lineNumber)}}function transitionOf(line,lineNumber){if(!line.includes(PENDING_INPUT_TRANSITION))return;let parsed;try{parsed=JSON.parse(line)}catch{throw new PendingInputJournalCorruptError(lineNumber)}if(!(typeof parsed!="object"||parsed===null||!("type"in parsed&&parsed.type==="custom")||!("customType"in parsed&&parsed.customType===PENDING_INPUT_TRANSITION)))return{data:"data"in parsed?parsed.data:void 0,id:"id"in parsed?String(parsed.id):""}}var PendingInputJournalCorruptError=class extends Error{constructor(lineNumber){super(`Pending input journal line ${lineNumber} is corrupt; the session cannot recover its queued input safely.`),this.code="pending_input_journal_corrupt",this.name="PendingInputJournalCorruptError"}},PendingInputAppendUncertainError=class extends Error{constructor(cursor,file,cause){let reason=cause instanceof Error?cause.message:String(cause);super(`Pending input transition ${cursor} was written to ${file} but could not be synced (${reason}). This is a local file error, not a model error; reopen the session to recover.`,{cause}),this.code="pending_input_append_uncertain",this.name="PendingInputAppendUncertainError"}},PendingInputNotDurableError=class extends Error{constructor(){super("The session file is not on disk yet, so a pending input cannot be saved; try again."),this.code="pending_input_journal_not_durable",this.name="PendingInputNotDurableError"}},PendingInputJournalGapError=class extends Error{constructor(missingCursor){super(`Pending input journal is missing transition ${missingCursor}; the session cannot recover its queued input safely.`),this.code="pending_input_journal_gap",this.name="PendingInputJournalGapError"}};async function syncPath(openFile,path14,flags2){let handle=await openFile(path14,flags2);try{await handle.sync()}finally{await handle.close()}}var PendingInputJournalError=class extends Error{constructor(entryId){super(`Pending input journal entry ${entryId} is malformed; the session cannot recover its queued input safely.`),this.code="pending_input_journal_invalid",this.name="PendingInputJournalError"}};function parseRecord(data,entryId){if(typeof data!="object"||data===null||!("type"in data&&data.type===PENDING_INPUT_TRANSITION)||!("cursor"in data&&typeof data.cursor=="number")||!("input"in data&&isPendingInput(data.input)))throw new PendingInputJournalError(entryId);let result3="result"in data?data.result:void 0;if(result3!==void 0&&!isOperationResult(result3))throw new PendingInputJournalError(entryId);let batch="batch"in data?data.batch:void 0;if(batch!==void 0&&!(Array.isArray(batch)&&batch.every(isPendingInput)))throw new PendingInputJournalError(entryId);return{type:PENDING_INPUT_TRANSITION,cursor:data.cursor,input:data.input,...result3===void 0?{}:{result:result3},...batch===void 0?{}:{batch}}}function isOperationResult(value){return typeof value=="object"&&value!==null&&"outcome"in value&&typeof value.outcome=="string"&&"clientMessageId"in value&&typeof value.clientMessageId=="string"}function isPendingInput(value){return typeof value=="object"&&value!==null&&"clientMessageId"in value&&typeof value.clientMessageId=="string"&&"phase"in value&&typeof value.phase=="string"&&"handle"in value&&typeof value.handle=="object"&&"revision"in value&&typeof value.revision=="number"}function createSessionQueuedInputPort(options){let attempts=new Map,reserve=async(tx,message)=>{let clientMessageId=clientMessageIdOf(message),input=clientMessageId===void 0?void 0:tx.current(clientMessageId);if(clientMessageId===void 0||input===void 0)return!0;let token={ownerId:options.ownerId,writerGeneration:options.writerGeneration,lifetimeId:input.handle.lifetimeId,attemptId:options.nextAttemptId(),clientMessageId};return await tx.apply(clientMessageId,{type:"reserve",token}),tx.current(clientMessageId)?.attempt?.attemptId!==token.attemptId?!1:(attempts.set(message,token),!0)},settle2=async(tx,messages,type2)=>{let tokens=messages.flatMap(message=>{let token=attempts.get(message);return token===void 0?[]:[token]});if(tokens.length===0)return tokens;await tx.applyAll(tokens.map(token=>({clientMessageId:token.clientMessageId,event:{type:type2,token}})));for(let message of messages)attempts.delete(message);return tokens},cancelOf=clientMessageId=>({clientMessageId,event:{type:"cancel",cause:"stop",consumerFenced:!0}}),cancelClaims=async(tx,messages)=>{let ids=messages.flatMap(message=>{let token=attempts.get(message);return attempts.delete(message),token===void 0?[]:[token.clientMessageId]});ids.length>0&&await tx.applyAll(ids.map(cancelOf))},cancelReleased=async(tx,messages)=>{let ids=messages.flatMap(message=>{let clientMessageId=clientMessageIdOf(message);return clientMessageId===void 0||tx.current(clientMessageId)===void 0?[]:[clientMessageId]});ids.length>0&&await tx.applyAll(ids.map(cancelOf))};return{claim:(_queue,drain)=>options.store.transaction(async tx=>{let claimed=[];for(let message of drain())await reserve(tx,message)&&claimed.push(message);return claimed}),commitConsumption:(_queue,messages)=>options.store.transaction(async tx=>{await settle2(tx,messages,"consumed")}),release:(_queue,messages,giveBack)=>options.store.transaction(async tx=>{if(!giveBack.restorable()){await cancelClaims(tx,messages);return}await settle2(tx,messages,"release"),giveBack.restore()||await cancelReleased(tx,messages)})}}function clientMessageIdOf(message){if(!(message.role!=="user"||!("clientMessageId"in message)))return typeof message.clientMessageId=="string"?message.clientMessageId:void 0}var ClientMessageIdConflictError=class extends Error{constructor(clientMessageId){super(`Client message id ${clientMessageId} was already used for a different message.`),this.code="client_message_id_conflict",this.name="ClientMessageIdConflictError",this.clientMessageId=clientMessageId}},holdsPendingInputTransition={initial:()=>!1,add:(held,entry2)=>held||entry2.type==="custom"&&entry2.customType===PENDING_INPUT_TRANSITION},SessionPendingInputs=class{constructor(options){this.lifetimeId=randomUUID4(),this.attempts=0,this.clears=0,this.options=options,options.sessionManager.reduceHistory(holdsPendingInputTransition)&&this.store().catch(()=>{})}async restoreHandle(clientMessageId){if(this.storeOpening===void 0)return;let input=(await this.storeOpening).current(clientMessageId);if(input!==void 0)return input.phase==="queued"?{queuedId:input.handle.queuedId}:"retired"}async admit(input,enqueue){return(await this.store()).transaction(async tx=>{let result3=await tx.submit({clientMessageId:input.clientMessageId,fingerprint:admissionFingerprint(input),text:input.text,attachments:(input.images??[]).map(attachmentFingerprint),requestedMode:input.mode});if(result3?.outcome==="client_message_id_conflict")throw new ClientMessageIdConflictError(input.clientMessageId);let admitted=tx.current(input.clientMessageId);return result3?.outcome==="admitted"&&admitted!==void 0&&enqueue(admitted.handle.queuedId),result3})}async change(request2,applyNative){if(this.storeOpening===void 0)return;let clearsAtStart=this.clears;return(await this.storeOpening).transaction(async tx=>{let current=tx.current(request2.clientMessageId);if(current===void 0)return;let target={effectId:request2.effectId??randomUUID4(),handle:current.handle,expectedRevision:request2.expectedRevision??current.revision},result3=request2.text===void 0?await tx.apply(request2.clientMessageId,{type:"remove",...target}):await tx.apply(request2.clientMessageId,{type:"edit",...target,text:request2.text,attachments:current.attachments}),outcome=legacyOutcome(result3?.outcome);if(outcome!=="edited"&&outcome!=="removed")return outcome;let native=applyNative();if(native==="not_found"&&this.clears!==clearsAtStart)return"not_found";if(native!==outcome)throw new PendingInputDivergenceError(request2.clientMessageId,outcome,native);return outcome})}async recordCleared(clientMessageIds){if(this.clears+=1,this.storeOpening===void 0||clientMessageIds.length===0)return;await(await this.storeOpening).transaction(async tx=>{let queued=clientMessageIds.filter(clientMessageId=>tx.current(clientMessageId)?.phase==="queued");queued.length!==0&&await tx.applyAll(queued.map(clientMessageId=>({clientMessageId,event:{type:"cancel",cause:"stop",consumerFenced:!0}})))})}async snapshot(knownClientMessageIds=[]){let store=this.storeOpening===void 0?void 0:await this.storeOpening,inputs=(store?.snapshot()??[]).filter(input=>input.state!=="delivered"&&input.state!=="removed"),outcomes2=knownClientMessageIds.map(clientMessageId=>{let read2=store?.read(clientMessageId);return read2?.status==="admitted"?{clientMessageId,status:"admitted",projection:read2.projection}:{clientMessageId,status:"not_admitted"}});return{lifetimeId:this.lifetimeId,throughCursor:store?.throughCursor??0,inputs,outcomes:outcomes2}}queuedInputPort(){return{claim:async(queue,drain)=>(await this.openPort())?.claim(queue,drain)??drain(),commitConsumption:async(queue,messages)=>(await this.openPort())?.commitConsumption(queue,messages),release:async(queue,messages,giveBack)=>{let port=await this.openPort();port===void 0?giveBack.restore():await port.release(queue,messages,giveBack)}}}store(){return this.storeOpening??=PendingInputStore.open({journal:this.options.journal??new SessionPendingInputJournal(this.options.sessionManager),lifetimeId:this.lifetimeId,nextQueuedId:this.options.nextQueuedId,uncommittedAttemptsAreUnsent:!0}).then(store=>{let onChange=this.options.onChange;return onChange!==void 0&&store.subscribe((projections,cursor)=>onChange({lifetimeId:this.lifetimeId,cursor,changes:projections})),store}),this.storeOpening}async openPort(){if(this.storeOpening===void 0)return;let store=await this.storeOpening;return this.port??=createSessionQueuedInputPort({store,ownerId:`${process.pid}:${this.lifetimeId}`,writerGeneration:1,nextAttemptId:()=>`${this.lifetimeId}:${++this.attempts}`}),this.port}};function admissionFingerprint(input){let images=(input.images??[]).map(attachmentFingerprint);return sha256(JSON.stringify([input.mode,input.text,images]))}function attachmentFingerprint(image){return`${image.mimeType}:${sha256(image.data)}`}function sha256(value){return createHash6("sha256").update(value).digest("hex")}var PendingInputDivergenceError=class extends Error{constructor(clientMessageId,recorded,native){super(`Queued input ${clientMessageId} was ${recorded} in its record but ${native} in the queue.`),this.code="pending_input_divergence",this.name="PendingInputDivergenceError"}};function legacyOutcome(outcome){switch(outcome){case"edited":case"removed":case"conflict":case"already_delivered":return outcome;case"sending":return"already_delivered";default:return"not_found"}}var DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS=30,PROMPT_CACHE_SAFE_WAIT_ENV="PI_PROMPT_CACHE_SAFE_WAIT_SECONDS";function toProviderEnv(env){let resolved={};for(let[key,value]of Object.entries(env))value!==void 0&&(resolved[key]=value);return resolved}function resolveBufferSeconds(configured){return configured===void 0||!Number.isFinite(configured)||configured<0?DEFAULT_PROMPT_CACHE_SAFETY_BUFFER_SECONDS:Math.trunc(configured)}function resolvePromptCacheSafeWaitSeconds(model,settings,env){if(settings?.cacheAwareTimeouts===!1||!model)return;let ttlSeconds=resolvePromptCacheTtlSeconds(model,toProviderEnv(env));if(ttlSeconds===void 0)return;let safeWait=ttlSeconds-resolveBufferSeconds(settings?.safetyBufferSeconds);return safeWait>=1?safeWait:void 0}import{createHash as createHash7}from"node:crypto";import{basename as basename8,dirname as dirname19}from"node:path";function promptSizeExtensionNames(paths,packageNameOf=()=>{}){let names=new Map;for(let path14 of paths){let stem=basename8(path14).replace(/\.[^.]+$/,""),name=path14.startsWith("<")?path14.replace(/^<[^:]+:|>$/g,""):packageNameOf(path14)??(stem==="index"||stem==="main"?basename8(dirname19(path14)):stem);names.set(path14,name)}let counts=new Map;for(let name of names.values())counts.set(name,(counts.get(name)??0)+1);for(let[path14,name]of names)(counts.get(name)??0)>1&&names.set(path14,`${name}:${createHash7("sha256").update(path14).digest("hex").slice(0,8)}`);return names}import{realpathSync as realpathSync5}from"node:fs";import{homedir as homedir5}from"node:os";function entry(part){let source2=part.source??part.name,home=[homedir5(),realpathSync5(homedir5())].find(path14=>source2===path14||source2.startsWith(`${path14}/`));return{name:part.name,source:home===void 0?source2:source2===home?"~":`~/${source2.slice(home.length+1)}`,bytes:Buffer.byteLength(part.text,"utf8"),estimatedTokens:estimateTextTokens(part.text),boundingSettings:part.name==="project_context"?["contextFiles.maxBytesPerFile","contextFiles.maxTotalBytes"]:null}}var PromptSizeAccounting=class{#entries;#skillCount;#extensionNames;#presetPartsMismatch=[];constructor(input){let{base,options,parts}=input;this.#extensionNames=input.extensionNames;let rendered=parts.map(part=>part.text).join("");this.#entries=parts.length>0&&base.startsWith(rendered)?[...parts,...base===rendered?[]:[{name:"session_policy",text:base.slice(rendered.length)}]].map(entry):[entry({name:"core",source:"session",text:base})],this.#skillCount=(options.skills??[]).filter(skill=>!skill.disableModelInvocation).length}observe(contribution){let{path:path14,before,after:after2,parts}=contribution,name=this.#extensionNames.get(path14)??path14.replace(/^<[^:]+:|>$/g,"");if(parts!==void 0){if(parts.map(part=>part.text).join("")===after2){this.#entries.splice(0,this.#entries.length,...parts.map(entry));return}this.#presetPartsMismatch.push(name)}if(before===after2)return;let added=after2.startsWith(before)?after2.slice(before.length):after2.endsWith(before)?after2.slice(0,after2.length-before.length):void 0;this.#entries.push({name:`extension:${name}`,source:name,bytes:Buffer.byteLength(after2)-Buffer.byteLength(before),estimatedTokens:added===void 0?estimateTextTokens(after2)-estimateTextTokens(before):estimateTextTokens(added),boundingSettings:null,...added===void 0?{rewritten:!0}:{}})}report(tools){let sections=[],project2=this.#entries.filter(part=>part.name==="project_context");for(let part of this.#entries)part.name!=="project_context"&§ions.push(part.name==="skills"?{...part,count:this.#skillCount,boundingSettings:[`MAX_SKILL_CATALOG_BYTES (${49152})`,`COMPACT_SKILL_CATALOG_COUNT (${100})`,`COMPACT_SKILL_CATALOG_DESCRIPTION_BYTES (${65536})`]}:part);project2.length>0&§ions.push({name:"project_context",source:project2[0]?.source.startsWith("prompt-preset:")?project2[0].source:"context files",bytes:project2.reduce((sum,part)=>sum+part.bytes,0),estimatedTokens:project2.reduce((sum,part)=>sum+part.estimatedTokens,0),boundingSettings:["contextFiles.maxBytesPerFile","contextFiles.maxTotalBytes"],files:project2.filter(part=>part.source!=="dynamic-prompt"&&!part.source.startsWith("prompt-preset:")).sort((a,b)=>b.bytes-a.bytes)});let serializedTools=JSON.stringify(tools);return sections.push({...entry({name:"tools",source:"provider declarations",text:serializedTools}),count:tools.length,topTools:tools.map(tool=>({name:tool.name,bytes:Buffer.byteLength(JSON.stringify(tool))})).sort((a,b)=>b.bytes-a.bytes).slice(0,10)}),sections.sort((a,b)=>b.bytes-a.bytes),{sections,total:{bytes:sections.reduce((sum,part)=>sum+part.bytes,0),estimatedTokens:sections.reduce((sum,part)=>sum+part.estimatedTokens,0)},...this.#presetPartsMismatch.length===0?{}:{presetPartsMismatch:{names:[...this.#presetPartsMismatch],note:"replacement parts did not join to its prompt; its row is the net delta"}}}}};function promptSizeStartupNotes(input){let thirdPartySessionStart={names:input.runner.getThirdPartySessionStartPaths().map(path14=>input.extensionNames.get(path14)??"extension"),note:"these third-party session_start hooks ran during startup and may have used the network"};if(!input.sizesOnlyStartup||input.inventory===void 0)return{thirdPartySessionStart};let servers=[...input.inventory.mcpServerNames({cwd:input.cwd,runner:input.runner})].sort();return{mcp:{count:servers.length,names:servers,note:"not attached; tool sizes exclude them"},thirdPartySessionStart}}var PROMPT_STARTED_REASON="a prompt started composing its turn before the prefix was built",MAX_COMPOSITION_PASSES=2,CANCELLED=Symbol("prompt-cache-prefix-cancelled"),PromptCachePrefixBuilds=class{#inFlight=new Set;async build(sources,options={}){let controller=new AbortController,signal=options.signal===void 0?controller.signal:AbortSignal.any([options.signal,controller.signal]);this.#inFlight.add(controller);try{return await buildPromptCachePrefixRequest(sources,signal,options)}finally{this.#inFlight.delete(controller)}}cancelAll(){for(let controller of this.#inFlight)controller.abort(PROMPT_STARTED_REASON);this.#inFlight.clear()}};async function buildPromptCachePrefixRequest(sources,signal,requestOptions={}){if(await untilAborted(sources.ready,signal)===CANCELLED)return cancelled(signal);let unsafe=sources.runner.getPreviewUnsafeBeforeAgentStartPaths();if(unsafe.length>0)return skipped(`before_agent_start handlers not registered previewSafe: ${unsafe.join(", ")}`);let composed=await untilAborted(composeTurnSystemPrompt(sources,signal,requestOptions.sizesOnly===!0),signal);if(composed===CANCELLED)return cancelled(signal);let{agent,runner}=sources,state3=agent.state,model=state3.model;if(model===void 0)return skipped("no model selected");let options={},reasoning=loopReasoning(state3.reasoningBaseline,state3.thinkingLevel);reasoning!==void 0&&(options.reasoning=reasoning),state3.thinkingSelection!==void 0&&(options.thinkingSelection=state3.thinkingSelection),agent.thinkingBudgets!==void 0&&(options.thinkingBudgets=agent.thinkingBudgets),agent.sessionId!==void 0&&(options.sessionId=agent.sessionId);let serviceTier=sources.getServiceTier();serviceTier!==void 0&&(options.serviceTier=serviceTier),agent.onPayload!==void 0&&(options.onPayload=agent.onPayload),runner.hasHandlers("before_provider_headers")&&(options.transformHeaders=async headers=>await runner.emitBeforeProviderHeaders(headers));let prepared=requestOptions.sizesOnly?{model,options}:await untilAborted(sources.modelRuntime.prepareSimpleRequest(model,options),signal);if(prepared===CANCELLED)return cancelled(signal);let transcript=await buildProviderContext({systemPrompt:composed.systemPrompt,messages:[],tools:state3.tools.slice(),...state3.declaredTools!==void 0?{declaredTools:state3.declaredTools.slice()}:{}},{convertToLlm:()=>[],model});return signal.aborted?cancelled(signal):{status:"ready",request:{model:prepared.model,context:toPrefixContext(transcript),options:prepared.options,...composed.accounting===void 0?{}:{sizeReport:{...composed.accounting.report(getCurrentTools(transcript.messages)),...promptSizeStartupNotes({cwd:sources.getBaseSystemPromptOptions().cwd,runner,extensionNames:composed.extensionNames,inventory:sources.promptSizeInventory,sizesOnlyStartup:sources.sizesOnlyStartup===!0})}}}}}function toPrefixContext(transcript){return{systemPrompt:getCurrentSystemPrompt(transcript.messages),messages:transcript.messages.filter(message=>message.role!=="system"),tools:getCurrentTools(transcript.messages),...transcript.activeToolNames===void 0?{}:{activeToolNames:transcript.activeToolNames}}}async function composeTurnSystemPrompt(sources,signal,sizesOnly){let systemPrompt=sources.getBaseSystemPrompt(),accounting,extensionNames=sizesOnly?promptSizeExtensionNames(sources.runner.getExtensionPaths(),path14=>sources.promptSizeInventory?.packageNameOf(path14)):new Map;for(let pass=0;pass<MAX_COMPOSITION_PASSES&&!signal.aborted;pass+=1){let base=sources.getBaseSystemPrompt();accounting=sizesOnly?new PromptSizeAccounting({base,options:sources.getBaseSystemPromptOptions(),parts:sources.getBaseSystemPromptParts?.()??[],extensionNames}):void 0;let currentAccounting=accounting;if(systemPrompt=(await sources.runner.emitBeforeAgentStart("",void 0,base,sources.getBaseSystemPromptOptions(),{preview:!0,signal,...currentAccounting===void 0?{}:{observePrompt:contribution=>currentAccounting.observe(contribution)}}))?.systemPrompt??base,sources.getBaseSystemPrompt()===base)break}return{systemPrompt,accounting,extensionNames}}async function untilAborted(work,signal){if(signal.aborted)return CANCELLED;let onAbort,aborted=new Promise(resolve55=>{onAbort=()=>resolve55(CANCELLED),signal.addEventListener("abort",onAbort,{once:!0})});try{return await Promise.race([work,aborted])}finally{onAbort!==void 0&&signal.removeEventListener("abort",onAbort)}}function skipped(reason){return{status:"skipped",reason}}function cancelled(signal){return skipped(typeof signal.reason=="string"?signal.reason:"prefix build cancelled")}function loopReasoning(baseline,thinkingLevel){let level=baseline!==void 0&&isValidThinkingLevel(baseline)?baseline:thinkingLevel;return level==="off"?void 0:level}import{existsSync as existsSync7,readdirSync as readdirSync2,readFileSync as readFileSync9,statSync as statSync7}from"fs";import{basename as basename9,dirname as dirname20,join as join22,resolve as resolve7,sep as sep4}from"path";function parseCommandArgs(argsString){let args=[],current="",inQuote=null;for(let i=0;i<argsString.length;i++){let char=argsString[i];inQuote?char===inQuote?inQuote=null:current+=char:char==='"'||char==="'"?inQuote=char:/\s/.test(char)?current&&(args.push(current),current=""):current+=char}return current&&args.push(current),args}function substituteArgs(content,args){let allArgs=args.join(" ");return content.replace(/\$\{(\d+|ARGUMENTS|@):-([^}]*)\}|\$\{@:(\d+)(?::(\d+))?\}|\$(ARGUMENTS|@|\d+)/g,(_match,defaultTarget,defaultValue,sliceStart,sliceLength,simple)=>{if(defaultTarget){let value=defaultTarget==="@"||defaultTarget==="ARGUMENTS"?allArgs:args[parseInt(defaultTarget,10)-1];return value||defaultValue}if(sliceStart){let start=parseInt(sliceStart,10)-1;if(start<0&&(start=0),sliceLength){let length=parseInt(sliceLength,10);return args.slice(start,start+length).join(" ")}return args.slice(start).join(" ")}if(simple==="ARGUMENTS"||simple==="@")return allArgs;let index=parseInt(simple,10)-1;return args[index]??""})}function loadTemplateFromFile(filePath,sourceInfo){let diagnostics=[],rawContent;try{rawContent=readFileSync9(filePath,"utf-8")}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read prompt template file";return diagnostics.push({type:"warning",message,path:filePath}),{template:null,diagnostics}}let frontmatter,body;try{({frontmatter,body}=parseFrontmatter(rawContent))}catch(error2){let message=error2 instanceof Error?error2.message:"failed to parse prompt template file";return diagnostics.push({type:"warning",message,path:filePath}),{template:null,diagnostics}}let name=basename9(filePath).replace(/\.md$/,""),description=typeof frontmatter.description=="string"?frontmatter.description:"";if(!description){let firstLine2=body.split(`
|
|
175
175
|
`).find(line=>line.trim());firstLine2&&(description=firstLine2.slice(0,60),firstLine2.length>60&&(description+="..."))}let argumentHint=typeof frontmatter["argument-hint"]=="string"?frontmatter["argument-hint"]:void 0,requiresArguments=frontmatter["requires-arguments"];return{template:{name,description,...argumentHint&&{argumentHint},requiresArguments:typeof requiresArguments=="boolean"?requiresArguments:!!argumentHint,content:body,sourceInfo,filePath},diagnostics}}function loadTemplatesFromDir(dir,getSourceInfo){let templates=[],diagnostics=[];if(!existsSync7(dir))return{templates,diagnostics};try{let entries=readdirSync2(dir,{withFileTypes:!0});for(let entry2 of entries){let fullPath=join22(dir,entry2.name),isFile=entry2.isFile();if(entry2.isSymbolicLink())try{isFile=statSync7(fullPath).isFile()}catch{continue}if(isFile&&entry2.name.endsWith(".md")){let result3=loadTemplateFromFile(fullPath,getSourceInfo(fullPath));result3.template&&templates.push(result3.template),diagnostics.push(...result3.diagnostics)}}}catch{return{templates,diagnostics}}return{templates,diagnostics}}function loadPromptTemplates(options){let resolvedCwd=resolvePath(options.cwd),resolvedAgentDir=resolvePath(options.agentDir),promptPaths=options.promptPaths,includeDefaults=options.includeDefaults,templates=[],diagnostics=[],addResult=result3=>{templates.push(...result3.templates),diagnostics.push(...result3.diagnostics)},globalPromptsDir=join22(resolvedAgentDir,"prompts"),projectPromptsDir=resolve7(resolvedCwd,CONFIG_DIR_NAME,"prompts"),isUnderPath2=(target,root)=>{let normalizedRoot=resolve7(root);if(target===normalizedRoot)return!0;let prefix=normalizedRoot.endsWith(sep4)?normalizedRoot:`${normalizedRoot}${sep4}`;return target.startsWith(prefix)},getSourceInfo=resolvedPath=>isUnderPath2(resolvedPath,globalPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"user",baseDir:globalPromptsDir}):isUnderPath2(resolvedPath,projectPromptsDir)?createSyntheticSourceInfo(resolvedPath,{source:"local",scope:"project",baseDir:projectPromptsDir}):createSyntheticSourceInfo(resolvedPath,{source:"local",baseDir:statSync7(resolvedPath).isDirectory()?resolvedPath:dirname20(resolvedPath)});includeDefaults&&(addResult(loadTemplatesFromDir(globalPromptsDir,getSourceInfo)),addResult(loadTemplatesFromDir(projectPromptsDir,getSourceInfo)));for(let rawPath of promptPaths){let resolvedPath=resolvePath(rawPath,resolvedCwd,{trim:!0});if(existsSync7(resolvedPath))try{let stats=statSync7(resolvedPath);if(stats.isDirectory())addResult(loadTemplatesFromDir(resolvedPath,getSourceInfo));else if(stats.isFile()&&resolvedPath.endsWith(".md")){let result3=loadTemplateFromFile(resolvedPath,getSourceInfo(resolvedPath));result3.template&&templates.push(result3.template),diagnostics.push(...result3.diagnostics)}}catch(error2){let message=error2 instanceof Error?error2.message:"failed to read prompt template path";diagnostics.push({type:"warning",message,path:resolvedPath})}}return{templates,diagnostics}}function expandPromptTemplateWithMetadata(text3,templates){if(!text3.startsWith("/"))return{text:text3};let match=text3.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!match)return{text:text3};let templateName=match[1],argsString=match[2]??"",template=templates.find(t=>t.name===templateName);if(template){let args=parseCommandArgs(argsString);return{text:substituteArgs(template.content,args),template}}return{text:text3}}var ACTIONS={auth:{reason:"the provider rejected the credentials",action:"re-authenticate the provider"},rate_limit:{reason:"the provider is rate limiting requests",action:"retry later or set a fallback model"},quota:{reason:"the provider account is out of quota",action:"check the plan or credits"},context_limit:{reason:"the conversation is larger than the model's context",action:"compact or shorten the conversation"},invalid_request:{reason:"the provider rejected the request as invalid",action:"report it with the code"},provider_unavailable:{reason:"the provider is unavailable",action:"retry or switch provider"},network:{reason:"the connection to the provider failed",action:"check connectivity"}};function identifier(diagnostic2){return diagnostic2?.code!==void 0?`code ${diagnostic2.code}`:diagnostic2?.httpStatus!==void 0?`status ${diagnostic2.httpStatus}`:"no code"}function describeProviderFailure(diagnostic2,provider){let category=diagnostic2?.category??"unknown",detail=category==="unknown"?{reason:`the provider returned an error that could not be classified (${provider}, ${identifier(diagnostic2)})`,action:"retry once; if it repeats, switch the model or report the code"}:ACTIONS[category],resetsAt=diagnostic2?.resetsAt;return{category,provider,...diagnostic2?.httpStatus===void 0?{}:{httpStatus:diagnostic2.httpStatus},...diagnostic2?.code===void 0?{}:{code:diagnostic2.code},...resetsAt===void 0?{}:{resetsAt},...detail,...resetsAt===void 0?{}:{reason:`${detail.reason} until ${new Date(resetsAt).toISOString()}`}}}function providerFailureOf(messages){let last=messages.findLast(message=>message.role==="assistant");if(!(last===void 0||last.role!=="assistant"||last.stopReason!=="error"))return describeProviderFailure(sanitizeProviderDiagnostic(last.providerDiagnostic),last.provider)}function formatProviderFailure(failure2){return`${failure2.reason[0]?.toUpperCase()??""}${failure2.reason.slice(1)}. Action: ${failure2.action}.`}function reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs){if(!(streamRetryTimeoutMs===void 0||streamRetryTimeoutMs<=0))return streamStartTimeoutMs===void 0?streamRetryTimeoutMs:Math.max(streamRetryTimeoutMs,Math.ceil(streamStartTimeoutMs*1.1))}function createProviderTimeoutRetryPlan({message,streamRetryTimeoutMs,timeoutMs,streamStartTimeoutMs}){return isProviderTimeoutError(message)?{options:{deferQueuedMessages:!0,...timeoutMs===void 0?{}:{timeoutMs},...streamStartTimeoutMs===void 0?{}:{streamStartTimeoutMs}},watchdogTimeoutMs:reconcileWatchdogTimeoutMs(streamRetryTimeoutMs,streamStartTimeoutMs)}:{options:{},watchdogTimeoutMs:void 0}}async function runBoundedRetryContinuation({continueRun,getActiveSignal,abortActive,timeoutMs,onStreamStarted}){let streamStarted=!1,timer,unsubscribe=timeoutMs===void 0?void 0:onStreamStarted?.(()=>{streamStarted=!0,clearTimeout(timer)});try{let continuation=continueRun(),ownedSignal=getActiveSignal();if(timeoutMs===void 0||ownedSignal===void 0||streamStarted){await continuation;return}timer=setTimeout(()=>{!streamStarted&&getActiveSignal()===ownedSignal&&abortActive()},timeoutMs),await continuation}finally{clearTimeout(timer),unsubscribe?.()}}var QueuedInputAges=class{#runsStarted=0;#queuedAt=new Map;#reported=new Set;noteRunStarted(){this.#runsStarted+=1}noteQueued(queuedId,nowMs){this.#queuedAt.set(queuedId,{runsStarted:this.#runsStarted,atMs:nowMs})}takeOutlived(stillQueued,nowMs){let live=new Set(stillQueued);for(let queuedId of this.#queuedAt.keys())live.has(queuedId)||(this.#queuedAt.delete(queuedId),this.#reported.delete(queuedId));let outlived=[];for(let queuedId of stillQueued){let queuedAt=this.#queuedAt.get(queuedId);queuedAt===void 0||this.#reported.has(queuedId)||queuedAt.runsStarted>=this.#runsStarted||(this.#reported.add(queuedId),outlived.push({queuedId,ageMs:nowMs-queuedAt.atMs}))}return outlived}};async function checkSessionReloadVeto(runner,isPromptStartPending,isSessionStartDispatching=()=>!1){if(isPromptStartPending())return{cancelled:!0,reason:"A prompt is being admitted."};if(isSessionStartDispatching())return{cancelled:!0,reason:"A session is starting."};let result3=runner.hasHandlers("session_before_reload")?await runner.emit({type:"session_before_reload"}):void 0;return isPromptStartPending()?{cancelled:!0,reason:"A prompt is being admitted."}:isSessionStartDispatching()?{cancelled:!0,reason:"A session is starting."}:result3?.cancel!==!0?{cancelled:!1}:result3.reason===void 0?{cancelled:!0}:{cancelled:!0,reason:result3.reason}}var BARE_EXPANSION_DENYLIST=new Set(["cursor","openrouter","openrouter-images","opengateway","vercel-ai-gateway"]),PROVIDER_PRECEDENCE=["anthropic-subscription","anthropic","kimi-coding"];function authTier(model,tiers){return tiers.isUsingOAuth(model)?0:tiers.hasConfiguredAuth?.(model)===!0?1:2}var MAX_PROVIDERS_PER_FAMILY=2;function parseBareSelector(raw){let trimmed=raw.trim();if(!trimmed||trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{family:trimmed.toLowerCase()};let suffix=trimmed.slice(lastColon+1).toLowerCase();if(!isValidThinkingLevel(suffix))return{family:trimmed.toLowerCase()};let family=trimmed.slice(0,lastColon).trim().toLowerCase();return family?{family,thinkingLevel:suffix}:void 0}function withoutNamespace(modelId){let cut=Math.max(modelId.lastIndexOf("."),modelId.lastIndexOf("/"));return cut===-1?modelId:modelId.slice(cut+1)}function matchesFamily(model,family){return[model.id.toLowerCase(),withoutNamespace(model.id.toLowerCase())].some(id=>id===family||id.startsWith(`${family}-`))}function pickVariant2(models,family){return[...models].sort((left,right)=>{let exact=+(withoutNamespace(right.id.toLowerCase())===family)-+(withoutNamespace(left.id.toLowerCase())===family);return exact!==0?exact:left.id.length!==right.id.length?left.id.length-right.id.length:left.id.localeCompare(right.id)})[0]}function precedenceIndex(provider){let index=PROVIDER_PRECEDENCE.indexOf(provider.toLowerCase());return index===-1?PROVIDER_PRECEDENCE.length:index}function rankFamilyModels(models,family,tiers,options={}){let byProvider=new Map;for(let model of models){if(BARE_EXPANSION_DENYLIST.has(model.provider.toLowerCase())||!matchesFamily(model,family)||tiers.isFallbackEligible?.(model)===!1)continue;let bucket=byProvider.get(model.provider);bucket?bucket.push(model):byProvider.set(model.provider,[model])}let ranked=[...byProvider.values()].flatMap(variants=>{let variant=pickVariant2(variants,family);return variant?[variant]:[]}).sort((left,right)=>{let tier=authTier(left,tiers)-authTier(right,tiers);if(tier!==0)return tier;let precedence=precedenceIndex(left.provider)-precedenceIndex(right.provider);return precedence!==0?precedence:left.provider.localeCompare(right.provider)}),limit=options.limit??ranked.length;return ranked.slice(0,limit)}function availableModels(lookup){return"getAll"in lookup?lookup.getAll():[...lookup]}function authTiers(lookup){if(Array.isArray(lookup))return{isUsingOAuth:()=>!1};let registry=lookup;return{isUsingOAuth:model=>registry.isUsingOAuth?.(model)===!0,hasConfiguredAuth:typeof registry.hasConfiguredAuth=="function"?model=>registry.hasConfiguredAuth?.(model)===!0:void 0,isFallbackEligible:typeof registry.isFallbackEligible=="function"?memoizedEligibility(registry):void 0}}function memoizedEligibility(registry){let known=new Map;return model=>{let cached=known.get(model.provider);if(cached!==void 0)return cached;let eligible=registry.isFallbackEligible?.(model)!==!1;return known.set(model.provider,eligible),eligible}}function isChainTombstone(entries){return Array.isArray(entries)&&entries.length===0}function selectorReference(raw){let trimmed=raw.trim();if(!trimmed.includes("/")||trimmed.includes("*"))return;let lastColon=trimmed.lastIndexOf(":");if(lastColon===-1)return{reference:trimmed};let prefix=trimmed.slice(0,lastColon),suffix=trimmed.slice(lastColon+1).toLowerCase();return isValidThinkingLevel(suffix)?{reference:prefix,thinkingLevel:suffix}:{reference:trimmed}}function parseFallbackSelector(raw,lookup){let models=availableModels(lookup),trimmed=raw.trim(),parsedReference=selectorReference(trimmed);if(!parsedReference)return;let fullMatch=findExactModelReferenceMatch(trimmed,models);if(fullMatch)return{raw:trimmed,provider:fullMatch.provider,id:fullMatch.id};let slashIndex=parsedReference.reference.indexOf("/"),provider=parsedReference.reference.slice(0,slashIndex).trim(),modelPattern=parsedReference.reference.slice(slashIndex+1).trim();if(!provider||!modelPattern)return;let providerModels=models.filter(model=>model.provider.toLowerCase()===provider.toLowerCase()),parsed=parseModelPattern(parsedReference.thinkingLevel?`${modelPattern}:${parsedReference.thinkingLevel}`:modelPattern,providerModels,{allowInvalidThinkingLevelFallback:!1});if(!(!parsed.model||parsed.warning)&&!(parsedReference.thinkingLevel&&!parsed.thinkingLevel))return{raw:trimmed,provider:parsed.model.provider,id:parsed.model.id,thinkingLevel:parsed.thinkingLevel}}function formatSelector(model,thinkingLevel){let base=`${model.provider}/${model.id}`;return thinkingLevel?`${base}:${thinkingLevel}`:base}function baseSelector(selector){return`${selector.provider}/${selector.id}`}function rungSelector(selector){let base=baseSelector(selector);return selector.thinkingLevel?`${base}:${selector.thinkingLevel}`:base}function canonicalizeFallbackChains(chains,lookup){let models=availableModels(lookup),tiers=authTiers(lookup),canonical3={},explicitKeys=new Set,tombstones=new Set,expandEntries=(entries,keySelector)=>entries.flatMap(entry2=>{let bare=parseBareSelector(entry2);if(bare)return rankFamilyModels(models,bare.family,tiers,{limit:MAX_PROVIDERS_PER_FAMILY}).map(model=>bare.thinkingLevel?`${formatSelector(model)}:${bare.thinkingLevel}`:formatSelector(model)).filter(selector=>normalizedBase(selector)!==normalizedBase(keySelector));let parsedEntry=parseFallbackSelector(entry2,models);return parsedEntry?[formatParsedSelector(parsedEntry)]:[]});for(let[key,entries]of Object.entries(chains)){let bareKey=parseBareSelector(key);if(!(!bareKey||!Array.isArray(entries))){if(isChainTombstone(entries)){for(let model of rankFamilyModels(models,bareKey.family,tiers))tombstones.add(formatSelector(model).toLowerCase());continue}for(let model of rankFamilyModels(models,bareKey.family,tiers)){let keySelector=bareKey.thinkingLevel?`${formatSelector(model)}:${bareKey.thinkingLevel}`:formatSelector(model),canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical3[keySelector]=canonicalEntries)}}}for(let[key,entries]of Object.entries(chains)){if(parseBareSelector(key))continue;let parsedKey=parseFallbackSelector(key,models);if(!parsedKey||!Array.isArray(entries))continue;let keySelector=formatParsedSelector(parsedKey);if(isChainTombstone(entries)){tombstones.add(normalizedBase(keySelector));continue}explicitKeys.add(keySelector.toLowerCase());let canonicalEntries=expandEntries(entries,keySelector);canonicalEntries.length>0&&(canonical3[keySelector]=canonicalEntries)}for(let key of Object.keys(canonical3))explicitKeys.has(key.toLowerCase())||tombstones.has(normalizedBase(key))&&delete canonical3[key];return canonical3}function resolveChainKey(currentModel,currentThinking,chains,_options){let base=formatSelector(currentModel),exact=currentThinking?`${base}:${currentThinking}`:base;if(Object.hasOwn(chains,exact))return exact;if(Object.hasOwn(chains,base))return base}function formatParsedSelector(selector){return rungSelector(selector)}function explicitThinkingLevel(selector){let normalized2=selector.trim().toLowerCase(),lastColon=normalized2.lastIndexOf(":");if(lastColon===-1)return;let suffix=normalized2.slice(lastColon+1);return isValidThinkingLevel(suffix)?suffix:void 0}function normalizedBase(selector){if(typeof selector!="string")return baseSelector(selector).toLowerCase();let normalized2=selector.trim().toLowerCase();return explicitThinkingLevel(normalized2)===void 0?normalized2:normalized2.slice(0,normalized2.lastIndexOf(":"))}function normalizedExact(selector){return typeof selector=="string"?selector.trim().toLowerCase():formatParsedSelector(selector).toLowerCase()}function candidatesAfter(chainEntries,currentSelector){let exact=normalizedExact(currentSelector),exactIndex=chainEntries.findIndex(entry2=>entry2.toLowerCase()===exact);if(exactIndex!==-1)return chainEntries.slice(exactIndex+1);let base=normalizedBase(currentSelector),baseIndex=chainEntries.findIndex(entry2=>normalizedBase(entry2)===base&&explicitThinkingLevel(entry2)===void 0);return baseIndex===-1?chainEntries:chainEntries.slice(baseIndex+1)}function firstUsableCandidate(entries,current,filters){return scanCandidates(entries,current,filters,provider=>filters.isProviderSpent?.(provider)??!1)}function isCurrentRung(selector,current){return selector.provider!==current.model.provider||selector.id!==current.model.id?!1:selector.thinkingLevel===void 0||selector.thinkingLevel===current.thinkingLevel}function scanCandidates(entries,current,filters,avoidProvider){let probe;for(let raw of candidatesAfter(entries,formatSelector(current.model,current.thinkingLevel))){let selector=parseFallbackSelector(raw,filters.registry);if(!selector){filters.skip(raw,"unknown");continue}if(isCurrentRung(selector,current)){filters.skip(raw,"self");continue}if(avoidProvider(selector.provider)){filters.skip(raw,"account-limit");continue}let base=baseSelector(selector);if(filters.isModelSkipped?.(base)){filters.skip(raw,"network-blip");continue}if(filters.tried.has(rungSelector(selector))){filters.skip(raw,"tried");continue}if(filters.isSuppressed(base)){filters.skip(raw,"suppressed");continue}if(!filters.isAuthAvailable(selector.provider)){filters.skip(raw,"unauthenticated");continue}let model=filters.registry.find(selector.provider,selector.id);if(!model){filters.skip(raw,"unknown");continue}let level=clampThinkingLevel(model,selector.thinkingLevel??current.thinkingLevel??"off");if(base===formatSelector(current.model)&&level===(current.thinkingLevel??"off")){filters.skip(raw,"self");continue}if(filters.isSuppressed(rungSelector({...selector,thinkingLevel:level}))){filters.skip(raw,"suppressed");continue}if(filters.isCircuitOpen(base)){filters.skip(raw,"circuit-open"),probe??={selector,model,circuitOpen:!0};continue}return{selector,model,circuitOpen:!1}}return probe}function pinAfterSwitch(prior,switch_){let originalSelector=prior?.originalSelector??switch_.from,billingHitsOriginal=switch_.reason==="billing"&&(switch_.from===originalSelector||switch_.limit==="account"&&originalSelector.startsWith(`${switch_.fromProvider}/`)),pinnedByRefusal=prior?.pinnedByRefusal===!0||switch_.reason==="refusal",pinnedByBilling=prior?.pinnedByBilling===!0||billingHitsOriginal;return{originalSelector,pinnedByRefusal,pinnedByBilling,pinned:pinnedByRefusal||pinnedByBilling}}var TRANSPORT_FAILURE=/timed? out|timeout|econnreset|econnrefused|etimedout|socket hang up|socket connection was closed|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|getaddrinfo|enotfound|eai_again|upstream.?connect|reset before headers|terminated|websocket.?closed|websocket.?error|ended without|stream ended before message_stop|stream ended before a terminal response event|http2 request did not get a response|\btls\b|\bssl\b|econnaborted|epipe/,PROVIDER_VERDICT=/usage[- ]limit|quota|billing|credits|rate[ -]?limit|\b429\b|too many requests|overloaded|capacity|forbidden|resets? (?:at|in)\b|\b5\d\d\b|server|unavailable|high demand|overflow/;function normalize(errorMessage6){return stripProviderRequestIds(errorMessage6).toLowerCase()}function isTransportFailureText(normalizedMessage){return TRANSPORT_FAILURE.test(normalizedMessage)}function isPureNetworkTransient(errorMessage6){if(errorMessage6===void 0)return!1;let message=normalize(errorMessage6);return isTransportFailureText(message)&&!PROVIDER_VERDICT.test(message)}var UnusableEntries=class{constructor(cooldowns){this.accountErrors=new Map,this.cooldowns=cooldowns}note(model,failure2){let scope=usageLimitScope(failure2.errorMessage);scope==="account"?(this.cooldowns.note(accountKey(model.provider),failure2),failure2.errorMessage&&this.accountErrors.set(model.provider,failure2.errorMessage)):(scope==="model"||isHealthExhaustionFailure(failure2.errorMessage))&&this.cooldowns.note(entryKey(model),failure2)}isProviderSpent(provider){return this.cooldowns.isSuppressed(accountKey(provider))}accountError(provider){return this.isProviderSpent(provider)?this.accountErrors.get(provider):void 0}isUnusable(model){return this.isProviderSpent(model.provider)||this.cooldowns.isSuppressed(entryKey(model))}clear(model){this.cooldowns.clear(entryKey(model)),this.cooldowns.clear(accountKey(model.provider)),this.accountErrors.delete(model.provider)}};function accountKey(provider){return`account:${provider}`}function entryKey(model){return`exhausted:${formatSelector(model)}`}var RetryFallbackController=class{constructor(deps){this.triedSelectors=new Set,this.heldForNetworkBlip=!1,this.ownFailures=new Set,this.deps=deps,this.probes=new CircuitProbes(deps.circuits),this.unusable=new UnusableEntries(deps.cooldowns)}get activeState(){return this.state}get exhaustedChainKey(){return this.lastExhaustedChainKey}isProviderSpent(provider){return this.unusable.isProviderSpent(provider)}accountError(provider){return this.unusable.accountError(provider)}resetTurn(){this.triedSelectors.clear(),this.lastExhaustedChainKey=void 0}clear(){this.state=void 0,this.heldForNetworkBlip=!1,this.canonicalCache=void 0,this.resetTurn()}canonicalChains(){let chains=this.deps.getSettings().chains,key=JSON.stringify(chains);if(this.canonicalCache?.key===key)return this.canonicalCache.chains;let canonical3=canonicalizeFallbackChains(chains,this.deps.registry);return this.canonicalCache={key,chains:canonical3},canonical3}canTryFallback(){return this.nextCandidate(!1)!==void 0}hasConfiguredChain(){let current=this.deps.getCurrentSelector();if(!current)return!1;let chains=this.canonicalChains();return resolveChainKey(current.model,current.thinkingLevel,chains)!==void 0}async maybeRestorePrimary(revertPolicy,boundary="turn"){let heldForNetworkBlip=this.heldForNetworkBlip&&boundary==="continuation";boundary==="turn"&&(this.heldForNetworkBlip=!1);let state3=this.state,current=this.deps.getCurrentSelector();if(!state3||state3.pinned||!current)return!1;let selector=parseFallbackSelector(state3.originalSelector,this.deps.registry);if(!selector||!this.deps.isAuthAvailable(selector.provider))return!1;let model=this.deps.registry.find(selector.provider,selector.id);if(!model)return!1;let stranded=this.unusable.isUnusable(current.model)&&!this.unusable.isUnusable(model);if(!stranded&&(heldForNetworkBlip||!this.originalRecovered(state3,revertPolicy)))return!1;let thinking=current.thinkingLevel===state3.lastAppliedThinkingLevel?state3.originalThinkingLevel??current.thinkingLevel??"off":current.thinkingLevel??"off";await this.switchOrRelease(model,thinking,"fallback-revert");let from=formatSelector(current.model);this.state=void 0;let cause=stranded?{cause:"fallback-unusable"}:{},trigger=stranded?{trigger:"fallback-unusable"}:{};return this.deps.logger.info("fallback_reverted",{from,to:state3.originalSelector,...trigger}),this.deps.emit({type:"retry_fallback_reverted",from,to:state3.originalSelector,...cause}),!0}originalRecovered(state3,revertPolicy){if(revertPolicy!=="cooldown-expiry")return!1;let originalSelector=state3.originalSelector,original=parseFallbackSelector(originalSelector,this.deps.registry);return original&&state3.originalThinkingLevel!==void 0&&this.deps.cooldowns.isSuppressed(rungSelector({...original,thinkingLevel:state3.originalThinkingLevel}))?!1:!(this.probes.governs(originalSelector)?this.probes.isOpen(originalSelector):this.deps.cooldowns.isSuppressed(originalSelector))&&this.probes.admit(originalSelector)!=="open"}noteManualThinkingLevel(){this.state&&(this.state.lastAppliedThinkingLevel=void 0)}notifyCompactionApplied(){let state3=this.state;if(!state3)return!1;state3.pinnedByRefusal=!1;let wasPinned=state3.pinned;return state3.pinned=state3.pinnedByBilling,!wasPinned||state3.pinned?!1:(this.deps.logger.info("refusal_pin_released",{chainKey:state3.chainKey,originalSelector:state3.originalSelector,trigger:"compaction"}),!0)}clearForManualModelChange(model){this.state&&this.deps.logger.info("fallback_cleared_manual",{selector:formatSelector(model)}),this.state=void 0,this.heldForNetworkBlip=!1,this.ownFailures.delete(formatSelector(model)),this.deps.cooldowns.clearModel(formatSelector(model)),this.unusable.clear(model),this.probes.release(),this.deps.circuits?.close(formatSelector(model))}noteServed(selector){this.ownFailures.delete(selector),this.probes.accept(selector)}noteHealthFailure(model,thinkingLevel,failure2){this.unusable.note(model,failure2),this.managedChainKey({model,thinkingLevel})&&(isPureNetworkTransient(failure2.errorMessage)||(this.ownFailures.add(formatSelector(model)),this.probes.noteFailure(formatSelector(model),failure2)))}async rerouteAroundOpenCircuit(){let current=this.deps.getCurrentSelector();if(!this.deps.circuits||!current)return!1;let currentBase=formatSelector(current.model);if(this.probes.admit(currentBase)!=="open"||!this.ownFailures.has(currentBase)&&!this.probes.isExhausted(currentBase))return!1;let candidate=this.nextCandidate(!1,!0);return!candidate||candidate.circuitOpen?!1:(this.deps.logger.info("circuit_open_skip",{selector:currentBase}),await this.applyCandidate(current,candidate,"transient"),!0)}async tryFallback(reason,failure2,failureObserved=!0){let current=this.deps.getCurrentSelector(),blip=reason==="transient"&&isPureNetworkTransient(failure2.errorMessage);this.blipModel=blip&¤t?formatSelector(current.model):void 0;try{return await this.walkFallback(reason,failure2,failureObserved)}finally{this.blipModel=void 0}}async walkFallback(reason,failure2,failureObserved){let current=this.deps.getCurrentSelector(),networkBlip=reason==="transient"&&isPureNetworkTransient(failure2.errorMessage);failureObserved&¤t&&reason==="transient"&&this.noteHealthFailure(current.model,current.thinkingLevel,failure2);let limit=usageLimitScope(failure2.errorMessage);failureObserved&¤t&&this.unusable.note(current.model,failure2);let modelWidePark=!networkBlip&&failureObserved&&(reason==="transient"||reason==="billing"),candidate=this.nextCandidate(!1,!modelWidePark);if(!current||!candidate)return modelWidePark&&this.nextCandidate(!1,!0),!1;let currentBase=formatSelector(current.model);if(!networkBlip&&failureObserved&&(reason==="transient"||reason==="hard-error"||reason==="billing")){let parked=reason==="hard-error"?rungSelector({provider:current.model.provider,id:current.model.id,thinkingLevel:current.thinkingLevel}):currentBase;this.deps.cooldowns.note(parked,failure2),this.deps.logger.info("cooldown_noted",{selector:parked,errorMessage:failure2.errorMessage})}for(modelWidePark&&(candidate=this.nextCandidate(!1,!0));candidate;){try{return await this.applyCandidate(current,candidate,reason,limit),this.heldForNetworkBlip||=networkBlip,!0}catch(error2){if(!this.deps.isCandidateRefusal?.(error2))throw error2;this.triedSelectors.add(rungSelector(candidate.selector)),this.skip(formatSelector(candidate.model),"refused")}candidate=this.nextCandidate(!1,!0)}return!1}async applyCandidate(current,candidate,reason,limit){let thinking=this.selectThinking(candidate.selector,candidate.model,current.thinkingLevel);this.probes.admit(baseSelector(candidate.selector)),await this.switchOrRelease(candidate.model,thinking,"fallback"),this.triedSelectors.add(rungSelector(candidate.selector));let from=formatSelector(current.model),to=formatSelector(candidate.model),prior=this.state;this.state={chainKey:candidate.chainKey,originalThinkingLevel:prior?.originalThinkingLevel??current.thinkingLevel,lastAppliedThinkingLevel:thinking,...pinAfterSwitch(prior,{from,fromProvider:current.model.provider,reason,limit})};let scope=limit===void 0?{}:{limit};this.deps.logger.info("fallback_applied",{from,to,chainKey:candidate.chainKey,reason,...scope}),this.deps.emit({type:"retry_fallback_applied",from,to,chainKey:candidate.chainKey,reason,...scope})}managedChainKey(current){if(!this.deps.getSettings().modelFallback)return;let chains=this.canonicalChains(),chainKey=resolveChainKey(current.model,current.thinkingLevel,chains)??this.state?.chainKey;return chainKey&&chains[chainKey]?chainKey:void 0}nextCandidate(reserve=!0,logDecision=reserve){let current=this.deps.getCurrentSelector();if(!this.deps.getSettings().modelFallback||!current)return;let chainKey=this.managedChainKey(current),entries=chainKey?this.canonicalChains()[chainKey]:void 0;if(!chainKey||!entries){logDecision&&this.deps.logger.debug("no_chain",{selector:formatSelector(current.model)});return}let candidate=firstUsableCandidate(entries,current,{registry:this.deps.registry,tried:this.triedSelectors,isSuppressed:base=>this.deps.cooldowns.isSuppressed(base),isAuthAvailable:provider=>this.deps.isAuthAvailable(provider),isCircuitOpen:base=>this.deps.circuits?.isOpen(base)??!1,isProviderSpent:provider=>this.unusable.isProviderSpent(provider),isModelSkipped:base=>base===this.blipModel,skip:(raw,skipReason)=>this.skip(raw,skipReason)});if(candidate)return reserve&&this.triedSelectors.add(rungSelector(candidate.selector)),{chainKey,...candidate};this.lastExhaustedChainKey=chainKey,logDecision&&this.deps.logger.info("candidates_exhausted",{chainKey})}async switchOrRelease(model,thinking,reason){try{await this.deps.switchModel(model,thinking,reason)}catch(error2){throw this.probes.release(),error2}}selectThinking(selector,model,inherited2){let requested=selector.thinkingLevel??inherited2??"off";return clampThinkingLevel(model,requested)}skip(candidate,skipReason){this.deps.logger.debug("candidate_skipped",{candidate,skipReason})}};var SelectorCooldowns=class{constructor(now2,random=Math.random,wallNow=now2){this.expiresAtBySelector=new Map,this.now=now2,this.random=random,this.wallNow=wallNow}note(baseSelector2,failure2){this.expiresAtBySelector.set(baseSelector2,this.now()+this.durationFor(failure2))}isSuppressed(baseSelector2){let expiresAt=this.expiresAtBySelector.get(baseSelector2);return expiresAt===void 0?!1:this.now()<expiresAt?!0:(this.expiresAtBySelector.delete(baseSelector2),!1)}clear(baseSelector2){this.expiresAtBySelector.delete(baseSelector2)}clearModel(baseSelector2){for(let key of this.expiresAtBySelector.keys()){let rung=key.startsWith(`${baseSelector2}:`)&&isValidThinkingLevel(key.slice(baseSelector2.length+1));(key===baseSelector2||rung)&&this.expiresAtBySelector.delete(key)}}clearAll(){this.expiresAtBySelector.clear()}durationFor({retryAfterMs:retryAfterMs4,errorMessage:errorMessage6}){let resetMs=errorMessage6===void 0?void 0:usageLimitResetMs(errorMessage6,this.wallNow()),message=stripProviderRequestIds(errorMessage6??"").toLowerCase(),defaultMs=/usage[- ]limit|quota|insufficient_quota|billing|credits[-_ ]required|credits are required/.test(message)?30*6e4:/rate[ -]?limit|429|too many requests/.test(message)?3e4:/overloaded|capacity/.test(message)?45e3+this.capacityJitterMs():/5xx|\b5\d\d\b|server|internal error/.test(message)?2e4:void 0,retryMs=retryAfterMs4!==void 0&&Number.isFinite(retryAfterMs4)&&retryAfterMs4>0?retryAfterMs4:void 0,hintedMs=Math.max(resetMs??0,retryMs??0);return hintedMs>0?Math.min(MAX_SLOT_BLOCK_MS,hintedMs):defaultMs!==void 0?defaultMs:/"type"\s*:\s*"forbidden"[^}]*request not allowed|request not allowed[^}]*"type"\s*:\s*"forbidden"/.test(message)||isTransportFailureText(message)?6e4:5*6e4}capacityJitterMs(){return Math.round(Math.min(1,Math.max(0,this.random()))*3e4)}};function classifyRateLimitedWait(hintMs,settings){return hintMs===void 0?"no-hint-fast-fallback":hintMs<=settings.hintedWaitCapMs?"tier1-in-turn":hintMs<settings.probeBackMaxMs?"tier2-fallback-probe-back":"tier3-fallback-only"}function probeBackSchedule(hintMs,nowMs){return{firstAtMs:nowMs+Math.ceil(hintMs/2),deadlineMs:nowMs+hintMs}}function nextInTurnDelayMs(state3,hintMs,baseDelayMs,hintedWaitCapMs,nowMs){let exponentialFloorMs=baseDelayMs*2**(state3.attempt-1);if(state3.probePhase==="half-used"){let deadlineMs=hintMs!==void 0?nowMs+hintMs:state3.hintDeadlineMs??nowMs,remaining=Math.max(0,deadlineMs-nowMs),delayMs=Math.max(remaining,exponentialFloorMs),newCumulative=state3.cumulativeHintedWaitMs+delayMs;return{delayMs,probePhase:"done",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}if(state3.probePhase==="idle"&&hintMs!==void 0){let delay5=Math.max(Math.ceil(hintMs/2),exponentialFloorMs),deadlineMs=nowMs+hintMs,newCumulative=state3.cumulativeHintedWaitMs+delay5;return{delayMs:delay5,probePhase:"half-used",hintDeadlineMs:deadlineMs,cumulativeHintedWaitMs:newCumulative,demoteToProbeBack:newCumulative>hintedWaitCapMs}}return{delayMs:Math.max(hintMs??0,exponentialFloorMs),probePhase:"done",hintDeadlineMs:state3.hintDeadlineMs,cumulativeHintedWaitMs:state3.cumulativeHintedWaitMs,demoteToProbeBack:!1}}function degradeWithoutFallback(tier,hintMs,attempt2,baseDelayMs,hintedWaitCapMs){return tier==="tier3-fallback-only"?{kind:"fail",hintMs:hintMs??0}:tier==="tier2-fallback-probe-back"?{kind:"in-turn",delayMs:Math.max(Math.min(hintMs??hintedWaitCapMs,hintedWaitCapMs),baseDelayMs*2**(attempt2-1))}:{kind:"in-turn",delayMs:baseDelayMs*2**(attempt2-1)}}import{closeSync as closeSync2,fchmodSync as fchmodSync2,mkdirSync as mkdirSync5,openSync as openSync2,writeSync as writeSync2}from"node:fs";import{dirname as dirname21,join as join23}from"node:path";var DEFAULT_MAX_BYTES4=5*1024*1024,MAX_STRING_LENGTH2=200,BLOCKED_KEY2=/^(?:__proto__|constructor|prototype|headers?|env(?:ironment)?|authorization|credential(?:s)?|password|secret|token|api_?key|client_?secret)$/i,ALLOWED_DATA_KEY2=/^(?:selector|candidate|currentSelector|originalSelector|from|to|model|chainKey|reason|skipReason|classification|thinkingLevel|durationMs|retryAfterMs|error|errorMessage|warning|trigger)$/,SENSITIVE_TEXT2=/((?:authorization\s*[:=]\s*(?:bearer|basic)\s+)|(?:bearer\s+)|(?:[?&](?:api[_-]?key|token|secret|password|auth(?:orization)?)=))[^\s&,"'}\]]+/gi;function createFallbackLogger(agentDir,options={}){let filePath=join23(agentDir,"logs","fallback.log"),maxBytes=validMaxBytes2(options.maxBytes),reportedWriteFailure2=!1;function log(level,event,data){try{let line=formatLine2(level,event,data);writeLine2(filePath,line,maxBytes)}catch(error2){reportedWriteFailure2||(reportedWriteFailure2=!0,console.error("Unable to write retry fallback debug log",error2))}}return{debug:(event,data)=>log("debug",event,data),info:(event,data)=>log("info",event,data),warn:(event,data)=>log("warn",event,data)}}function validMaxBytes2(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?Math.floor(value):DEFAULT_MAX_BYTES4}function formatLine2(level,event,data){let entry2={ts:new Date().toISOString(),level,event:safeText2(event)};if(data!==void 0){for(let[key,value]of safeEntries(data))if(ALLOWED_DATA_KEY2.test(key)&&!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(value,new WeakSet);safeValue!==void 0&&(entry2[key]=safeValue)}}return JSON.stringify(entry2)}function writeLine2(filePath,line,maxBytes){mkdirSync5(dirname21(filePath),{recursive:!0,mode:448});let text3=`${line}
|
|
176
|
-
`;rotateLogIfNeeded(filePath,Buffer.byteLength(text3),maxBytes);let descriptor=openSync2(filePath,"a",384);try{writeSync2(descriptor,text3),fchmodSync2(descriptor,384)}finally{closeSync2(descriptor)}}function serializeValue2(value,seen){if(typeof value=="string")return safeText2(value);if(typeof value=="bigint")return value.toString();if(typeof value=="number"||typeof value=="boolean"||value===null)return value;if(typeof value>"u")return;if(typeof value=="function"||typeof value=="symbol")return String(value);if(seen.has(value))return"[Circular]";if(seen.add(value),Array.isArray(value))return value.map(item=>serializeValue2(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value))if(!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(item,seen);safeValue!==void 0&&(result3[key]=safeValue)}return result3}function safeEntries(value){try{let entries=[];for(let key of Object.keys(value))try{let item=Reflect.get(value,key);entries.push([key,item])}catch{entries.push([key,"[Unreadable]"])}return entries}catch{return[["unserializable","[Unreadable]"]]}}function safeText2(value){let redacted=value.replace(SENSITIVE_TEXT2,"$1[redacted]");return redacted.length<=MAX_STRING_LENGTH2?redacted:`${redacted.slice(0,MAX_STRING_LENGTH2-3)}...`}var ProbeBackScheduler=class{constructor(opts){this._armed=!1,this._generation=0,this._secondProbeAnnounced=!1,this._now=opts.now,this._setTimeout=opts.setTimeout??((cb,d)=>setTimeout(cb,d)),this._clearTimeout=opts.clearTimeout??(h=>clearTimeout(h))}get active(){return this._armed}arm(input){let gen=++this._generation;if(this._armed&&(this._clearTimers(),this._abortInFlight("superseded"),this._disarm()),this._armed=!0,this._firstTimer={handle:void 0},this._deadlineTimer={handle:void 0},this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1,gen!==this._generation||(input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.firstAtMs,probeIndex:1}),gen!==this._generation))return;let firstDelay=Math.max(0,input.firstAtMs-this._now());this._firstTimer&&(this._firstTimer.handle=this._setTimeout(()=>{this._runProbe(input,1,gen)},firstDelay));let deadlineDelay=Math.max(0,input.deadlineMs-this._now());gen===this._generation&&this._deadlineTimer&&(this._deadlineTimer.handle=this._setTimeout(()=>{this._runDeadlineProbe(input,gen)},deadlineDelay))}cancel(reason){this._generation++,this._clearTimers(),this._abortInFlight(reason),this._disarm()}_clearTimers(){this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._deadlineTimer?.handle!==void 0&&(this._clearTimeout(this._deadlineTimer.handle),this._deadlineTimer.handle=void 0)}_abortInFlight(_reason){this._abortController&&(this._abortController.abort(),this._abortController=void 0),this._activeProbeIndex=void 0}_disarm(){this._armed=!1,this._firstTimer=void 0,this._deadlineTimer=void 0,this._abortController=void 0,this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1}_finish(){this._clearTimers(),this._disarm()}_announceSecondProbe(input,generation2){generation2!==this._generation||this._secondProbeAnnounced||(this._secondProbeAnnounced=!0,input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.deadlineMs,probeIndex:2}))}_runDeadlineProbe(input,generation2){generation2!==this._generation||!this._armed||(this._deadlineTimer&&(this._deadlineTimer.handle=void 0),this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._activeProbeIndex===1&&this._abortInFlight("superseded"),this._announceSecondProbe(input,generation2),generation2===this._generation&&this._runProbe(input,2,generation2))}async _runProbe(input,probeIndex,generation2){let gen=generation2;if(gen!==this._generation||!this._armed)return;if(probeIndex===1&&this._firstTimer?this._firstTimer.handle=void 0:this._deadlineTimer&&(this._deadlineTimer.handle=void 0),!input.authAvailable()){if(gen!==this._generation||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1,errorMessage:"auth-unavailable"}),gen!==this._generation))return;this._finish();return}if(gen!==this._generation||this._activeProbeIndex!==void 0)return;let abortController=new AbortController;this._abortController=abortController,this._activeProbeIndex=probeIndex;let success;try{success=await input.runProbe(abortController.signal)}catch{success=!1}if(!(gen!==this._generation||this._activeProbeIndex!==probeIndex||this._abortController!==abortController)){if(this._abortController=void 0,this._activeProbeIndex=void 0,success){if(gen!==this._generation||(input.onCleared(input.selector),gen!==this._generation)||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!0}),gen!==this._generation))return;this._finish();return}if(probeIndex===1){this._announceSecondProbe(input,gen);return}gen===this._generation&&(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1}),gen===this._generation&&this._finish())}}};var REQUEST_SHAPE_RECOVERY_ENTRY_TYPE="request-shape-recovery",REQUEST_SHAPE_RECOVERY_NOTE="Retried without web search replay data",REQUEST_SHAPE_FAILURE_TEXT="Anthropic rejected this conversation's request format, even after retrying without web search replay data. Run /compact or start a new session to continue, and report it if it happens again.",INVALID_REQUEST_PATTERN=/\binvalid_request_error\b/,ANTHROPIC_PROVIDER="anthropic";function isAnthropicRequestShapeRejection(message,contextWindow){return message.stopReason==="error"&&message.api==="anthropic-messages"&&message.provider===ANTHROPIC_PROVIDER&&INVALID_REQUEST_PATTERN.test(message.errorMessage??"")&&!isBillingErrorMessage(message.errorMessage)&&!isContextOverflow(message,contextWindow)}function stripProviderNativeReplay(messages,cutoff){let strippedBlocks=0;return{messages:messages.map(message=>{if(message.role!=="assistant"||message.timestamp>cutoff)return message;let content=message.content.filter(block=>block.type!=="providerNative");return content.length===message.content.length?message:(strippedBlocks+=message.content.length-content.length,{...message,content})}),strippedBlocks}}var RequestShapeRecovery=class{constructor(){this.attempted=!1}decide(message,contextWindow){return isAnthropicRequestShapeRejection(message,contextWindow)?this.attempted?"give-up":"recover":"not-request-shape"}begin(failedAt){this.attempted=!0,this.cutoff=failedAt}endStreak(){this.attempted=!1}apply(messages){return this.cutoff===void 0?messages:stripProviderNativeReplay(messages,this.cutoff).messages}};function isPlainObject3(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject2,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels2(model).includes(selector.thinkingLevel)&&warnings.push(`${subject2} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function isRungDuplicate(entry2,key){return baseSelector(entry2)!==baseSelector(key)?!1:(entry2.thinkingLevel??key.thinkingLevel)===key.thinkingLevel}function describeValue(value){return value===null?"null":Array.isArray(value)?"an array":`a ${typeof value}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry2=>typeof entry2!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry2 of entries){let bareEntry=parseBareSelector(entry2);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry2,key));continue}let parsedEntry=parseFallbackSelector(entry2,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry2,key));continue}parsedKey&&isRungDuplicate(parsedEntry,parsedKey)&&warnings.push(`Fallback chain entry "${entry2}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry2}"`,warnings)}}return warnings}var INHERITED_KEY="inherited_hold",fenceKey=runRef=>`run_fence:${runRef.kind}:${runRef.id}`;function isRunRef(value){if(typeof value!="object"||value===null)return!1;let ref=value;return typeof ref.kind=="string"&&typeof ref.id=="string"}function inheritedData(hold){let data=hold?.data;if(!(data===void 0||typeof data.parentSessionId!="string"||typeof data.highWater!="number"))return isRunRef(data.runRef)?{parentSessionId:data.parentSessionId,runRef:data.runRef,highWater:data.highWater}:void 0}function localSeq(hold){let seq=hold.data?.localSeq;return typeof seq=="number"?seq:void 0}var RunHolds=class{constructor(ledger){this.ledger=ledger}fence(runRef){this.ledger.addHold("run_fence",{key:fenceKey(runRef),data:{runRef}})}releaseFences(cause,runRefs){let keys=runRefs===void 0?this.ledger.fences.map(hold=>hold.key):runRefs.map(fenceKey);this.ledger.release(keys,cause)}holdsWake(details){let runRef=details?.runRef;return isRunRef(runRef)&&this.ledger.getHold(fenceKey(runRef))!==void 0}inheritedOwner(){return inheritedData(this.ledger.getHold(INHERITED_KEY))}stamp(){let localSeq2=this.ledger.currentPauseSeq+1;this.ledger.addHold("session_hold",{key:`session_hold:${localSeq2}`,data:{localSeq:localSeq2}})}releaseDirectStops(){let direct=this.ledger.holds.filter(hold=>hold.kind==="session_hold");this.ledger.release(direct.map(hold=>hold.key),"input")}inherit(owner){let current=this.inheritedOwner();if(current!==void 0&¤t.parentSessionId!==owner.parentSessionId)return{refused:"wrong_parent"};let highWater=Math.max(current?.highWater??0,owner.parentPauseSeq);return current!==void 0&&this.ledger.release([INHERITED_KEY],"run_resume"),this.ledger.addHold("inherited_hold",{key:INHERITED_KEY,data:{parentSessionId:owner.parentSessionId,runRef:owner.runRef,highWater}}),{childSeq:this.ledger.currentPauseSeq}}releaseInherited(request2){let owner=this.inheritedOwner();if(owner===void 0)return{released:!1,reason:"not_held"};if(owner.parentSessionId!==request2.parentSessionId)return{released:!1,reason:"wrong_parent"};if(request2.parentPauseSeq!==owner.highWater)return{released:!1,reason:"stale"};let direct=this.ledger.holds.filter(hold=>hold.kind==="session_hold"),observed=direct.filter(hold=>(localSeq(hold)??Number.POSITIVE_INFINITY)<=request2.childSeqCutoff);return this.ledger.release([INHERITED_KEY,...observed.map(hold=>hold.key)],"run_resume"),{released:!0,otherHoldLive:direct.length>observed.length}}};function partsOf(content){return typeof content=="string"?[{type:"text",text:content}]:[...content]}async function startRunResumeTurn(ports){let inputs=ports.heldInputs(),continues=ports.continueInputs(),wakes=ports.heldWakes(),content=[...inputs.flatMap(input=>[{type:"text",text:`The user wrote while the run was paused:
|
|
177
|
-
${input.text}`},...input.images??[]]),...wakes.flatMap(wake=>partsOf(wake.message.content)),...partsOf(stopResumeDirective().content)],sendSettled=Promise.withResolvers(),started=ports.turnStarted(sendSettled.promise),sending=ports.send({customType:STOP_RESUME_CUSTOM_TYPE,content,display:inputs.length>0});sending.then(sendSettled.resolve,sendSettled.resolve);let turnId=await started,delivered=(async()=>{await ports.idle();try{await sending}catch(error2){return ports.sendFailed(error2),!1}return turnId===void 0||!ports.current()?!1:(ports.consume([...inputs.map(input=>input.inputId),...continues],wakes.map(wake=>wake.source)),!0)})();return{turnId,delivered}}function isSecurityNoticeState(value){return typeof value!="object"||value===null||!("generation"in value)||typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<0||!("notices"in value)||!Array.isArray(value.notices)?!1:value.notices.every(notice2=>typeof notice2=="object"&¬ice2!==null&&"category"in notice2&&(notice2.category==="skill-link-blocked"||notice2.category==="mcp-env-withheld")&&"message"in notice2&&typeof notice2.message=="string"&&(!("path"in notice2)||notice2.path===void 0||typeof notice2.path=="string"))}var SecurityNoticeSnapshot=class{#notices=new Map;#listeners=new Set;#generation=0;get snapshot(){return{generation:this.#generation,notices:[...this.#notices.values()]}}setResources(diagnostics){let before=JSON.stringify([...this.#notices]);for(let key of this.#notices.keys())key.startsWith("resource:")&&this.#notices.delete(key);for(let diagnostic2 of diagnostics)diagnostic2.category==="skill-link-blocked"&&this.#notices.set(`resource:${diagnostic2.path??diagnostic2.message}`,{category:"skill-link-blocked",message:diagnostic2.message,path:diagnostic2.path});before!==JSON.stringify([...this.#notices])&&this.#publish()}add(notice2){let key=`runtime:${notice2.category}:${notice2.path??notice2.message}`;JSON.stringify(this.#notices.get(key))!==JSON.stringify(notice2)&&(this.#notices.set(key,notice2),this.#publish())}accept(value){if(!(typeof value!="object"||value===null||!("message"in value)||typeof value.message!="string"||!("category"in value)||value.category!=="skill-link-blocked"&&value.category!=="mcp-env-withheld")){if("remove"in value&&value.remove===!0&&"path"in value&&typeof value.path=="string"){this.#notices.delete(`runtime:${value.category}:${value.path}`)&&this.#publish();return}this.add({category:value.category,message:value.message,..."path"in value&&typeof value.path=="string"?{path:value.path}:{}})}}subscribe(listener){return this.#listeners.add(listener),listener(this.snapshot),()=>this.#listeners.delete(listener)}dispose(){this.#listeners.clear()}#publish(){this.#generation++;let snapshot=this.snapshot;for(let listener of this.#listeners)listener(snapshot)}};var RELOCATION_NOT_OFFERED={status:"unavailable",reason:"not_offered",detail:"no app connected to this session offers moving it to another computer"};function createSessionControlActions(deps){let owned=new Set,retired=!1;return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();if(host===void 0)return{status:"unsupported",reason:"unsupported_mode"};let registration=await host.register({...options,drain:async event=>retired?void 0:options.drain(event)});return registration.status!=="registered"?registration:retired?{status:"failed",reason:`stale extension generation after reload${await registration.dispose().then(()=>"",error2=>`; its teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`)}`}:(owned.add(registration),{...registration,dispose:async()=>{owned.delete(registration),await registration.dispose()}})},retire:async()=>{retired=!0;let registrations=[...owned];owned.clear(),await Promise.all(registrations.map(registration=>registration.dispose()))},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow(),relocationOffered:()=>deps.relocationHost()?.offered()??!1,relocationTargets:async signal=>await deps.relocationHost()?.targets(signal)??RELOCATION_NOT_OFFERED,requestRelocation:async(request2,signal)=>await deps.relocationHost()?.request(request2,signal)??RELOCATION_NOT_OFFERED}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized")),relocationOffered:notBound,relocationTargets:()=>Promise.reject(new Error("Extension runtime not initialized")),requestRelocation:()=>Promise.reject(new Error("Extension runtime not initialized"))}}function isAssistantEntry(entry2){return entry2.type==="message"&&entry2.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry2 of entries){if(entry2.type==="message"&&entry2.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry2))continue;let{message}=entry2;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry2.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}var THINKING_LEVELS=new Set(["off","minimal","low","medium","high","xhigh","max"]);function isThinkingLevel(value){return typeof value=="string"&&THINKING_LEVELS.has(value)}function modelThinkingKey(model){return`${model.provider}/${model.id}`}function deriveSessionModelThinkingLevels(path14){let levels={};for(let entry2 of path14)entry2.type==="thinking_level_change"&&(typeof entry2.provider!="string"||typeof entry2.modelId!="string"||isThinkingLevel(entry2.thinkingLevel)&&(levels[modelThinkingKey({provider:entry2.provider,id:entry2.modelId})]=entry2.thinkingLevel));return levels}var SessionThinkingMemory=class{constructor(source2){this.source=source2}levels(){let leafId=this.source.getLeafId();return this.cached?.leafId!==leafId&&(this.cached={leafId,levels:deriveSessionModelThinkingLevels(this.source.getBranch())}),{...this.cached.levels}}levelFor(model){return this.levels()[modelThinkingKey(model)]}};import{randomBytes as randomBytes2}from"node:crypto";import{cp,mkdir as mkdir4,readdir as readdir2,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{basename as basename10,dirname as dirname22,join as join25}from"node:path";import{accessSync,constants}from"node:fs";import{access as access2}from"node:fs/promises";var NARROW_NO_BREAK_SPACE="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function unquotedPath(filePath){return/^@?(["'])(.+)\1$/.exec(filePath.trim())?.[2]}function fileExists(filePath){try{return accessSync(filePath,constants.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access2(filePath,constants.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPath(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPathAsync(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}import{createHash as createHash8}from"node:crypto";import{createReadStream}from"node:fs";import{readFile as readFile3}from"node:fs/promises";import{join as join24,posix,win32 as win322}from"node:path";var MOVE_BUNDLE_FORMAT=1,MANIFEST_FILE="manifest.json",SESSION_BUNDLE_PATH="files/session.jsonl",MoveBundleInvalidError=class extends Error{constructor(detail){super(`The moved session could not be verified (${detail}); it was not imported. The original device keeps it.`),this.code="move_bundle_invalid",this.name="MoveBundleInvalidError"}};async function sha256File(path14){let hash=createHash8("sha256");for await(let chunk of createReadStream(path14))hash.update(chunk);return hash.digest("hex")}var isString=value=>typeof value=="string";function leavesBundle(path14){return posix.isAbsolute(path14)||win322.isAbsolute(path14)||path14.split(/[\\/]/).includes("..")}function parseFile(value){let file=value;if(typeof file!="object"||file===null||!isString(file.path)||!isString(file.sha256))throw new MoveBundleInvalidError("a listed file is malformed");if(leavesBundle(file.path))throw new MoveBundleInvalidError(`a listed path leaves the bundle: ${file.path}`);return{path:file.path,sha256:file.sha256}}var PLAIN_ID=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function isPlainId(value){return typeof value=="string"&&PLAIN_ID.test(value)}function isMoveId(value){return isPlainId(value)}function parsePlainId(value,what){if(typeof value!="string"||!PLAIN_ID.test(value))throw new MoveBundleInvalidError(`the ${what} is not a plain id: ${JSON.stringify(value)}`);return value}function parseMoveId(value){return parsePlainId(value,"move id")}var SESSION_FILE_NAME=/^[A-Za-z0-9][A-Za-z0-9._-]*\.jsonl$/;function parseSessionFileName(value){if(!SESSION_FILE_NAME.test(value)||value.includes(".."))throw new MoveBundleInvalidError(`the session file name is not a plain file name: ${value}`);return value}var KNOWN_PAYLOAD_KINDS=new Set(["extension-state"]),EXTENSION_STATE_PREFIX="state/";function parsePayload(value){let payload=value;if(typeof payload!="object"||payload===null||!isString(payload.kind)||!Array.isArray(payload.files))throw new MoveBundleInvalidError("a payload is malformed");if(!KNOWN_PAYLOAD_KINDS.has(payload.kind))throw new MoveBundleInvalidError("it carries a payload this version cannot import");let files=payload.files.map(parseFile),outside=files.find(file=>!file.path.startsWith(EXTENSION_STATE_PREFIX));if(outside!==void 0)throw new MoveBundleInvalidError(`an extension-state file is listed outside state/: ${outside.path}`);return{kind:payload.kind,files}}async function readManifest(bundleDir){let raw;try{raw=JSON.parse(await readFile3(join24(bundleDir,MANIFEST_FILE),"utf8"))}catch(error2){throw new MoveBundleInvalidError(`manifest unreadable: ${error2 instanceof Error?error2.message:String(error2)}`)}let m=raw;if(m.format!==MOVE_BUNDLE_FORMAT)throw new MoveBundleInvalidError(`unknown bundle format ${String(m.format)}`);for(let key of["moveId","sessionId","sessionFileName","sourceCwd"])if(!isString(m[key]))throw new MoveBundleInvalidError(`missing ${key}`);let payloads=(Array.isArray(m.payloads)?m.payloads:[]).map(parsePayload),dropped=Array.isArray(m.droppedUserMessages)?m.droppedUserMessages:[];if(!dropped.every(isString))throw new MoveBundleInvalidError("malformed queued input");return{format:MOVE_BUNDLE_FORMAT,moveId:parseMoveId(m.moveId),sessionId:parsePlainId(m.sessionId,"session id"),sessionFileName:parseSessionFileName(m.sessionFileName),sourceCwd:m.sourceCwd,repository:parseRepositoryIdentity(m.repository),session:parseFile(m.session),sidecars:(Array.isArray(m.sidecars)?m.sidecars:[]).map(parseFile),droppedUserMessages:dropped,payloads}}async function verifyBundle(bundleDir,manifest){for(let file of[manifest.session,...manifest.sidecars,...manifest.payloads.flatMap(p=>p.files)]){let actual;try{actual=await sha256File(join24(bundleDir,file.path))}catch{throw new MoveBundleInvalidError(`missing ${file.path}`)}if(actual!==file.sha256)throw new MoveBundleInvalidError(`${file.path} changed in transit`)}let header2=(await readFile3(join24(bundleDir,manifest.session.path),"utf8")).split(`
|
|
176
|
+
`;rotateLogIfNeeded(filePath,Buffer.byteLength(text3),maxBytes);let descriptor=openSync2(filePath,"a",384);try{writeSync2(descriptor,text3),fchmodSync2(descriptor,384)}finally{closeSync2(descriptor)}}function serializeValue2(value,seen){if(typeof value=="string")return safeText2(value);if(typeof value=="bigint")return value.toString();if(typeof value=="number"||typeof value=="boolean"||value===null)return value;if(typeof value>"u")return;if(typeof value=="function"||typeof value=="symbol")return String(value);if(seen.has(value))return"[Circular]";if(seen.add(value),Array.isArray(value))return value.map(item=>serializeValue2(item,seen)??null);let result3={};for(let[key,item]of safeEntries(value))if(!BLOCKED_KEY2.test(key)){let safeValue=serializeValue2(item,seen);safeValue!==void 0&&(result3[key]=safeValue)}return result3}function safeEntries(value){try{let entries=[];for(let key of Object.keys(value))try{let item=Reflect.get(value,key);entries.push([key,item])}catch{entries.push([key,"[Unreadable]"])}return entries}catch{return[["unserializable","[Unreadable]"]]}}function safeText2(value){let redacted=value.replace(SENSITIVE_TEXT2,"$1[redacted]");return redacted.length<=MAX_STRING_LENGTH2?redacted:`${redacted.slice(0,MAX_STRING_LENGTH2-3)}...`}var ProbeBackScheduler=class{constructor(opts){this._armed=!1,this._generation=0,this._secondProbeAnnounced=!1,this._now=opts.now,this._setTimeout=opts.setTimeout??((cb,d)=>setTimeout(cb,d)),this._clearTimeout=opts.clearTimeout??(h=>clearTimeout(h))}get active(){return this._armed}arm(input){let gen=++this._generation;if(this._armed&&(this._clearTimers(),this._abortInFlight("superseded"),this._disarm()),this._armed=!0,this._firstTimer={handle:void 0},this._deadlineTimer={handle:void 0},this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1,gen!==this._generation||(input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.firstAtMs,probeIndex:1}),gen!==this._generation))return;let firstDelay=Math.max(0,input.firstAtMs-this._now());this._firstTimer&&(this._firstTimer.handle=this._setTimeout(()=>{this._runProbe(input,1,gen)},firstDelay));let deadlineDelay=Math.max(0,input.deadlineMs-this._now());gen===this._generation&&this._deadlineTimer&&(this._deadlineTimer.handle=this._setTimeout(()=>{this._runDeadlineProbe(input,gen)},deadlineDelay))}cancel(reason){this._generation++,this._clearTimers(),this._abortInFlight(reason),this._disarm()}_clearTimers(){this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._deadlineTimer?.handle!==void 0&&(this._clearTimeout(this._deadlineTimer.handle),this._deadlineTimer.handle=void 0)}_abortInFlight(_reason){this._abortController&&(this._abortController.abort(),this._abortController=void 0),this._activeProbeIndex=void 0}_disarm(){this._armed=!1,this._firstTimer=void 0,this._deadlineTimer=void 0,this._abortController=void 0,this._activeProbeIndex=void 0,this._secondProbeAnnounced=!1}_finish(){this._clearTimers(),this._disarm()}_announceSecondProbe(input,generation2){generation2!==this._generation||this._secondProbeAnnounced||(this._secondProbeAnnounced=!0,input.emit({type:"retry_probe_scheduled",selector:input.selector,atMs:input.deadlineMs,probeIndex:2}))}_runDeadlineProbe(input,generation2){generation2!==this._generation||!this._armed||(this._deadlineTimer&&(this._deadlineTimer.handle=void 0),this._firstTimer?.handle!==void 0&&(this._clearTimeout(this._firstTimer.handle),this._firstTimer.handle=void 0),this._activeProbeIndex===1&&this._abortInFlight("superseded"),this._announceSecondProbe(input,generation2),generation2===this._generation&&this._runProbe(input,2,generation2))}async _runProbe(input,probeIndex,generation2){let gen=generation2;if(gen!==this._generation||!this._armed)return;if(probeIndex===1&&this._firstTimer?this._firstTimer.handle=void 0:this._deadlineTimer&&(this._deadlineTimer.handle=void 0),!input.authAvailable()){if(gen!==this._generation||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1,errorMessage:"auth-unavailable"}),gen!==this._generation))return;this._finish();return}if(gen!==this._generation||this._activeProbeIndex!==void 0)return;let abortController=new AbortController;this._abortController=abortController,this._activeProbeIndex=probeIndex;let success;try{success=await input.runProbe(abortController.signal)}catch{success=!1}if(!(gen!==this._generation||this._activeProbeIndex!==probeIndex||this._abortController!==abortController)){if(this._abortController=void 0,this._activeProbeIndex=void 0,success){if(gen!==this._generation||(input.onCleared(input.selector),gen!==this._generation)||(input.emit({type:"retry_probe_result",selector:input.selector,ok:!0}),gen!==this._generation))return;this._finish();return}if(probeIndex===1){this._announceSecondProbe(input,gen);return}gen===this._generation&&(input.emit({type:"retry_probe_result",selector:input.selector,ok:!1}),gen===this._generation&&this._finish())}}};var REQUEST_SHAPE_RECOVERY_ENTRY_TYPE="request-shape-recovery",REQUEST_SHAPE_RECOVERY_NOTE="Retried without web search replay data",REQUEST_SHAPE_FAILURE_TEXT="Anthropic rejected this conversation's request format, even after retrying without web search replay data. Run /compact or start a new session to continue, and report it if it happens again.",INVALID_REQUEST_PATTERN=/\binvalid_request_error\b/,ANTHROPIC_PROVIDER="anthropic";function isAnthropicRequestShapeRejection(message,contextWindow){return message.stopReason==="error"&&message.api==="anthropic-messages"&&message.provider===ANTHROPIC_PROVIDER&&INVALID_REQUEST_PATTERN.test(message.errorMessage??"")&&!isBillingErrorMessage(message.errorMessage)&&!isContextOverflow(message,contextWindow)}function stripProviderNativeReplay(messages,cutoff){let strippedBlocks=0;return{messages:messages.map(message=>{if(message.role!=="assistant"||message.timestamp>cutoff)return message;let content=message.content.filter(block=>block.type!=="providerNative");return content.length===message.content.length?message:(strippedBlocks+=message.content.length-content.length,{...message,content})}),strippedBlocks}}var RequestShapeRecovery=class{constructor(){this.attempted=!1}decide(message,contextWindow){return isAnthropicRequestShapeRejection(message,contextWindow)?this.attempted?"give-up":"recover":"not-request-shape"}begin(failedAt){this.attempted=!0,this.cutoff=failedAt}endStreak(){this.attempted=!1}apply(messages){return this.cutoff===void 0?messages:stripProviderNativeReplay(messages,this.cutoff).messages}};function isPlainObject3(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function invalidSelectorWarning(kind,selector,key){return`${kind==="key"?`Fallback chain key "${selector}"`:`Fallback chain entry "${selector}" for "${key}"`} is not a valid or known model selector.`}function validateThinkingLevel(selector,model,subject2,warnings){selector.thinkingLevel&&!getSupportedThinkingLevels2(model).includes(selector.thinkingLevel)&&warnings.push(`${subject2} uses thinking level "${selector.thinkingLevel}", which is unsupported by ${selector.provider}/${selector.id}.`)}function isRungDuplicate(entry2,key){return baseSelector(entry2)!==baseSelector(key)?!1:(entry2.thinkingLevel??key.thinkingLevel)===key.thinkingLevel}function describeValue(value){return value===null?"null":Array.isArray(value)?"an array":`a ${typeof value}`}function validateFallbackChains(chains,registry){if(chains===void 0)return[];if(!isPlainObject3(chains))return[`Fallback chains must be a plain object, but got ${describeValue(chains)}.`];let warnings=[],models=registry.getAll();for(let[key,entries]of Object.entries(chains)){let hasProvider=key.includes("/"),hasWildcard=key.includes("*"),bareKey=hasWildcard?void 0:parseBareSelector(key),bareKeyMatches=bareKey?models.some(model=>matchesFamily(model,bareKey.family)):!1;!hasProvider&&!bareKeyMatches&&!hasWildcard&&warnings.push(`Fallback chain key "${key}" must use a provider/model selector; roles are unsupported.`),hasWildcard&&key!=="*"&&warnings.push(`Fallback chain key "${key}" cannot contain wildcards.`);let parsedKey=hasProvider&&!hasWildcard?parseFallbackSelector(key,models):void 0,keyModel=parsedKey?registry.find(parsedKey.provider,parsedKey.id):void 0;if(hasProvider&&!hasWildcard&&(!parsedKey||!keyModel)&&warnings.push(invalidSelectorWarning("key",key)),parsedKey&&keyModel&&validateThinkingLevel(parsedKey,keyModel,`Fallback chain key "${key}"`,warnings),!Array.isArray(entries)||entries.some(entry2=>typeof entry2!="string")){warnings.push(`Fallback chain "${key}" entries must be an array of strings.`);continue}if(entries.length!==0)for(let entry2 of entries){let bareEntry=parseBareSelector(entry2);if(bareEntry){models.some(model=>matchesFamily(model,bareEntry.family))||warnings.push(invalidSelectorWarning("entry",entry2,key));continue}let parsedEntry=parseFallbackSelector(entry2,models),entryModel=parsedEntry?registry.find(parsedEntry.provider,parsedEntry.id):void 0;if(!parsedEntry||!entryModel){warnings.push(invalidSelectorWarning("entry",entry2,key));continue}parsedKey&&isRungDuplicate(parsedEntry,parsedKey)&&warnings.push(`Fallback chain entry "${entry2}" for "${key}" cannot reference the same model.`),validateThinkingLevel(parsedEntry,entryModel,`Fallback chain entry "${entry2}"`,warnings)}}return warnings}var INHERITED_KEY="inherited_hold",fenceKey=runRef=>`run_fence:${runRef.kind}:${runRef.id}`;function isRunRef(value){if(typeof value!="object"||value===null)return!1;let ref=value;return typeof ref.kind=="string"&&typeof ref.id=="string"}function inheritedData(hold){let data=hold?.data;if(!(data===void 0||typeof data.parentSessionId!="string"||typeof data.highWater!="number"))return isRunRef(data.runRef)?{parentSessionId:data.parentSessionId,runRef:data.runRef,highWater:data.highWater}:void 0}function localSeq(hold){let seq=hold.data?.localSeq;return typeof seq=="number"?seq:void 0}var RunHolds=class{constructor(ledger){this.ledger=ledger}fence(runRef){this.ledger.addHold("run_fence",{key:fenceKey(runRef),data:{runRef}})}releaseFences(cause,runRefs){let keys=runRefs===void 0?this.ledger.fences.map(hold=>hold.key):runRefs.map(fenceKey);this.ledger.release(keys,cause)}holdsWake(details){let runRef=details?.runRef;return isRunRef(runRef)&&this.ledger.getHold(fenceKey(runRef))!==void 0}inheritedOwner(){return inheritedData(this.ledger.getHold(INHERITED_KEY))}stamp(){let localSeq2=this.ledger.currentPauseSeq+1;this.ledger.addHold("session_hold",{key:`session_hold:${localSeq2}`,data:{localSeq:localSeq2}})}releaseDirectStops(){let direct=this.ledger.holds.filter(hold=>hold.kind==="session_hold");this.ledger.release(direct.map(hold=>hold.key),"input")}inherit(owner){let current=this.inheritedOwner();if(current!==void 0&¤t.parentSessionId!==owner.parentSessionId)return{refused:"wrong_parent"};let highWater=Math.max(current?.highWater??0,owner.parentPauseSeq);return current!==void 0&&this.ledger.release([INHERITED_KEY],"run_resume"),this.ledger.addHold("inherited_hold",{key:INHERITED_KEY,data:{parentSessionId:owner.parentSessionId,runRef:owner.runRef,highWater}}),{childSeq:this.ledger.currentPauseSeq}}releaseInherited(request2){let owner=this.inheritedOwner();if(owner===void 0)return{released:!1,reason:"not_held"};if(owner.parentSessionId!==request2.parentSessionId)return{released:!1,reason:"wrong_parent"};if(request2.parentPauseSeq!==owner.highWater)return{released:!1,reason:"stale"};let direct=this.ledger.holds.filter(hold=>hold.kind==="session_hold"),observed=direct.filter(hold=>(localSeq(hold)??Number.POSITIVE_INFINITY)<=request2.childSeqCutoff);return this.ledger.release([INHERITED_KEY,...observed.map(hold=>hold.key)],"run_resume"),{released:!0,otherHoldLive:direct.length>observed.length}}};function partsOf(content){return typeof content=="string"?[{type:"text",text:content}]:[...content]}async function startRunResumeTurn(ports){let inputs=ports.heldInputs(),continues=ports.continueInputs(),wakes=ports.heldWakes(),directive=stopResumeDirective(ports.resumeCause),content=[...inputs.flatMap(input=>[{type:"text",text:`The user wrote while the run was paused:
|
|
177
|
+
${input.text}`},...input.images??[]]),...wakes.flatMap(wake=>partsOf(wake.message.content)),...partsOf(directive.content)],sendSettled=Promise.withResolvers(),started=ports.turnStarted(sendSettled.promise),sending=ports.send({...directive,content,display:inputs.length>0});sending.then(sendSettled.resolve,sendSettled.resolve);let turnId=await started,delivered=(async()=>{await ports.idle();try{await sending}catch(error2){return ports.sendFailed(error2),!1}return turnId===void 0||!ports.current()?!1:(ports.consume([...inputs.map(input=>input.inputId),...continues],wakes.map(wake=>wake.source)),!0)})();return{turnId,delivered}}function isSecurityNoticeState(value){return typeof value!="object"||value===null||!("generation"in value)||typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<0||!("notices"in value)||!Array.isArray(value.notices)?!1:value.notices.every(notice2=>typeof notice2=="object"&¬ice2!==null&&"category"in notice2&&(notice2.category==="skill-link-blocked"||notice2.category==="mcp-env-withheld")&&"message"in notice2&&typeof notice2.message=="string"&&(!("path"in notice2)||notice2.path===void 0||typeof notice2.path=="string"))}var SecurityNoticeSnapshot=class{#notices=new Map;#listeners=new Set;#generation=0;get snapshot(){return{generation:this.#generation,notices:[...this.#notices.values()]}}setResources(diagnostics){let before=JSON.stringify([...this.#notices]);for(let key of this.#notices.keys())key.startsWith("resource:")&&this.#notices.delete(key);for(let diagnostic2 of diagnostics)diagnostic2.category==="skill-link-blocked"&&this.#notices.set(`resource:${diagnostic2.path??diagnostic2.message}`,{category:"skill-link-blocked",message:diagnostic2.message,path:diagnostic2.path});before!==JSON.stringify([...this.#notices])&&this.#publish()}add(notice2){let key=`runtime:${notice2.category}:${notice2.path??notice2.message}`;JSON.stringify(this.#notices.get(key))!==JSON.stringify(notice2)&&(this.#notices.set(key,notice2),this.#publish())}accept(value){if(!(typeof value!="object"||value===null||!("message"in value)||typeof value.message!="string"||!("category"in value)||value.category!=="skill-link-blocked"&&value.category!=="mcp-env-withheld")){if("remove"in value&&value.remove===!0&&"path"in value&&typeof value.path=="string"){this.#notices.delete(`runtime:${value.category}:${value.path}`)&&this.#publish();return}this.add({category:value.category,message:value.message,..."path"in value&&typeof value.path=="string"?{path:value.path}:{}})}}subscribe(listener){return this.#listeners.add(listener),listener(this.snapshot),()=>this.#listeners.delete(listener)}dispose(){this.#listeners.clear()}#publish(){this.#generation++;let snapshot=this.snapshot;for(let listener of this.#listeners)listener(snapshot)}};var RELOCATION_NOT_OFFERED={status:"unavailable",reason:"not_offered",detail:"no app connected to this session offers moving it to another computer"};function createSessionControlActions(deps){let owned=new Set,retired=!1;return{registerControlEndpoint:async options=>{if(process.platform==="win32")return{status:"unsupported",reason:"unsupported_platform"};let host=deps.host();if(host===void 0)return{status:"unsupported",reason:"unsupported_mode"};let registration=await host.register({...options,drain:async event=>retired?void 0:options.drain(event)});return registration.status!=="registered"?registration:retired?{status:"failed",reason:`stale extension generation after reload${await registration.dispose().then(()=>"",error2=>`; its teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`)}`}:(owned.add(registration),{...registration,dispose:async()=>{owned.delete(registration),await registration.dispose()}})},retire:async()=>{retired=!0;let registrations=[...owned];owned.clear(),await Promise.all(registrations.map(registration=>registration.dispose()))},admissionGate:()=>deps.admission.gate(),admitExternalMessage:input=>deps.admission.admit(input),listAdmittedDeliveries:()=>deps.admission.list(),persistHeaderNow:()=>deps.sessionManager.persistHeaderNow(),relocationOffered:()=>deps.relocationHost()?.offered()??!1,relocationTargets:async signal=>await deps.relocationHost()?.targets(signal)??RELOCATION_NOT_OFFERED,requestRelocation:async(request2,signal)=>await deps.relocationHost()?.request(request2,signal)??RELOCATION_NOT_OFFERED}}function unboundSessionControlActions(){let notBound=()=>{throw new Error("Extension runtime not initialized. pi.session cannot be used during extension loading.")};return{registerControlEndpoint:()=>Promise.reject(new Error("Extension runtime not initialized")),admissionGate:notBound,admitExternalMessage:notBound,listAdmittedDeliveries:notBound,persistHeaderNow:()=>Promise.reject(new Error("Extension runtime not initialized")),relocationOffered:notBound,relocationTargets:()=>Promise.reject(new Error("Extension runtime not initialized")),requestRelocation:()=>Promise.reject(new Error("Extension runtime not initialized"))}}function isAssistantEntry(entry2){return entry2.type==="message"&&entry2.message.role==="assistant"}function requestDurationMs(recordedAt,startedAt){let endedAt=Date.parse(recordedAt);return Number.isFinite(endedAt)&&Number.isFinite(startedAt)&&endedAt>startedAt?endedAt-startedAt:0}function computeSessionFailureReport(entries){let requests=0,erroredRequests=0,abortedRequests=0,failedDurationMs=0,postFailureRequests=0,postFailureFullMissRequests=0,postFailureFullMissInputTokens=0,previousFailed=!1;for(let entry2 of entries){if(entry2.type==="message"&&entry2.message.role==="user"){previousFailed=!1;continue}if(!isAssistantEntry(entry2))continue;let{message}=entry2;requests++;let failed=message.stopReason==="error"||message.stopReason==="aborted";if(failed)message.stopReason==="error"?erroredRequests++:abortedRequests++,failedDurationMs+=requestDurationMs(entry2.timestamp,message.timestamp);else if(previousFailed){postFailureRequests++;let uncachedTokens=message.usage.input+message.usage.cacheWrite;message.usage.cacheRead===0&&uncachedTokens>=2048&&(postFailureFullMissRequests++,postFailureFullMissInputTokens+=uncachedTokens)}previousFailed=failed}return{requests,erroredRequests,abortedRequests,failureShare:requests>0?(erroredRequests+abortedRequests)/requests:0,failedDurationMs,postFailureRequests,postFailureFullMissRequests,postFailureFullMissInputTokens}}var THINKING_LEVELS=new Set(["off","minimal","low","medium","high","xhigh","max"]);function isThinkingLevel(value){return typeof value=="string"&&THINKING_LEVELS.has(value)}function modelThinkingKey(model){return`${model.provider}/${model.id}`}function deriveSessionModelThinkingLevels(path14){let levels={};for(let entry2 of path14)entry2.type==="thinking_level_change"&&(typeof entry2.provider!="string"||typeof entry2.modelId!="string"||isThinkingLevel(entry2.thinkingLevel)&&(levels[modelThinkingKey({provider:entry2.provider,id:entry2.modelId})]=entry2.thinkingLevel));return levels}var SessionThinkingMemory=class{constructor(source2){this.source=source2}levels(){let leafId=this.source.getLeafId();return this.cached?.leafId!==leafId&&(this.cached={leafId,levels:deriveSessionModelThinkingLevels(this.source.getBranch())}),{...this.cached.levels}}levelFor(model){return this.levels()[modelThinkingKey(model)]}};import{randomBytes as randomBytes2}from"node:crypto";import{cp,mkdir as mkdir4,readdir as readdir2,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{basename as basename10,dirname as dirname22,join as join25}from"node:path";import{accessSync,constants}from"node:fs";import{access as access2}from"node:fs/promises";var NARROW_NO_BREAK_SPACE="\u202F";function tryMacOSScreenshotPath(filePath){return filePath.replace(/ (AM|PM)\./gi,`${NARROW_NO_BREAK_SPACE}$1.`)}function tryNFDVariant(filePath){return filePath.normalize("NFD")}function tryCurlyQuoteVariant(filePath){return filePath.replace(/'/g,"\u2019")}function unquotedPath(filePath){return/^@?(["'])(.+)\1$/.exec(filePath.trim())?.[2]}function fileExists(filePath){try{return accessSync(filePath,constants.F_OK),!0}catch{return!1}}async function pathExists(filePath){try{return await access2(filePath,constants.F_OK),!0}catch{return!1}}function resolveToCwd(filePath,cwd){return resolvePath(filePath,cwd,{normalizeUnicodeSpaces:!0,stripAtPrefix:!0})}function resolveReadPath(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(fileExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPath(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&fileExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&fileExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&fileExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&fileExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}async function resolveReadPathAsync(filePath,cwd){let resolved=resolveToCwd(filePath,cwd);if(await pathExists(resolved))return resolved;let unquoted=unquotedPath(filePath);if(unquoted!==void 0)return resolveReadPathAsync(unquoted,cwd);let amPmVariant=tryMacOSScreenshotPath(resolved);if(amPmVariant!==resolved&&await pathExists(amPmVariant))return amPmVariant;let nfdVariant=tryNFDVariant(resolved);if(nfdVariant!==resolved&&await pathExists(nfdVariant))return nfdVariant;let curlyVariant=tryCurlyQuoteVariant(resolved);if(curlyVariant!==resolved&&await pathExists(curlyVariant))return curlyVariant;let nfdCurlyVariant=tryCurlyQuoteVariant(nfdVariant);return nfdCurlyVariant!==resolved&&await pathExists(nfdCurlyVariant)?nfdCurlyVariant:resolved}import{createHash as createHash8}from"node:crypto";import{createReadStream}from"node:fs";import{readFile as readFile3}from"node:fs/promises";import{join as join24,posix,win32 as win322}from"node:path";var MOVE_BUNDLE_FORMAT=1,MANIFEST_FILE="manifest.json",SESSION_BUNDLE_PATH="files/session.jsonl",MoveBundleInvalidError=class extends Error{constructor(detail){super(`The moved session could not be verified (${detail}); it was not imported. The original device keeps it.`),this.code="move_bundle_invalid",this.name="MoveBundleInvalidError"}};async function sha256File(path14){let hash=createHash8("sha256");for await(let chunk of createReadStream(path14))hash.update(chunk);return hash.digest("hex")}var isString=value=>typeof value=="string";function leavesBundle(path14){return posix.isAbsolute(path14)||win322.isAbsolute(path14)||path14.split(/[\\/]/).includes("..")}function parseFile(value){let file=value;if(typeof file!="object"||file===null||!isString(file.path)||!isString(file.sha256))throw new MoveBundleInvalidError("a listed file is malformed");if(leavesBundle(file.path))throw new MoveBundleInvalidError(`a listed path leaves the bundle: ${file.path}`);return{path:file.path,sha256:file.sha256}}var PLAIN_ID=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function isPlainId(value){return typeof value=="string"&&PLAIN_ID.test(value)}function isMoveId(value){return isPlainId(value)}function parsePlainId(value,what){if(typeof value!="string"||!PLAIN_ID.test(value))throw new MoveBundleInvalidError(`the ${what} is not a plain id: ${JSON.stringify(value)}`);return value}function parseMoveId(value){return parsePlainId(value,"move id")}var SESSION_FILE_NAME=/^[A-Za-z0-9][A-Za-z0-9._-]*\.jsonl$/;function parseSessionFileName(value){if(!SESSION_FILE_NAME.test(value)||value.includes(".."))throw new MoveBundleInvalidError(`the session file name is not a plain file name: ${value}`);return value}var KNOWN_PAYLOAD_KINDS=new Set(["extension-state"]),EXTENSION_STATE_PREFIX="state/";function parsePayload(value){let payload=value;if(typeof payload!="object"||payload===null||!isString(payload.kind)||!Array.isArray(payload.files))throw new MoveBundleInvalidError("a payload is malformed");if(!KNOWN_PAYLOAD_KINDS.has(payload.kind))throw new MoveBundleInvalidError("it carries a payload this version cannot import");let files=payload.files.map(parseFile),outside=files.find(file=>!file.path.startsWith(EXTENSION_STATE_PREFIX));if(outside!==void 0)throw new MoveBundleInvalidError(`an extension-state file is listed outside state/: ${outside.path}`);return{kind:payload.kind,files}}async function readManifest(bundleDir){let raw;try{raw=JSON.parse(await readFile3(join24(bundleDir,MANIFEST_FILE),"utf8"))}catch(error2){throw new MoveBundleInvalidError(`manifest unreadable: ${error2 instanceof Error?error2.message:String(error2)}`)}let m=raw;if(m.format!==MOVE_BUNDLE_FORMAT)throw new MoveBundleInvalidError(`unknown bundle format ${String(m.format)}`);for(let key of["moveId","sessionId","sessionFileName","sourceCwd"])if(!isString(m[key]))throw new MoveBundleInvalidError(`missing ${key}`);let payloads=(Array.isArray(m.payloads)?m.payloads:[]).map(parsePayload),dropped=Array.isArray(m.droppedUserMessages)?m.droppedUserMessages:[];if(!dropped.every(isString))throw new MoveBundleInvalidError("malformed queued input");return{format:MOVE_BUNDLE_FORMAT,moveId:parseMoveId(m.moveId),sessionId:parsePlainId(m.sessionId,"session id"),sessionFileName:parseSessionFileName(m.sessionFileName),sourceCwd:m.sourceCwd,repository:parseRepositoryIdentity(m.repository),session:parseFile(m.session),sidecars:(Array.isArray(m.sidecars)?m.sidecars:[]).map(parseFile),droppedUserMessages:dropped,payloads}}async function verifyBundle(bundleDir,manifest){for(let file of[manifest.session,...manifest.sidecars,...manifest.payloads.flatMap(p=>p.files)]){let actual;try{actual=await sha256File(join24(bundleDir,file.path))}catch{throw new MoveBundleInvalidError(`missing ${file.path}`)}if(actual!==file.sha256)throw new MoveBundleInvalidError(`${file.path} changed in transit`)}let header2=(await readFile3(join24(bundleDir,manifest.session.path),"utf8")).split(`
|
|
178
178
|
`,1)[0]??"",id;try{id=JSON.parse(header2).id}catch{id=void 0}if(id!==manifest.sessionId)throw new MoveBundleInvalidError("the session file's own id does not match the bundle's session id")}var EXTENSION_STATE_PAYLOAD="extension-state",MOVED_STATE_RESTORED="session_move_state_restored",STATE_ATTEMPT_FIELD="state_attempt",MOVE_STATE=".move-state",DELIVERED_MARKER="delivered",DELIVERY_COPY="attempt-",newAttempt=()=>randomBytes2(8).toString("hex");function outgoingStateDir(sessionFile,moveId){return join25(dirname22(sessionFile),MOVE_STATE,"out",parseMoveId(moveId))}function movedStateDir(sessionFile,moveId){return join25(dirname22(sessionFile),MOVE_STATE,"in",`${basename10(sessionFile,".jsonl")}.${parseMoveId(moveId)}`)}var field=(entry2,name)=>{let{data}=entry2;if(typeof data!="object"||data===null||!(name in data))return;let value=Reflect.get(data,name);return typeof value=="string"?value:void 0},moveIdOf=entry2=>field(entry2,"move_id");function sealedAttempt(entries,moveId){let seal=entries.findLast(entry2=>entry2.type==="custom"&&entry2.customType===SESSION_RELEASED&&moveIdOf(entry2)===moveId),attempt2=seal===void 0?void 0:field(seal,STATE_ATTEMPT_FIELD);return isPlainId(attempt2)?attempt2:void 0}async function sealedOutgoingStateDir(sessionFile,moveId){let attempt2=sealedAttempt(await loadEntriesFromFileAsync(sessionFile),moveId);return attempt2===void 0?void 0:join25(outgoingStateDir(sessionFile,moveId),attempt2)}async function prepareOutgoingState(sessionFile,moveId){let root=outgoingStateDir(sessionFile,moveId),sealed=sealedAttempt(await loadEntriesFromFileAsync(sessionFile),moveId);if(await pathExists(root))for(let name of await readdir2(root))name!==sealed&&await rm3(join25(root,name),{recursive:!0,force:!0});let attempt2=newAttempt(),dir=join25(root,attempt2);return await mkdir4(dir,{recursive:!0}),{attempt:attempt2,dir}}async function pendingMovedState(sessionFile){if(!await pathExists(sessionFile))return;let entries=await loadEntriesFromFileAsync(sessionFile),movedIn=entries.findLast(entry2=>entry2.type==="custom"&&entry2.customType===SESSION_MOVED_IN),moveId=movedIn===void 0?void 0:moveIdOf(movedIn);if(moveId===void 0||entries.some(entry2=>entry2.type==="custom"&&entry2.customType===MOVED_STATE_RESTORED&&moveIdOf(entry2)===moveId))return;let id=parseMoveId(moveId),dir=movedStateDir(sessionFile,id);return await pathExists(dir)?{moveId:id,dir}:void 0}var deliveryDir=pendingDir=>join25(dirname22(dirname22(pendingDir)),"delivery",basename10(pendingDir));async function restoreMovedState(sessionManager,deliver3){let sessionFile=sessionManager.getSessionFile();if(sessionFile===void 0)return;let pending=await pendingMovedState(sessionFile);if(pending===void 0)return;let bookkeeping=deliveryDir(pending.dir),marker=join25(bookkeeping,DELIVERED_MARKER),redelivered=await pathExists(marker);if(await pathExists(bookkeeping))for(let name of await readdir2(bookkeeping))name.startsWith(DELIVERY_COPY)&&await rm3(join25(bookkeeping,name),{recursive:!0,force:!0});await mkdir4(bookkeeping,{recursive:!0}),await writeFile3(marker,"");let copy=join25(bookkeeping,`${DELIVERY_COPY}${newAttempt()}`);await cp(pending.dir,copy,{recursive:!0});let restored;try{restored=await deliver3({moveId:pending.moveId,dir:copy,redelivered})}finally{await rm3(copy,{recursive:!0,force:!0})}restored&&(sessionManager.appendCustomEntry(MOVED_STATE_RESTORED,{move_id:pending.moveId,restored_at:new Date().toISOString()}),await rm3(pending.dir,{recursive:!0,force:!0}),await rm3(bookkeeping,{recursive:!0,force:!0}))}var REASONING_MANDATORY_ERROR=/reasoning is mandatory/i;function initialTitleReasoning(model){if(!model.reasoning)return;let levels=getSupportedThinkingLevels(model);if(!levels.includes("off"))return asReasoningLevel(levels[0])}function mandatoryReasoningRetryLevel(model,sentReasoning,errorMessage6){if(!(sentReasoning!==void 0||errorMessage6===void 0)&&REASONING_MANDATORY_ERROR.test(errorMessage6))return asReasoningLevel(clampThinkingLevel(model,"low"))}function asReasoningLevel(level){return level===void 0||level==="off"?void 0:level}var TITLE_SYSTEM_PROMPT=`Generate a concise title for this coding-agent session.
|
|
179
179
|
|
|
180
180
|
Rules:
|
|
@@ -296,7 +296,7 @@ ${renderedLines.slice(0,maxLines).map(line=>lang?line:theme2.fg("toolOutput",lin
|
|
|
296
296
|
|
|
297
297
|
${sentences.join(`
|
|
298
298
|
|
|
299
|
-
`)}`:prompt}async _runInputHandlers(text3,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text3,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text3,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:text3,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text3,options){let barrierError=options?.toolBarrier===void 0?void 0:toolBarrierSpecError(options.toolBarrier);if(barrierError!==void 0)throw new Error(barrierError);isHumanInput(options)&&options?.humanInputReported!==!0&&this._humanInputAdmitted(promptKind(options));let hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text3,options),submittedByCommand:options?.source==="extension"});this._promptsInFlight++;let observedPauseSeq=this._engineTurnHold.currentPauseSeq,heldByNewerStop=!1;try{let origin=options?.inputOrigin??inputOriginOf(options?.source);if(origin==="person"&&this._runHolds.inheritedOwner()!==void 0){this._holdForRun(text3,options),hold.accepted(),options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}if(origin==="person"){this._beginPersonInput();let heldCommands=this._takeHeldCommandRun();heldCommands!==void 0&&await heldCommands}await this._prompt(text3,{...options,observedPauseSeq,onHeldByNewerStop:()=>{heldByNewerStop=!0},promptDisposition:disposition=>{disposition!=="started"&&hold.accepted(),!heldByNewerStop&&(disposition==="started"||disposition==="queued")&&this._engineTurnInput.admit(disposition==="queued",message=>this.agent.steer(message)),options?.promptDisposition?.(disposition)},onTurnAdmitted:()=>{hold.accepted(),options?.onTurnAdmitted?.()}}),heldByNewerStop&&(this._deliveredHeldInputIds.length=0,this._engineTurnInput.reject())}finally{this._promptsInFlight--;let settling=this._settleInputRelease();if(settling)try{await settling}finally{hold.end()}else hold.end()}}_beginPersonInput(){emitUserActivity(this,"prompt"),this._deadlineTracker.clearHold(),this._engineResumeWindow=!1,this._captureReleaseExtras(),this._engineTurnInput.begin({consumeAtSettlement:this._stopHoldLive()})}_settleInputRelease(){if(!this._engineTurnInput.hasPending||this._promptsInFlight>0||this._isAgentRunActive||!this.isIdle||this._agentSettledDelivery.active||this._extensionRunner.sessionStartTurnsHeld())return;let newerStop=this._releaseExtrasGeneration!==this._userAbortGeneration;return newerStop&&(this._deliveredHeldInputIds.length=0),this._engineTurnInput.settle(async sources=>{this._heldInputs.consume(this._deliveredHeldInputIds.splice(0)),await this._extensionRunner.emitHeldWakesReleased(sources)},{newerStop})}_holdForRun(text3,options){if(options?.signal?.aborted){let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2}emitUserActivity(this,"prompt");let images=options?.images;this._heldInputs.hold({inputId:options?.clientMessageId??`prompt-${crypto.randomUUID()}`,revision:0,text:text3,...images===void 0||images.length===0?{}:{images},...options?.expandPromptTemplates??!0?{prepare:!0}:{}}).kind==="held"&&this._runHolds.releaseDirectStops()}_holdPreparedInput(text3,images,options){this._heldInputs.hold({inputId:options.clientMessageId??`prompt-${crypto.randomUUID()}`,revision:0,text:text3,...images===void 0||images.length===0?{}:{images}})}_isExtensionCommandText(text3,options){if(!(options?.expandPromptTemplates??!0)||!text3.startsWith("/"))return!1;let spaceIndex=text3.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text3.slice(1):text3.slice(1,spaceIndex))!==void 0}async _prompt(text3,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)&&text3.startsWith("/")){let spaceIndex=text3.indexOf(" "),commandName=spaceIndex===-1?text3.slice(1):text3.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text3);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 joinedClaim=this._promptStartPending&&!this.isStreaming?this._promptStartClaim:void 0,startWasPending=this._promptStartPending,ownsPromptStart=!1,claim2,claimStart=()=>{ownsPromptStart=!0,claim2={},this._promptStartPending=!0,this._promptStartClaim=claim2};!this.isStreaming&&!startWasPending&&claimStart();let releaseStart=started=>{!ownsPromptStart||claim2===void 0||(claim2.started=started,this._promptStartPending=!1,this._notifyAdmissionIdle(),!started&&claim2.joined===!0&&!this.isStreaming&&(this._flushPostCompactionDeferredMessages(),this._drainJoinedInput()))},noteJoined=()=>{ownsPromptStart||joinedClaim===void 0||(joinedClaim.started===!1?this.isStreaming||this._drainJoinedInput():joinedClaim.joined=!0)},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;joinedClaim?.started===!1&&!this.isStreaming&&(startWasPending=this._promptStartPending,startWasPending||claimStart());let canQueueWhileStreaming=(this.isStreaming||startWasPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!startWasPending&&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();let model=this.model;if(model&&!this._pendingModelSwitch&&this._retryFallback.isProviderSpent(model.provider)){this._retryFallback.resetTurn();let errorMessage6=this._retryFallback.accountError(model.provider);if(!await this._retryFallback.tryFallback("transient",{errorMessage:errorMessage6},!1))throw new AccountUsageLimitError(model.provider,errorMessage6)}}catch(error2){throw releaseStart(!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,consumedReleaseExtras,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:text3,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=text3,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&!keepsTextBlocksVerbatim(options?.textBlocks)&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){let skillExpansion=this._expandSkillCommand(expandedText);expandedText=typeof skillExpansion=="string"?skillExpansion:await skillExpansion;let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text3)&&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??text3,this.isStreaming){if(!options?.streamingBehavior)throw new AgentBusyError("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.");releaseStart(!1),options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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.");releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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.");releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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.");releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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")){releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}this._flushPendingBashMessages(),this._extensionBindingPromptReadiness===void 0&&!this._lifecycleBinding.isRestored&&await this._lifecycleBinding.restore(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let releaseExtras=this._releaseExtras.splice(0);consumedReleaseExtras=releaseExtras;let turnInput=this._engineTurnInput.messages();if(releaseExtras.length>0){let prepared=await Promise.allSettled(releaseExtras);consumedReleaseExtras=releaseExtras.filter((_,index)=>prepared[index]?.status==="fulfilled");let rejected=prepared.find(result4=>result4.status==="rejected");if(rejected!==void 0)throw rejected.reason;messages.push(...prepared.flatMap(result4=>result4.status==="fulfilled"?[result4.value]:[]))}messages.push(...turnInput);let userContent=userTextContent(expandedText,options?.textBlocks);currentImages&&userContent.push(...currentImages);let userMessage2={role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)};this._userInputSources.set(userMessage2,options?.source??"interactive"),messages.push(userMessage2),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);if(this._applyBeforeAgentStartResult(messages,result3,userMessage2),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),options.observedPauseSeq!==void 0&&this._stopAddedSince(options.observedPauseSeq)){this._holdPreparedInput(expandedText,currentImages,options),consumedNextTurnMessages!==void 0&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),options.onHeldByNewerStop?.(),await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0),messages=void 0;return}await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedReleaseExtras!==void 0&&this._releaseExtras.unshift(...consumedReleaseExtras.filter(extra=>!this._releaseExtras.includes(extra))),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{releaseStart(messages!==void 0)}if(messages){options?.toolBarrier&&this._toolBarrier.arm(options.toolBarrier);try{promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,{inputOrigin:originOf(options),onQueuedInput:options?.onQueuedInput,onTurnAdmitted:options?.onTurnAdmitted})}catch(error2){throw options?.toolBarrier&&!this._isAgentRunActive&&this._toolBarrier.release(options.toolBarrier.id),error2}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,prompt){if(result3?.messages)for(let msg of result3.messages){let index=msg.placement==="before-prompt"?messages.indexOf(prompt):messages.length;messages.splice(index,0,{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(text3){let spaceIndex=text3.indexOf(" "),commandName=spaceIndex===-1?text3.slice(1):text3.slice(1,spaceIndex),args=spaceIndex===-1?"":text3.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(err){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err instanceof Error?err.message:String(err)}),!0}}_rejectUnknownCommand(text3){if(commandShapedName(text3)===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(text3,{promptCommands,interactiveCommands});if(rejection)throw rejection}_expandSkillCommand(text3){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text3,{knownSkillNames:new Set(skills.map(skill=>skill.name))});return invocationTokens.length===0?text3:this._expandSkillTokens(text3,skills,invocationTokens)}async _expandSkillTokens(text3,skills,invocationTokens){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=await readSkillFileChecked(skill.filePath,skill.provenance,skill.allowedSet),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(err){return err instanceof BlockedSkillLinkError&&this.securityNotices.add({category:"skill-link-blocked",message:err.message,path:skill.filePath}),this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err instanceof Error?err.message:String(err)}),text3}}if(skippedSkillNames.length>0){let count2=skippedSkillNames.length;this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Skipped ${count2} skill${count2===1?"":"s"} (${skippedSkillNames.join(", ")}): at most ${maxExpansions} skills load per prompt. Raise maxSkillExpansionsPerPrompt to load more.`})}if(skillBlocks.length===0)return text3;let userRequest=removeSkillInvocationTokens(text3,removedTokens,unloadedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}_queueUserInput(text3,images,behavior,options){let hold=this.externalAdmission.beginInput();if(originOf(options)==="person"&&this._engineTurnHold.held)return this._promptHeldQueuedInput(text3,images,behavior,options,hold);let admitted=this._admitQueuedInput(text3,images,behavior,options);return admitted.then(hold.end,hold.end),admitted}async _promptHeldQueuedInput(text3,images,behavior,options,hold){try{return await this.prompt(text3,{...options,images,streamingBehavior:behavior,humanInputReported:!0,promptDisposition:disposition=>{disposition!=="started"&&hold.accepted()},onTurnAdmitted:()=>hold.accepted()}),"queued"}finally{hold.end()}}async _admitQueuedInput(text3,images,behavior,options){originOf(options)==="person"&&this._beginPersonInput(),text3.startsWith("/")&&this._throwIfExtensionCommand(text3);let processedInput=await this._runInputHandlers(text3,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return"handled";let skillExpansion=this._expandSkillCommand(processedInput.text),expandedText=typeof skillExpansion=="string"?skillExpansion:await skillExpansion,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(text3,images,options){return isHumanInput(options)&&this._humanInputAdmitted("steer"),this._queueUserInput(text3,images,"steer",options)}async followUp(text3,images,options){return isHumanInput(options)&&this._humanInputAdmitted("follow_up"),this._queueUserInput(text3,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model,abortController.signal,{}),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text3,images,options){await this._enqueueQueuedInput({...options,text:text3,images,mode:"steer"})}async _queueFollowUp(text3,images,options){await this._enqueueQueuedInput({...options,text:text3,images,mode:"followUp"})}async _enqueueQueuedInput(input){let clientMessageId=input.clientMessageId,sourced={...input,source:input.source??"interactive"};if(clientMessageId===void 0){this._enqueuePreparedInput(sourced);return}await this._pendingInputs.admit({clientMessageId,text:input.text,...input.images?{images:input.images}:{},mode:input.mode},queuedId=>this._enqueuePreparedInput({...sourced,queuedId}))}async restoreQueuedInput(input){let restored=input.clientMessageId===void 0?void 0:await this._pendingInputs.restoreHandle(input.clientMessageId);restored!=="retired"&&this._enqueuePreparedInput(restored===void 0?input:{...input,queuedId:restored.queuedId})}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder,...input.source===void 0?{}:{source:input.source}};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text);let queuedId=this._recordQueuedInput(input.text,input.mode,prepared,void 0,input.queuedId);originOf(input)==="person"&&this._personQueuedIds.add(queuedId),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length});let message={role:"user",content:[...userTextContent(input.text,input.textBlocks),...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};input.source!==void 0&&this._userInputSources.set(message,input.source),this._queuedMessages.set(queuedId,message),this._promptStartPending&&this._skipNextPostCompactionAssistantCheck?(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message):input.mode==="steer"?this.agent.steer(message):this.agent.followUp(message),this._emitQueueUpdate()}_flushPostCompactionDeferredMessages(){let steering=this._postCompactionDeferredSteeringMessages,followUps=this._postCompactionDeferredFollowUpMessages;this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._requeueAtOriginalPlace(steering,"steer"),this._requeueAtOriginalPlace(followUps,"followUp")}_requeueAtOriginalPlace(parked,mode){if(parked.length===0)return;let enqueueOrderOf=new Map;for(let input of this._queuedInputOrder){let message=this._queuedMessages.get(input.queuedId);message!==void 0&&enqueueOrderOf.set(message,input.enqueueOrder)}let orderOf=message=>enqueueOrderOf.get(message)??Number.POSITIVE_INFINITY,oldestParked=Math.min(...parked.map(orderOf)),parkedSet=new Set(parked),newer=this._queuedInputOrder.filter(input=>input.mode===mode&&input.enqueueOrder>oldestParked).map(input=>this._queuedMessages.get(input.queuedId)).filter(message=>message!==void 0&&!parkedSet.has(message)&&this.agent.removeQueuedMessage(message));for(let message of[...parked,...newer].sort((a,b)=>orderOf(a)-orderOf(b)))mode==="steer"?this.agent.steer(message):this.agent.followUp(message)}_throwIfExtensionCommand(text3){let spaceIndex=text3.indexOf(" "),commandName=spaceIndex===-1?text3.slice(1):text3.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.`)}_wakeGateApplies(customType,options){return customTurnOrigin(customType)==="engine"&&options?.deliverAs!=="nextTurn"&&options?.triggerTurn!==!1&&(this.isStreaming||options?.triggerTurn===!0)}_sendItemizedMessage(message,options){let receipts=Promise.withResolvers(),admit=claim2=>{this._admitItemized(message,options,claim2).then(receipts.resolve,error2=>{error2 instanceof ModelNotReadyError&&this._noticeProviderRequired(error2.message),receipts.reject(error2)})};return options.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim2=>admit(claim2))||this._agentSettledDelivery.defer(()=>admit())||admit(),receipts.promise}async _admitItemized(message,options,claim2){let{items}=options;if(this._wakeGateApplies(message.customType,options)&&(this._engineTurnHold.holdsSource(engineWakeSource(message.customType))||this._runHolds.holdsWake(message.details)||items.some(item=>this._engineTurnHold.holdsSource(item.producer)||this._runHolds.holdsWake({runRef:item.runRef})))){if(claim2?.resolve("finished-without-start"),options.ticket!==void 0){let admission=this.workObligations.admission(options.ticket);if(admission!=="admitted")throw new DeliveryTicketRefused(options.ticket,admission)}let notices=this._engineTurnHold.noteItems(items.map(item=>({source:item.producer,message:itemNoticeMessage(message,item),item}))),firstNotice=notices[0];return options.ticket!==void 0&&firstNotice!==void 0&&this.workObligations.held(options.ticket,firstNotice.noticeId),notices.map(notice2=>({...notice2,disposition:"notice_persisted"}))}let outcome=Promise.withResolvers();return this.sendCustomMessage(message,options,claim2,void 0,{persisted:entryId=>outcome.resolve(deliveredReceipts(items,entryId)),failed:outcome.reject,droppedByAbort:()=>{this._admitItemized(message,options).then(outcome.resolve,outcome.reject)},itemIds:items.map(item=>item.itemId)}).catch(outcome.reject),outcome.promise}_joinPersistWatcher(carrier,joined){let first=this._persistWatchers.get(carrier);this._persistWatchers.set(carrier,first===void 0?joined:{persisted:entryId=>{first.persisted(entryId),joined.persisted(entryId)},failed:error2=>{first.failed(error2),joined.failed(error2)},itemIds:first.itemIds})}_queuedTicketCarrier(ticket){return[...this.agent.peekQueuedMessages({all:!0}),...this._pendingNextTurnMessages].find(queued=>queued.role==="custom"&&messageTicket(queued)===ticket)}_recordWrittenTicket(message,entryId){let ticket=message.role==="custom"?messageTicket(message):void 0;ticket!==void 0&&this._carrierJoiners.has(ticket)&&this._writtenTicketEntries.set(ticket,entryId)}_takePersistWatcher(message){let watcher=this._persistWatchers.get(message);return this._persistWatchers.delete(message),watcher}async sendCustomMessage(message,options,deferredTurnClaim,releasedWake,itemized,onQueued){let deliveryMessage2={...message,content:message.content??[]};if(this._sizesOnlyStartup&&options?.triggerTurn===!0){this._pendingNextTurnMessages.push({role:"custom",...deliveryMessage2,timestamp:Date.now()}),deferredTurnClaim?.resolve("finished-without-start");return}let obligations=this.workObligations,deliveryId=deliveryIdOf({...deliveryMessage2,role:"custom",timestamp:Date.now()}),engineTicket=options?.ticket===void 0&&options?.deliverAs!=="nextTurn"&&(this.isStreaming||options?.triggerTurn===!0)?obligations.open(`${ENGINE_DELIVERY_KEY_PREFIX}${message.customType}:${deliveryId??randomUUID6()}`,"background").ticket():void 0,ticket=options?.ticket??engineTicket,generation2=this._userAbortGeneration,admission=ticket===void 0?"admitted":obligations.admission(ticket);if(ticket!==void 0&&admission!=="admitted"){if(deferredTurnClaim?.resolve("finished-without-start"),itemized!==void 0){itemized.failed(new DeliveryTicketRefused(ticket,admission));return}if(admission==="unknown")throw new CustodyViolation(ticket);return}let queuedCarrier=ticket===void 0?void 0:this._queuedTicketCarrier(ticket),carrierItems=queuedCarrier&&ticket!==void 0?this._persistWatchers.get(queuedCarrier)?.itemIds??obligations.queuedItemIds(ticket):void 0;if(ticket!==void 0&&itemized?.itemIds&&carrierItems&&!sameItems(carrierItems,itemized.itemIds)){deferredTurnClaim?.resolve("finished-without-start"),itemized.failed(new DeliveryTicketRefused(ticket,"different_items"));return}ticket&&queuedCarrier===void 0&&this._writtenTicketEntries.delete(ticket);let joinsCarrier=ticket!==void 0&&queuedCarrier!==void 0;joinsCarrier&&this._carrierJoiners.set(ticket,(this._carrierJoiners.get(ticket)??0)+1),ticket&&queuedCarrier===void 0&&obligations.queue(ticket,{message:deliveryMessage2,deliverAs:options?.deliverAs,...itemized?.itemIds?{itemIds:itemized.itemIds}:{}}),onQueued?.();let readmit=!1,delivery=itemized===void 0?void 0:{persisted:itemized.persisted,failed:itemized.failed,droppedByAbort:()=>{readmit=!0},itemIds:itemized.itemIds};try{let startsTurn=options?.triggerTurn===!0&&!this.isStreaming;startsTurn&&this._pendingCustomTurnHeaders++;try{await this.sessionManager.persistHeaderNow()}finally{startsTurn&&this._pendingCustomTurnHeaders--}if(generation2!==this._userAbortGeneration){ticket&&this._retireLifecycleDelivery(ticket,!this._isEngineDelivery(ticket)),deferredTurnClaim?.resolve("finished-without-start"),readmit=itemized!==void 0;return}await this._deliverCustomMessage(deliveryMessage2,{...options,ticket,...queuedCarrier!==void 0?{joinsQueuedCarrier:!0}:{}},deferredTurnClaim,releasedWake,delivery),ticket&&generation2!==this._userAbortGeneration&&([...this.agent.peekQueuedMessages({all:!0}),...this._pendingNextTurnMessages].some(queued=>queued.role==="custom"&&messageTicket(queued)===ticket)||this._retireLifecycleDelivery(ticket,!this._isEngineDelivery(ticket)))}catch(error2){throw ticket&&obligations.failed(ticket),error2}finally{ticket&&obligations.endDelivery(ticket),joinsCarrier&&this._leaveCarrier(ticket),readmit&&itemized?.droppedByAbort()}}_leaveCarrier(ticket){let joiners=(this._carrierJoiners.get(ticket)??1)-1;if(joiners>0){this._carrierJoiners.set(ticket,joiners);return}this._carrierJoiners.delete(ticket),this._writtenTicketEntries.delete(ticket)}_queuedDeliveryTickets(){return this.agent.peekQueuedMessages({all:!0}).flatMap(queued=>{let ticket=queued.role==="custom"?messageTicket(queued):void 0;return ticket===void 0?[]:[ticket]})}_isEngineDelivery(ticket){return this.workObligations.active.some(record10=>record10.ticketId===ticket&&record10.key.startsWith(ENGINE_DELIVERY_KEY_PREFIX))}_releaseQueuedDeliveries(tickets,cause){for(let ticket of tickets){let engineOwned=this._isEngineDelivery(ticket);cause==="cleared"?engineOwned?this.workObligations.cancel(ticket):this.workObligations.retire(ticket):engineOwned&&this.workObligations.passive(ticket)}}_settleRemovedCarriers(removed){for(let message of removed){let watcher=this._takePersistWatcher(message);watcher?.failed(new QueuedDeliveryCleared(watcher.itemIds))}}_retireLifecycleDelivery(ticket,producerOwned){let removed=[];for(let queued of this.agent.peekQueuedMessages({all:!0}))queued.role==="custom"&&messageTicket(queued)===ticket&&(this.agent.removeQueuedMessage(queued),removed.push(queued));this._pendingNextTurnMessages=this._pendingNextTurnMessages.filter(queued=>{let carriesTicket=messageTicket(queued)===ticket;return carriesTicket&&removed.push(queued),!carriesTicket}),this._settleRemovedCarriers(removed),producerOwned?this.workObligations.retire(ticket):this.workObligations.cancel(ticket)}async _deliverCustomMessage(message,options,deferredTurnClaim,releasedWake,itemized){let userAbortGeneration=this._userAbortGeneration,queuedCarrier=options?.ticket===void 0?void 0:this._queuedTicketCarrier(options.ticket);if(queuedCarrier!==void 0){itemized!==void 0&&this._joinPersistWatcher(queuedCarrier,itemized),deferredTurnClaim?.resolve("delegated");return}if(options?.joinsQueuedCarrier===!0&&options.ticket!==void 0){let writtenEntry=this._writtenTicketEntries.get(options.ticket);if(writtenEntry!==void 0){itemized?.persisted(writtenEntry),deferredTurnClaim?.resolve("delegated");return}deferredTurnClaim?.resolve("finished-without-start"),itemized?.failed(new QueuedDeliveryCleared(itemized.itemIds));return}let appMessage={role:"custom",customType:message.customType,content:message.content,display:message.display,details:options?.ticket?{...typeof message.details=="object"&&message.details!==null&&!Array.isArray(message.details)?message.details:message.details===void 0?{}:{producerDetails:message.details},ticketId:options.ticket}:message.details,timestamp:Date.now()};if(this._sizesOnlyStartup&&options?.triggerTurn===!0){this._pendingNextTurnMessages.push(appMessage),deferredTurnClaim?.resolve("finished-without-start");return}if(itemized!==void 0&&this._persistWatchers.set(appMessage,itemized),!releasedWake&&this._wakeGateApplies(message.customType,options)&&(this._engineTurnHold.holdsSource(engineWakeSource(message.customType))||this._runHolds.holdsWake(message.details))){if(this._engineTurnHold.note(engineWakeSource(message.customType),appMessage),options?.ticket){let noticeId=heldLifecycleNotice(this,options.ticket,message.customType);noticeId&&this.workObligations.held(options.ticket,noticeId)}deferredTurnClaim?.resolve("finished-without-start");return}let 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){this._persistWatchers.delete(appMessage),itemized?.droppedByAbort();return}finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1){if(releasedWake)return;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")){if(releasedWake)return;deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)}else if(options?.triggerTurn&&this._stopEngineTurn(message.customType))releasedWake||this._recordRefusedEngineTurnMessage(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{releasedWake||(options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage))};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{this._extensionBindingPromptReadiness===void 0&&!this._lifecycleBinding.isRestored&&await this._lifecycleBinding.restore(),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,appMessage),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}if(releasedWake&&!releasedWake())return;let inputOrigin=customTurnOrigin(message.customType);inputOrigin==="engine"&&this._recordEngineTurnStart(message.customType),await this._promptAgent(messages,{inputOrigin,deferredTurnClaim})}else this.isStreaming?(options?.ticket&&this.workObligations.passive(options.ticket),this._pendingCustomMessages.push(appMessage)):(options?.ticket&&this.workObligations.passive(options.ticket),this._appendCustomMessage(appMessage))}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}onHumanInputAdmitted(listener){return this._humanInputListeners.add(listener),()=>this._humanInputListeners.delete(listener)}admitHumanAnswer(){let input=this.externalAdmission.beginInput();try{this._humanInputAdmitted("answer")}finally{input.end()}}_humanInputAdmitted(kind){let event={kind,at:Date.now()};for(let listener of this._humanInputListeners)try{listener(event)}catch(error2){this._sessionLogger.warn("human_input_listener_failed",{error:String(error2)})}}resumeSession(){return this.beginResume({}).then(({settled:settled2})=>settled2)}async resumeSessionRequest(request2){let{answer:answer3,settled:settled2}=await this.beginResume(request2);return await settled2,answer3}async beginResume(request2){this._humanInputAdmitted("resume");let replayed=request2.effectId===void 0?void 0:this._resumeEffects.get(request2.effectId);if(replayed!==void 0)return{answer:{...replayed,replayed:!0},settled:Promise.resolve()};let input=this.externalAdmission.beginInput(),result3;try{result3=await this._resumeOnce(request2,()=>input.accepted())}catch(error2){throw input.end(),error2}return result3.settled.then(input.end,input.end),request2.effectId!==void 0&&result3.answer.resumed&&(this._resumeEffects.set(request2.effectId,result3.answer),this._emitEntryAppended(this.sessionManager.appendCustomEntry(RESUME_EFFECT_ENTRY,{effectId:request2.effectId,answer:result3.answer}))),result3}async _resumeOnce(request2,onQueued){let pauseSeq=this._engineTurnHold.currentPauseSeq,holds2=this._engineTurnHold.holds,idle={pauseSeq,turnStarted:!1,deliveredNotices:0,deliveredHeldInputs:0},answered=answer3=>({answer:answer3,settled:Promise.resolve()});if(holds2.length===0&&!this._engineTurnHold.awaitingInput)return answered({resumed:!1,reason:"not_paused",...idle});let inherited2=this._runHolds.inheritedOwner();if(inherited2!==void 0&&holds2.every(hold=>hold.kind==="inherited_hold"))return answered({resumed:!1,reason:"resume_through_parent",parentSessionId:inherited2.parentSessionId,...idle});if(request2.expectedSeq!==void 0&&request2.expectedSeq!==pauseSeq)return answered({resumed:!1,reason:"stale",...idle});if(request2.mode==="release"||inherited2!==void 0)return this._engineTurnHold.attend(),this._engineTurnHold.release(holds2.filter(hold=>hold.kind==="session_hold"||hold.kind==="unattended").map(hold=>hold.key),"resume_session"),answered({resumed:!0,...idle});request2.message!==void 0&&this._heldInputs.hold({inputId:`resume-${request2.effectId??crypto.randomUUID()}`,revision:0,text:request2.message});let deliveredNotices=this._engineTurnHold.noticeCount,deliveredHeldInputs=this._heldInputs.pending().length;if(this._stopHoldLive()||this._engineTurnHold.fences.length>0||deliveredHeldInputs>0){let{turnStarted,settled:settled3}=await this._resumeAfterStop(onQueued);return{answer:{resumed:!0,pauseSeq,turnStarted,deliveredNotices,deliveredHeldInputs},settled:settled3}}let settled2=this._engineTurnRelease.resume(this._engineTurnHold,async(message,admit)=>{let generation2=this._userAbortGeneration;await this.waitForIdle();let claim2=new DeferredTurnClaim;return await this.sendCustomMessage(message,{triggerTurn:!0},claim2,admit,void 0,onQueued),await claim2.disposition!=="started"?!1:(await this.waitForIdle(),generation2!==this._userAbortGeneration?(this._engineTurnHold.invalidate(),this._engineTurnHold.rejectInput(),!1):!0)},sources=>this._extensionRunner.emitHeldWakesReleased(sources));return{answer:{resumed:!0,pauseSeq,turnStarted:deliveredNotices>0,deliveredNotices,deliveredHeldInputs:0},settled:settled2}}async _resumeAfterStop(onQueued){let sources=this._engineTurnHold.releaseAll("resume_session"),{turnId,delivered}=await this._startResumeTurn(onQueued),settled2=(async()=>{if(!await delivered){this._engineTurnHold.rejectInput();return}let remaining=this._engineTurnHold.finish();this._engineTurnHold.held||await this._extensionRunner.emitHeldWakesReleased({...sources,...remaining})})();return{turnStarted:turnId!==void 0,settled:settled2}}resumeSettled(){return this._resumeSettlement}async _startResumeTurn(onQueued){let settlement=Promise.withResolvers();this._resumeSettlement=settlement.promise;try{let generation2=this._userAbortGeneration,continues=new Set,prepared=new Map,heldInputs;for(;;){if(this._runHolds.inheritedOwner()!==void 0)return settlement.resolve(),{turnId:void 0,delivered:Promise.resolve(!1)};let commands=this._takeHeldCommands();if(continues=commands.continues,commands.run!==void 0){await commands.run;continue}let pending=this._heldInputs.pending().filter(input=>!continues.has(input.inputId)),unread=pending.filter(input=>prepared.get(input.inputId)?.entryId!==input.entryId);if(unread.length===0){heldInputs=pending.map(input=>prepared.get(input.inputId)??input);break}await Promise.all(unread.map(async input=>{prepared.set(input.inputId,{...input,text:await this._preparedHeldText(input)})}))}let started=await this._startResumeTurnWith(generation2,continues,heldInputs,onQueued);return started.delivered.then(()=>settlement.resolve(),()=>settlement.resolve()),started}catch(error2){throw settlement.resolve(),error2}}_startResumeTurnWith(generation2,continues,heldInputs,onQueued){return startRunResumeTurn({heldInputs:()=>heldInputs,continueInputs:()=>[...continues],heldWakes:()=>this._engineTurnHold.messages(),send:message=>this.sendCustomMessage(message,{triggerTurn:!0},void 0,()=>!0,void 0,onQueued),turnStarted:until=>this._nextTurnStart(until),idle:()=>this.waitForIdle(),current:()=>generation2===this._userAbortGeneration,consume:(inputIds,sources)=>{this._heldInputs.consume(inputIds);for(let source2 of sources)this._engineTurnHold.consume(source2)},sendFailed:error2=>this._sessionLogger.warn("resume_turn_send_failed",{error:String(error2)})})}holdInput(input){return this._heldInputs.hold(input)}withdrawHeldInput(inputId){return this._heldInputs.withdraw(inputId)}get pausedHeldInputCount(){return this._heldInputs.pending().length}_captureReleaseExtras(){if(!this._engineTurnHold.held||this._engineTurnHold.releasing||this._releaseExtras.length>0)return;this._releaseExtrasGeneration=this._userAbortGeneration,this._stopHoldLive()&&this._releaseExtras.push({role:"custom",...stopResumeDirective(),timestamp:Date.now()});let{messages,commands}=this._takeHeldInputs();this._releaseExtras.push(...messages),commands!==void 0&&(this._heldCommandRun=commands)}_takeHeldCommandRun(){let run2=this._heldCommandRun;return this._heldCommandRun=void 0,run2}_takeHeldCommands(){let commands=[],continues=new Set,hasMessages=this.agent.state.messages.length>0;for(let input of this._heldInputs.pending()){if(input.prepare!==!0)continue;let hasImages=(input.images?.length??0)>0;this._isExtensionCommandText(input.text)?commands.push(input):isManualContinueSubmission({text:input.text,hasMessages,hasImages})&&continues.add(input.inputId)}return commands.length===0?{run:void 0,continues}:(this._heldInputs.consume(commands.map(input=>input.inputId)),{run:(async()=>{for(let input of commands)await this._tryExecuteExtensionCommand(input.text)})().catch(error2=>this._sessionLogger.warn("held_command_failed",{error:String(error2)})),continues})}async _preparedHeldText(input){return input.prepare!==!0?input.text:expandPromptTemplateWithMetadata(await this._expandSkillCommand(input.text),[...this.promptTemplates]).text}_takeHeldInputs(){let{run:run2,continues}=this._takeHeldCommands(),pending=this._heldInputs.pending();return this._deliveredHeldInputIds.push(...pending.map(input=>input.inputId)),{messages:pending.filter(input=>!continues.has(input.inputId)).map(input=>{let timestamp=Date.now(),message=this._preparedHeldText(input).then(text3=>({role:"custom",customType:HELD_INPUT_ENTRY,content:input.images===void 0?text3:[{type:"text",text:text3},...input.images],display:!0,timestamp}));return message.catch(()=>{}),message}),commands:run2}}async pauseForRun(owner){let result3=this._runHolds.inherit(owner);return"childSeq"in result3&&await this.abort(),result3}async resumeForRun(request2){let released=this._runHolds.releaseInherited(request2);if(!released.released||released.otherHoldLive||this._engineTurnHold.isHeld())return released;let{turnId,delivered}=await this._startResumeTurn();return delivered.catch(error2=>this._sessionLogger.warn("run_resume_settle_failed",{error:String(error2)})),turnId===void 0?released:{...released,turnId}}_pauseState(){let holds2=this._engineTurnHold.holds.map(({kind,key,data})=>({kind,key,...data===void 0?{}:{data}}));return{pauseSeq:this._engineTurnHold.currentPauseSeq,holds:holds2}}_emitHoldChanged(event){let change=event.type==="session_paused"?"paused":"resumed";this._extensionRunner.emit({type:"session_hold_changed",change,...this._pauseState(),pauseSeq:event.pauseSeq}).catch(error2=>this._sessionLogger.warn("session_hold_changed_failed",{error:String(error2)}))}_nextTurnStart(until){return new Promise(resolve55=>{let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&(unsubscribe(),resolve55(String(this.externalAdmission.turnEpoch)))});until.then(()=>{unsubscribe(),resolve55(void 0)})})}noteAutomaticInput(text3){if(!this._engineTurnHold.holds.some(hold=>hold.kind==="session_hold"||hold.kind==="inherited_hold"))return!1;let message={role:"custom",customType:"rpc-automatic-input",content:text3,display:!0,timestamp:Date.now()};return this._engineTurnHold.note(`rpc-input:${crypto.randomUUID()}`,message),!0}_stopAddedSince(observedPauseSeq){return this._engineTurnHold.holds.some(hold=>hold.kind==="session_hold"&&(hold.data?.localSeq??0)>observedPauseSeq)}_stopHoldLive(){return this._engineTurnHold.holds.some(hold=>hold.kind==="session_hold")}get pauseView(){return{pauseSeq:this._engineTurnHold.currentPauseSeq,records:this._engineTurnHold.holds.map(({kind,key,data})=>{let value=data??{};return{kind,key,...value.runRef===void 0?{}:{runRef:value.runRef},...value.parentSessionId===void 0?{}:{parentSessionId:value.parentSessionId}}})}}get runPaused(){return this._engineTurnHold.fences.length>0}get paused(){return this._engineTurnHold.isHeld()}_createLifecycleBinding(){return new LifecycleSessionBinding(this,{append:(type2,data)=>{let startupBookkeeping=type2==="session-lifecycle"&&typeof data=="object"&&data!==null&&"epoch"in data&&data.epoch===0&&"state"in data&&data.state==="done"&&"humanInputRevision"in data&&data.humanInputRevision===0,id=this.sessionManager.appendCustomEntry(type2,data,{startupBookkeeping});return this._emitEntryAppended(id),id},emit:event=>this._emit(event),factsFailed:error2=>this._sessionLogger.warn("lifecycle_goal_read_failed",{error:String(error2)})})}get lifecycle(){return this._lifecycleBinding.controller.ledger.snapshot}get workObligations(){return this._lifecycleBinding.controller.obligations}get lifecycleApi(){return{obligations:this.workObligations,reportChild:report=>this.reportChildLifecycle(report),markRunCompleted:({runId})=>this._lifecycleBinding.controller.markRunCompleted(runId)}}reportChildLifecycle(report){this._lifecycleBinding.controller.reportChild(report)}requestSelfSettle(){return this._lifecycleBinding.controller.requestSelfSettle()}refreshLifecycle(){this._disposed||this._lifecycleBinding.controller.recompute()}get pausedNoticeCount(){return this._engineTurnHold.noticeCount}get holds(){return this._engineTurnHold.holds}_recordEngineTurnStart(customType){this._engineTurnPauseRecorded=!1,this._engineTurnPauseNotified=!1,this._engineTurnStarts.push({at:Date.now(),toolUsed:!1});try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_TURN_START_ENTRY_TYPE,{customType}))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_TURN_START_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}}_recordRefusedEngineTurnMessage(appMessage){try{this._appendCustomMessage(appMessage),this.externalAdmission.observePersisted(appMessage)}catch(error2){if(deliveryIdOf(appMessage)!==void 0){let index=this.agent.state.messages.lastIndexOf(appMessage);index>=0&&this.agent.state.messages.splice(index,1)}this.externalAdmission.observeRefused(appMessage,error2 instanceof Error?error2.message:String(error2)),this._takePersistWatcher(appMessage)?.failed(error2)}}_observeEngineTurnMessage(message){if(message.role==="user"||message.role==="custom"&&isUserDirectedTurn(message.customType)){this._engineTurnStarts=[],this._engineResumeWindow=!1,this._engineTurnPauseRecorded=!1,this._engineTurnPauseNotified=!1;return}let running2=this._engineTurnStarts.at(-1);running2!==void 0&&message.role==="assistant"&&message.content.some(block=>block.type==="toolCall")&&(running2.toolUsed=!0)}_stopEngineTurn(customType){if(isUserDirectedTurn(customType))return!1;let stop=engineTurnStop(this.sessionManager.reduceHistory(engineTurnHistory),Date.now(),{...this.settingsManager.getEngineTurnSettings(),maxPerResumeWindow:this._engineResumeWindow?this.settingsManager.getEngineTurnSettings().maxPerResumeWindow:0},this._engineTurnStarts);if(stop===null)return!1;let details={customType,...stop,at:Date.now()};if(!this._engineTurnPauseRecorded&&!enginePauseSinceLastTurn(this.sessionManager.getBranch())){this._engineTurnPauseRecorded=!0;try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_PAUSED_ENTRY_TYPE,{reason:stop.reason==="resume-window"?"cap-per-resume-window":stop.reason==="per-user-input"?"cap-per-message":"cap-per-minute",customType,count:stop.reason!=="tool-free-rate"?stop.sinceUserInput:stop.toolFreeInWindow,at:details.at}))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_PAUSED_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}}try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_TURN_LIMIT_ENTRY_TYPE,details))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_TURN_LIMIT_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}return this._extensionRunner.emitBusEvent(ENGINE_TURN_LIMIT_EVENT,details),this._engineTurnPauseNotified||(this._engineTurnPauseNotified=!0,this._extensionRunner.getUIContext().notify(engineTurnLimitNotice(stop),"warning")),!0}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage);let entryId=this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details);this._emitEntryAppended(entryId),this._recordWrittenTicket(appMessage,entryId),this._takePersistWatcher(appMessage)?.persisted(entryId),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,inputOrigin="extension"){if(this._engineTurnHold.held&&inputOrigin!=="person"){await this.sendCustomMessage({customType:"extension-user-message",content,display:!0},{triggerTurn:!0,deliverAs:options?.deliverAs},deferredTurnClaim);return}let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve55=>{resolveBindingPromptReadiness=resolve55});bindingPromptReadiness.add(readiness)}let text3,images,textBlocks;try{if(typeof content=="string")text3=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text3=joinUserTextBlocks(textParts),textParts.length>1&&(textBlocks=textParts),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}if(this._sizesOnlyStartup){try{await this._queueFollowUp(text3,images,{textBlocks})}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.()}return}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text3,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,textBlocks,source:"extension",inputOrigin,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(text3,images,{textBlocks,source:"extension",inputOrigin}):await this._queueFollowUp(text3,images,{textBlocks,source:"extension",inputOrigin})),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text3,mode,options,message,admittedQueuedId){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order);let queuedId=admittedQueuedId??this._mintQueuedId();return this._queuedInputOrder.push({text:text3,mode,enqueueOrder:order,queuedId,revision:1,...clientMessageIdentity(options)}),message!==void 0&&this._queuedMessages.set(queuedId,message),this._queuedInputAges.noteQueued(queuedId,Date.now()),queuedId}_warnQueuedInputOutlivingRun(agentEnd){if(agentEnd?.type!=="agent_end")return;let lastAssistant=agentEnd.messages.findLast(message=>message.role==="assistant");if(lastAssistant?.role==="assistant"&&(lastAssistant.stopReason==="error"||lastAssistant.stopReason==="aborted"))return;let stillQueued=this._queuedInputOrder.map(input=>input.queuedId);for(let{queuedId,ageMs}of this._queuedInputAges.takeOutlived(stillQueued,Date.now())){let input=this._queuedInputOrder.find(candidate=>candidate.queuedId===queuedId),message=this._queuedMessages.get(queuedId);this._sessionLogger.warn("queued_input_outlived_run",{queuedId,mode:input?.mode,ageMs,source:message===void 0?void 0:this._userInputSources.get(message)})}}_mintQueuedId(){return this._nextQueuedId+=1,`q_${this._nextQueuedId}`}_removeQueuedInput(text3,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text3:message.clientMessageId===clientMessageId);if(index===-1)return;let[delivered]=this._queuedInputOrder.splice(index,1);if(delivered!==void 0&&(this._queuedMessages.delete(delivered.queuedId),this._deliveredQueuedIds.add(delivered.queuedId),this._deliveredQueuedIds.size>256)){let oldest=this._deliveredQueuedIds.values().next().value;oldest!==void 0&&this._deliveredQueuedIds.delete(oldest)}}dequeueQueuedInput(queuedId,options){return this._changeQueuedInput(queuedId,void 0,options?.expectedRevision)}editQueuedInput(queuedId,text3,options){return this._changeQueuedInput(queuedId,text3,options?.expectedRevision)}async changeQueuedInput(queuedId,text3,options){let clientMessageId=this._queuedInputOrder.find(input=>input.queuedId===queuedId)?.clientMessageId;return(clientMessageId===void 0?void 0:await this._pendingInputs.change({clientMessageId,text:text3,...options?.expectedRevision===void 0?{}:{expectedRevision:options.expectedRevision},...options?.effectId===void 0?{}:{effectId:options.effectId}},()=>this._changeQueuedInput(queuedId,text3,void 0)))??this._changeQueuedInput(queuedId,text3,options?.expectedRevision)}_changeQueuedInput(queuedId,nextText,expectedRevision){let index=this._queuedInputOrder.findIndex(input=>input.queuedId===queuedId);if(index===-1)return this._deliveredQueuedIds.has(queuedId)?"already_delivered":"not_found";let record10=this._queuedInputOrder[index],message=this._queuedMessages.get(queuedId);if(nextText!==void 0&&message?.role!=="user")return"not_found";let deferred=record10.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages,nextMessage=nextText===void 0||message?.role!=="user"?void 0:{...message,content:[...userTextContent(nextText),...typeof message.content=="string"?[]:message.content.filter(part=>part.type==="image")]},deferredIndex=message===void 0?-1:deferred.indexOf(message);if(expectedRevision!==void 0&&record10.revision!==expectedRevision)return message!==void 0&&(deferredIndex!==-1||this.agent.replaceQueuedMessage(message,message))?"conflict":"already_delivered";if(!(message!==void 0&&(deferredIndex!==-1||(nextMessage===void 0?this.agent.removeQueuedMessage(message):this.agent.replaceQueuedMessage(message,nextMessage)))))return"already_delivered";deferredIndex!==-1&&(nextMessage===void 0?deferred.splice(deferredIndex,1):deferred[deferredIndex]=nextMessage);let texts=record10.mode==="steer"?this._steeringMessages:this._followUpMessages,occurrence=this._queuedInputOrder.slice(0,index).filter(input=>input.mode===record10.mode&&input.text===record10.text).length,seen=-1,textIndex=texts.findIndex(text3=>text3===record10.text&&++seen===occurrence);return nextText===void 0||nextMessage===void 0?(textIndex!==-1&&texts.splice(textIndex,1),this._queuedInputOrder.splice(index,1),this._queuedMessages.delete(queuedId)):(textIndex!==-1&&(texts[textIndex]=nextText),this._queuedInputOrder[index]={...record10,text:nextText,revision:record10.revision+1},this._queuedMessages.set(queuedId,nextMessage)),this._emitQueueUpdate(),nextText===void 0?"removed":"edited"}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._queuedMessages.clear();let recorded=this._pendingInputs.recordCleared(ordered.flatMap(input=>input.clientMessageId===void 0?[]:[input.clientMessageId]));recorded.catch(error2=>{this._sessionLogger.warn("pending_input_clear_unrecorded",{error:error2 instanceof Error?error2.message:String(error2)})}),this._queueClearRecorded=recorded,this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[];let clearedDeliveries=this._queuedDeliveryTickets(),clearedMessages=this.agent.peekQueuedMessages({all:!0});this.agent.clearAllQueues(),this._releaseQueuedDeliveries(clearedDeliveries,"cleared"),this._settleRemovedCarriers(clearedMessages),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}whenQueueClearRecorded(){return this._queueClearRecorded}get hasQueuedPersonInput(){for(let id of this._personQueuedIds)this._queuedInputOrder.some(input=>input.queuedId===id)||this._personQueuedIds.delete(id);return this._personQueuedIds.size>0}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}getPendingInputs(knownClientMessageIds){return this._pendingInputs.snapshot(knownClientMessageIds)}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}get resourceLoader(){return this._resourceLoader}async stop(){this._runHolds.stamp(),this._stopInterrupt={pauseSeq:this._engineTurnHold.currentPauseSeq,at:new Date().toISOString()};try{await this.abort()}finally{this._stopInterrupt=void 0}}async abort(options){options?.cause!==void 0&&this._abortCause===void 0&&(this._abortCause=options.cause),await this._abortWithProvenance()}async _abortWithProvenance(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._pendingCustomTurnHeaders>0||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);this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user");let releaseStranded=()=>this._releaseQueuedDeliveries(this._queuedDeliveryTickets(),"aborted");if(this.isIdle?releaseStranded():this.waitForIdle().then(releaseStranded,error2=>{this._sessionLogger.warn("abort_delivery_release_failed",{error:error2 instanceof Error?error2.message:String(error2)})}),this.isIdle||this._waitForIdleAfterAbort().catch(error2=>{this._sessionLogger.warn("abort_release_failed",{error:error2 instanceof Error?error2.message:String(error2)})}),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model,origin=SDK_MODEL_CHANGE){return this._setModel(model,!0,origin)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault,origin){let pending=createPendingModelSwitch({model,projection,persistDefault,origin});this._clearPendingModelSwitch(),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})}_clearPendingModelSwitch(error2){let pending=this._pendingModelSwitch;this._pendingModelSwitch=void 0,pending!==void 0&&this._emit({type:"model_change_cancelled",origin:pending.origin,reason:error2===void 0?"superseded":"context-budget",...error2===void 0?{}:{detail:error2.message}})}_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+estimateTokens(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(!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._clearPendingModelSwitch(error2),this._recordRejectedModelChange(pending.model,error2),error2}this._pendingModelSwitch=void 0;try{await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1,admittedLiveContextTokens:projection.liveContextTokens,origin:heldSwitchOrigin(pending.origin)})}catch(error2){throw this._emit({type:"model_change_cancelled",origin:pending.origin,reason:error2 instanceof ModelUsabilityBudgetError?"context-budget":"error",detail:error2 instanceof Error?error2.message:String(error2)}),error2}return!0}_resumeRequirementStillBlocks(model,settings){let currentContext=estimateProjectedContextTokens(this.sessionManager.buildSessionProjection(),this.sessionManager.getBranch()).tokens;return!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable}_clearResumeCompactionRequirementIfFits(){let model=this.model;this._resumeCompactionRequirement===void 0||!model||this._resumeRequirementStillBlocks(model,this._getCompactionSettings(model))||(this._resumeCompactionRequirement=void 0)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model,origin=SDK_MODEL_CHANGE){return this._setModel(model,!1,origin)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults,origin){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new ModelSwitchAuthError(model.provider,model.id);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults,origin);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,origin})}async _maybeRestoreFallbackPrimary(boundary="turn"){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy,boundary),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("turn")}async _switchActiveModel(model,opts){let previousModel=this.model,duringTurn=this.isStreaming;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel,void 0,!0),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,previousThinkingLevelSource=this._thinkingLevelSource;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection,opts.origin),this._thinkingLevelSource=thinking.source,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._thinkingLevelSource=previousThinkingLevelSource,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault,opts.origin);return}let admittedLiveContextTokens=opts.admittedLiveContextTokens??(opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens);return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id,{origin:opts.origin,duringTurn}),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:opts.origin,from:previousModel,to:model,duringTurn,persistDefault:opts.persistDefault})),this._clearPendingModelSwitch(),this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource,origin:opts.origin,...previousModel===void 0?{}:{previousModel},duringTurn}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this._thinkingLevelSource=previousThinkingLevelSource,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward",options={}){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2,{persistDefault:options.persistDefault??!0,origin:options.origin??{source:"cycle"}})}async _cycleFavoriteModel(direction,favoriteModels2,cycle){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry2=>!modelsAreEqual(entry2.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,cycle.persistDefault,cycle.origin):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection,cycle.origin),this._thinkingLevelSource=thinking.source;let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens);let duringTurn=this.isStreaming;this.sessionManager.appendModelChange(next.model.provider,next.model.id,void 0,currentModel?.provider,currentModel?.id,{origin:cycle.origin,duringTurn}),cycle.persistDefault&&this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:cycle.origin,from:currentModel,to:next.model,duringTurn,persistDefault:cycle.persistDefault})),this._clearPendingModelSwitch(),this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle",origin:cycle.origin,...currentModel===void 0?{}:{previousModel:currentModel},duringTurn}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level,origin){this._setThinkingLevel(level,!0,{level,source:"explicit"},origin,!0),this._thinkingLevelSource=this.thinkingLevel===level?"explicit":"clamped"}setSessionThinkingLevel(level,origin){this._setThinkingLevel(level,!1,{level,source:"explicit"},origin,!0),this._thinkingLevelSource=this.thinkingLevel===level?"explicit":"clamped"}_setThinkingLevel(level,rememberModelLevel,selection,trigger,stampNoOpEffect=!1){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,rememberModelLevel){(this.supportsThinking()||effectiveLevel!=="off")&&(this._lastManualThinkingLevel=effectiveLevel);let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection,trigger,this.model);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),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded(),this._emitThinkingClampWarningIfNeeded()}else stampNoOpEffect&&trigger?.effectId!==void 0&&this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection,trigger,this.model)}_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,ephemeral=!1){let found=(ephemeral&&explicitLevel!==void 0?[[explicitLevel,"fallback"]]:[[this._sessionThinkingMemory.levelFor(model),"session"],[explicitLevel,"explicit"],[this.settingsManager.getModelThinkingLevel(model.provider,model.id),"global"],[model.defaultThinkingLevel,"model-default"],[this._lastManualThinkingLevel??this.settingsManager.getDefaultThinkingLevel(),"default"]]).find(([candidate])=>candidate!==void 0),requested=found?.[0]??DEFAULT_THINKING_LEVEL,foundSource=found?.[1]??"default",selection=found===void 0||foundSource==="model-default"?void 0:foundSource==="explicit"&&explicitSelection?explicitSelection:{level:requested,source:"explicit"},fromGlobalDefault=found!==void 0&&foundSource==="default",level=this._clampThinkingLevel(requested,getSupportedThinkingLevels2(model)),requestClamped=level!==requested&&foundSource!=="default"&&foundSource!=="fallback";return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requested,level,model),source:requestClamped?"clamped":foundSource}}_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._waitForIdleAfterAbort()})();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&&isDeepStrictEqual3(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual3(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact(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(!prepareCompaction(pathEntries,settings)){let requestId2=randomUUID6(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage6=`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:errorMessage6}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage6,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID6(),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),errorMessage6=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage6}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage6,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,lifecycleState2=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState2.status==="running"&&lifecycleState2.stage==="feedback"?lifecycleState2.operationId:randomUUID6();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=randomUUID6();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal),aborted||this._resumeQueuedMessagesAfterCompaction()}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID6(),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=prepareCompaction(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)");let compactionModel=this._resolveCompactionModel(model);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{model:requestModel,apiKey,headers,extraBody,env,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel,signal,this._summarizationRetryCallbacks({source:"compaction",reason:request2.reason}));compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState2=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState2.status!=="running"||lifecycleState2.operationId!==operationId||lifecycleState2.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(entry2=>entry2.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=estimateMessagesTokens(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 lifecycleState2=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState2.status!=="idle"&&lifecycleState2.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState2.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){return wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model,this._getCompactionSettings())}_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),errorMessage6=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:errorMessage6}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState2=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState2.status==="running"&&lifecycleState2.stage==="feedback"?lifecycleState2.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 compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;let contextTokens=this._estimatePrePromptContextTokens(),limitsModel=this._limitsModel();if(!settings.enabled||!limitsModel||limitsModel.contextWindow<=0||!shouldCompact(contextTokens,limitsModel.contextWindow,settings))return!1;if(assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_estimatePrePromptContextTokens(additions=[]){let branch=this.sessionManager.getBranch(),messages=[...this.sessionManager.buildSessionContext().messages,...additions],estimate=estimateContextTokens(messages),usageMessage=estimate.lastUsageIndex===null?void 0:messages[estimate.lastUsageIndex],usageEntryId=usageMessage?getSessionContextEntryId(usageMessage):void 0,needsProjection=!1;for(let i=branch.length-1;i>=0;i--){let entry2=branch[i];if(usageEntryId!==void 0&&entry2.id===usageEntryId)break;if(entry2.type==="compaction"||entry2.type==="context_edit"){needsProjection=!0;break}}if(!needsProjection)return estimate.tokens;this._prePromptProjection?.branch!==branch&&(this._prePromptProjection={branch,projection:this.sessionManager.buildSessionProjection()});let{projection}=this._prePromptProjection;return estimateProjectedContextTokens({...projection,messages:[...projection.messages,...additions]},branch).tokens}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text3=>({role:"user",content:[{type:"text",text:text3}],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=()=>this._estimatePrePromptContextTokens([...messages,...this._pendingQueuedInputMessages()])>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&&shouldCompact(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 errorMessage6=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage6}),inlineReason==="pre_prompt")throw new Error(errorMessage6);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(this._consumePostCompactionUsageExemption(assistantMessage)||!settings.enabled)return!1;let contextTokens,staleUsageContentTokens;if(inlineReason)contextTokens=this._estimatePrePromptContextTokens();else{let directContextTokens=assistantMessage.usage?calculateContextTokens(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=estimateContextTokens(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens(messages),!shouldCompact(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact(contextTokens,contextWindow,settings))if(inlineReason){let compacted=await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);return compacted||!this._compactionSkippedTooSmall?compacted:(this._compactionSkippedTooSmall=!1,await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction,!1,0))}else{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}return!1}_isCompactionOnCooldown(){let state3=this._compactionLifecycle.state;return state3.status==="failed"&&state3.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(this._compactionSkippedTooSmall=!1,isAutomaticCompactionBlocked(this.sessionManager.getBranch(),this.model,this._getCompactionSettings())||!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID6();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 errorMessage6=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage6);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: ${errorMessage6}`}),!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 contextTokens=this._estimatePrePromptContextTokens(),atHardLimit=shouldCompact(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("continuation"),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),await runBoundedRetryContinuation({continueRun:async()=>{if(this._continueWithQueuedInput)this._continueWithQueuedInput=!1,await this.agent.continueWithQueuedMessages(options);else if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs,onStreamStarted:listener=>{let unsubscribe=this.agent.subscribe(event=>{event.type!=="message_start"||event.message.role!=="assistant"||(unsubscribe(),listener())});return unsubscribe}}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1,this._continueWithQueuedInput=!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}`})}_drainJoinedInput(){this.agent.hasQueuedMessages()&&(this._continueWithQueuedInput=!0,this._scheduleContinuationAfterCurrentEvent())}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry,options={}){if(isAutomaticCompactionBlocked(this.sessionManager.getBranch(),this.model,this._getCompactionSettings())||!(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=randomUUID6();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 prepareCompaction(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 errorMessage6=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage6}`:`Auto-compaction failed: ${errorMessage6}`;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){this._sizesOnlyStartup=bindings2.sizesOnly===!0,this._promptSizeInventory=this._sizesOnlyStartup?bindings2.promptSizeInventory:void 0;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._engineTurnHold.start(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({...this._sessionStartEvent,...this._sizesOnlyStartup?{sizesOnly:!0}:{}}),await restoreMovedState(this.sessionManager,moved=>this._extensionRunner.emitSessionMove({type:"session_move_import",...moved}).then(failures=>failures.length===0)),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),this._lifecycleBinding.isRestored?await this._lifecycleBinding.refreshFacts():await this._lifecycleBinding.restore()}_beginSessionStartSettlement(){let settle2;return this._sessionStartSettled=new Promise(resolve55=>{settle2=resolve55}),settle2}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),this.securityNotices.setResources(this._resourceLoader.getSkills().diagnostics),(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.setLifecycleAttentionObserver(()=>this.refreshLifecycle()),runner.setEventHandlerBudget(()=>({warnMs:this.settingsManager.getExtensionEventHandlerWarnMs(),timeoutMs:this.settingsManager.getExtensionEventHandlerTimeoutMs()}),stall=>reportExtensionHandlerStall(stall,this._sessionLogger,(message,type2)=>runner.getUIContext().notify(message,type2)),()=>this._handlerTurnScope),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._lifecycleBinding.sessionId!==this.sessionId&&(this._lifecycleBinding.dispose(),this._lifecycleBinding=this._createLifecycleBinding()),this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data)),this._lifecycleBinding.bindFactEvents(runner);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]},sessionControl=createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost,relocationHost:()=>this._relocationHost});this._sessionControl=sessionControl,runner.bindCore({sendMessage:(message,options)=>{let reportError=err=>{if(err instanceof ModelNotReadyError){this._noticeProviderRequired(err.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err instanceof Error?err.message:String(err)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim2=>{this.sendCustomMessage(message,options,claim2).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendItemizedMessage:(message,options)=>this._sendItemizedMessage(message,options),sendUserMessage:(content,options,inputOrigin="extension")=>{let reportError=err=>{if(err instanceof ModelNotReadyError){this._noticeProviderRequired(err.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err instanceof Error?err.message:String(err)})};this._agentSettledDelivery.deferTriggerTurn(claim2=>{this.sendUserMessage(content,options,claim2,inputOrigin).catch(reportError)})||this.sendUserMessage(content,options,void 0,inputOrigin).catch(reportError)},appendEntry:(customType,data,options)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data,options),entry2=this.sessionManager.getEntry(entryId);entry2&&this._emit({type:"entry_appended",entry:entry2})},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)},armToolBarrier:spec2=>this.armToolBarrier(spec2),releaseToolBarrier:id=>this.releaseToolBarrier(id),getCommands,setModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model,origin??{source:"extension"}),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model,origin??{source:"extension"}),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl,lifecycle:this.lifecycleApi},{offload:(id,args,options)=>offload(this._toolDispatcher,this._extensionRunner.getAllChildModules(),id,args,options),getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,engineTurnsHeld:()=>this._engineTurnHold.holdsSource("goal"),noteHeldWake:source2=>this._engineTurnHold.note(source2),getPauseState:()=>this._pauseState(),fenceRun:runRef=>this._runHolds.fence(runRef),releaseRunFence:runRef=>this._runHolds.releaseFences("run_cancelled",[runRef]),questionInput:()=>{this._humanInputAdmitted("answer"),this._runHolds.inheritedOwner()===void 0&&(this._captureReleaseExtras(),this._engineTurnInput.begin({consumeAtSettlement:this._stopHoldLive()}),this._engineResumeWindow=!1),queueMicrotask(()=>{this._settleInputRelease()?.catch(error2=>{this._sessionLogger.warn("input_release_settle_failed",{error:error2 instanceof Error?error2.message:String(error2)})})})},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,hasQueuedPersonInput:()=>this.hasQueuedPersonInput,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getCompactionModel:()=>this.model?this._resolveCompactionModel(this.model):void 0,getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),onUserActivity:listener=>this._userActivity.subscribe(listener),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project2=this.settingsManager.getProjectSettings().lookAt;return{enabled:project2?.enabled??global?.enabled??!0,models:project2?.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=randomUUID6();(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 err=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err)}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,getBaseSystemPromptParts:()=>this._baseSystemPromptParts,sizesOnlyStartup:this._sizesOnlyStartup,...this._promptSizeInventory===void 0?{}:{promptSizeInventory:this._promptSizeInventory}},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}get toolDispatcher(){return this._toolDispatcher}_isBuiltinExtensionPath(path14){return path14.startsWith("<builtin:")||path14.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path14)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry2=this._toolDefinitions.get(name);return entry2!==void 0&&!this._isBuiltinExtensionPath(entry2.sourceInfo.path)&&entry2.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(entry2=>entry2!==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(entry2=>entry2!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext,this._toolDispatcher),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,this._toolDispatcher),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)])}armToolBarrier(spec2){let error2=toolBarrierSpecError(spec2);if(error2!==void 0)throw new Error(error2);this._toolBarrier.arm(spec2)}releaseToolBarrier(id){return this._toolBarrier.release(id)}async _waitForToolBarrier(toolCall,signal){if(this._toolDefinitions.get(toolCall.name)?.definition.workspaceEffect==="read")return!1;let wait=this._toolBarrier.wait(signal);return wait?(this._emit({type:"tool_barrier_waiting",id:wait.id,toolCallId:toolCall.id,toolName:toolCall.name}),await wait.done,!0):!1}_getToolExposure(name){let entry2=this._toolDefinitions.get(name);return entry2?normalizeToolExposure(entry2.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry2=this._toolDefinitions.get(name);if(!entry2)return!1;let exposure=normalizeToolExposure(entry2.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry2.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??[]));this._filesystemPolicy=filesystemPolicy;let 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,operations:this._toolDispatcher.bashOperations({shellPath})},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},glob:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value);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 applyProjectTrustChange(){for(;this._promptStartPending||this._sessionStartDispatching;)await new Promise(resolve55=>this._admissionIdleWaiters.push(resolve55));let finishReloadWork=this._sessionWorkBarrier.begin();try{await this._rebuildRuntimeForReload()}finally{finishReloadWork()}}_notifyAdmissionIdle(){if(this._promptStartPending||this._sessionStartDispatching)return;let waiters=this._admissionIdleWaiters;this._admissionIdleWaiters=[];for(let resolve55 of waiters)resolve55()}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldSessionControl=this._sessionControl,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry2=this._toolDefinitions.get(name);entry2&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry2.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:[]),trustEpoch=this.settingsManager.getTrustEpoch();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;for(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});this.settingsManager.getTrustEpoch()!==trustEpoch;)trustEpoch=this.settingsManager.getTrustEpoch(),await this.settingsManager.reload(),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager});time("resources","reload"),this.securityNotices.setResources(this._resourceLoader.getSkills().diagnostics);try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:this._extensionRunner.getFlagValues(),includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{await oldSessionControl?.retire().catch(error2=>{this._extensionRunner.emitError({extensionPath:"<session-control>",event:"reload",error:error2 instanceof Error?error2.message:String(error2)})}),oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();this._sessionStartDispatching=!0;try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{this._sessionStartDispatching=!1,settleSessionStart(),this._notifyAdmissionIdle()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending,()=>this._sessionStartDispatching)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||this._isLocalFailure(message)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isLocalFailure(message){return message.failureSource==="local"}_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._isLocalFailure(message)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&this._requestShapeRecovery.decide(message,this.model?.contextWindow??0)==="not-request-shape"&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}async _handleRequestShapeRejection(message,decision){return decision==="give-up"?(this._requestShapeRecovery.endStreak(),this._emit({type:"auto_retry_end",success:!1,attempt:Math.max(1,this._retryAttempt),finalError:REQUEST_SHAPE_FAILURE_TEXT}),this._retryAttempt=0,"not-handled"):(this._requestShapeRecovery.begin(message.timestamp),this._emitEntryAppended(this.sessionManager.appendCustomEntry(REQUEST_SHAPE_RECOVERY_ENTRY_TYPE,{note:REQUEST_SHAPE_RECOVERY_NOTE,model:message.model})),this._sessionLogger.info("request_shape_recovery",{provider:message.provider,model:message.model}),this._retryAttempt=0,await this._handleRetryableError({...message,errorMessage:REQUEST_SHAPE_RECOVERY_NOTE},{sameModelRemint:!0}))}_takeNativeToolSearchInjectionFailure(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage6){let markerMs=parseRetryAfterMsMarker(errorMessage6);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage6})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage6)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage6})},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,usageLimit:usageLimitScope(message.errorMessage),recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage6){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:errorMessage6}),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(resolve55=>{this._retryResolve=resolve55}));let errorMessage6=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(usageLimitScope(errorMessage6)==="account"){if(switchedFallback=await tryFallback(isBillingErrorMessage(errorMessage6)?"billing":"transient",{errorMessage:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),!switchedFallback){let chainKey=this._retryFallback.exhaustedChainKey;return chainKey&&this._emit({type:"retry_fallback_exhausted",chainKey,lastError:errorMessage6}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:this._terminalFailureText(message,this._retryAttempt)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else 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(errorMessage6)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage6}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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:errorMessage6}),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:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),!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(errorMessage6);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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(errorMessage6),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage6}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage6);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:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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:errorMessage6,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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:errorMessage6,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,errorMessage6);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:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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(errorMessage6),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:errorMessage6,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:usageLimitScope(errorMessage6)==="account"?new AccountUsageLimitError(message.provider,errorMessage6).message:errorMessage6});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("continuation");let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=this._estimatePrePromptContextTokens();if(compactionSettings.enabled&&model&&shouldCompact(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),this.refreshLifecycle();let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
299
|
+
`)}`:prompt}async _runInputHandlers(text3,images,source2,streamingBehavior){if(!this._extensionRunner.hasHandlers("input"))return{text:text3,images};let inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`,inputResult=await this._extensionRunner.emitInput(text3,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:text3,images,inputId}}async _emitInputDisposition(inputId,disposition){inputId!==void 0&&await this._extensionRunner.emit({type:"input_disposition",inputId,disposition})}async prompt(text3,options){let barrierError=options?.toolBarrier===void 0?void 0:toolBarrierSpecError(options.toolBarrier);if(barrierError!==void 0)throw new Error(barrierError);isHumanInput(options)&&options?.humanInputReported!==!0&&this._humanInputAdmitted(promptKind(options));let hold=this.externalAdmission.beginInput({command:this._isExtensionCommandText(text3,options),submittedByCommand:options?.source==="extension"});this._promptsInFlight++;let observedPauseSeq=this._engineTurnHold.currentPauseSeq,heldByNewerStop=!1;try{let origin=options?.inputOrigin??inputOriginOf(options?.source);if(origin==="person"&&this._runHolds.inheritedOwner()!==void 0){this._holdForRun(text3,options),hold.accepted(),options?.promptDisposition?.("handled"),options?.preflightResult?.(!0);return}if(origin==="person"){this._beginPersonInput();let heldCommands=this._takeHeldCommandRun();heldCommands!==void 0&&await heldCommands}await this._prompt(text3,{...options,observedPauseSeq,onHeldByNewerStop:()=>{heldByNewerStop=!0},promptDisposition:disposition=>{disposition!=="started"&&hold.accepted(),!heldByNewerStop&&(disposition==="started"||disposition==="queued")&&this._engineTurnInput.admit(disposition==="queued",message=>this.agent.steer(message)),options?.promptDisposition?.(disposition)},onTurnAdmitted:()=>{hold.accepted(),options?.onTurnAdmitted?.()}}),heldByNewerStop&&(this._deliveredHeldInputIds.length=0,this._engineTurnInput.reject())}finally{this._promptsInFlight--;let settling=this._settleInputRelease();if(settling)try{await settling}finally{hold.end()}else hold.end()}}_beginPersonInput(){emitUserActivity(this,"prompt"),this._deadlineTracker.clearHold(),this._engineResumeWindow=!1,this._captureReleaseExtras(),this._engineTurnInput.begin({consumeAtSettlement:this._stopHoldLive()})}_settleInputRelease(){if(!this._engineTurnInput.hasPending||this._promptsInFlight>0||this._isAgentRunActive||!this.isIdle||this._agentSettledDelivery.active||this._extensionRunner.sessionStartTurnsHeld())return;let newerStop=this._releaseExtrasGeneration!==this._userAbortGeneration;return newerStop&&(this._deliveredHeldInputIds.length=0),this._engineTurnInput.settle(async sources=>{this._heldInputs.consume(this._deliveredHeldInputIds.splice(0)),await this._extensionRunner.emitHeldWakesReleased(sources)},{newerStop})}_holdForRun(text3,options){if(options?.signal?.aborted){let error2=new Error("Prompt cancelled before acceptance");throw error2.name="AbortError",error2}emitUserActivity(this,"prompt");let images=options?.images;this._heldInputs.hold({inputId:options?.clientMessageId??`prompt-${crypto.randomUUID()}`,revision:0,text:text3,...images===void 0||images.length===0?{}:{images},...options?.expandPromptTemplates??!0?{prepare:!0}:{}}).kind==="held"&&this._runHolds.releaseDirectStops()}_holdPreparedInput(text3,images,options){this._heldInputs.hold({inputId:options.clientMessageId??`prompt-${crypto.randomUUID()}`,revision:0,text:text3,...images===void 0||images.length===0?{}:{images}})}_isExtensionCommandText(text3,options){if(!(options?.expandPromptTemplates??!0)||!text3.startsWith("/"))return!1;let spaceIndex=text3.indexOf(" ");return this._extensionRunner.getCommand(spaceIndex===-1?text3.slice(1):text3.slice(1,spaceIndex))!==void 0}async _prompt(text3,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)&&text3.startsWith("/")){let spaceIndex=text3.indexOf(" "),commandName=spaceIndex===-1?text3.slice(1):text3.slice(1,spaceIndex);if(this._extensionRunner.getCommand(commandName)){let handled=await this._tryExecuteExtensionCommand(text3);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 joinedClaim=this._promptStartPending&&!this.isStreaming?this._promptStartClaim:void 0,startWasPending=this._promptStartPending,ownsPromptStart=!1,claim2,claimStart=()=>{ownsPromptStart=!0,claim2={},this._promptStartPending=!0,this._promptStartClaim=claim2};!this.isStreaming&&!startWasPending&&claimStart();let releaseStart=started=>{!ownsPromptStart||claim2===void 0||(claim2.started=started,this._promptStartPending=!1,this._notifyAdmissionIdle(),!started&&claim2.joined===!0&&!this.isStreaming&&(this._flushPostCompactionDeferredMessages(),this._drainJoinedInput()))},noteJoined=()=>{ownsPromptStart||joinedClaim===void 0||(joinedClaim.started===!1?this.isStreaming||this._drainJoinedInput():joinedClaim.joined=!0)},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;joinedClaim?.started===!1&&!this.isStreaming&&(startWasPending=this._promptStartPending,startWasPending||claimStart());let canQueueWhileStreaming=(this.isStreaming||startWasPending)&&!this.isCompacting&&options?.streamingBehavior!==void 0,canQueueDuringAutoCompaction=this._autoCompactionAbortController!==void 0&&this._compactionAbortController===void 0&&!this.isStreaming&&!startWasPending&&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();let model=this.model;if(model&&!this._pendingModelSwitch&&this._retryFallback.isProviderSpent(model.provider)){this._retryFallback.resetTurn();let errorMessage6=this._retryFallback.accountError(model.provider);if(!await this._retryFallback.tryFallback("transient",{errorMessage:errorMessage6},!1))throw new AccountUsageLimitError(model.provider,errorMessage6)}}catch(error2){throw releaseStart(!1),error2}let expandPromptTemplates=options?.expandPromptTemplates??!0,preflightResult=options?.preflightResult,promptDisposition=options?.promptDisposition,messages,titlePrompt,consumedNextTurnMessages,consumedReleaseExtras,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:text3,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=text3,currentImages=options?.images;if(this._extensionRunner.hasHandlers("input")){inputId=`${this.sessionManager.getSessionId()}:${++this._nextInputId}`;let inputResult=await this._extensionRunner.emitInput(currentText,currentImages,options?.source??"interactive",this.isStreaming?options?.streamingBehavior:void 0,inputId);if(throwIfCancelled(),inputResult.action==="handled"){await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0);return}inputResult.action==="transform"&&!keepsTextBlocksVerbatim(options?.textBlocks)&&(currentText=inputResult.text,currentImages=inputResult.images??currentImages)}let expandedText=currentText;if(expandPromptTemplates){let skillExpansion=this._expandSkillCommand(expandedText);expandedText=typeof skillExpansion=="string"?skillExpansion:await skillExpansion;let templateExpansion=expandPromptTemplateWithMetadata(expandedText,[...this.promptTemplates]);expandedText=templateExpansion.text,expandedText===currentText&&options?.source!=="extension"&&options?.unknownCommandAsText!==!0&&!/^\s/.test(text3)&&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??text3,this.isStreaming){if(!options?.streamingBehavior)throw new AgentBusyError("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.");releaseStart(!1),options.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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.");releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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.");releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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.");releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),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")){releaseStart(!1),options?.streamingBehavior==="followUp"?await this._queueFollowUp(expandedText,currentImages,options):await this._queueSteer(expandedText,currentImages,options),noteJoined(),emitPendingCommandInvocation(),await emitInputDisposition("queued"),promptDisposition?.("queued"),preflightResult?.(!0);return}this._flushPendingBashMessages(),this._extensionBindingPromptReadiness===void 0&&!this._lifecycleBinding.isRestored&&await this._lifecycleBinding.restore(),await this._assertModelReadyForTurn(),await this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(),!1,"pre_prompt"),messages=[];let environmentContext=this._pendingEnvironmentContextMessage();environmentContext&&messages.push(environmentContext);let releaseExtras=this._releaseExtras.splice(0);consumedReleaseExtras=releaseExtras;let turnInput=this._engineTurnInput.messages();if(releaseExtras.length>0){let prepared=await Promise.allSettled(releaseExtras);consumedReleaseExtras=releaseExtras.filter((_,index)=>prepared[index]?.status==="fulfilled");let rejected=prepared.find(result4=>result4.status==="rejected");if(rejected!==void 0)throw rejected.reason;messages.push(...prepared.flatMap(result4=>result4.status==="fulfilled"?[result4.value]:[]))}messages.push(...turnInput);let userContent=userTextContent(expandedText,options?.textBlocks);currentImages&&userContent.push(...currentImages);let userMessage2={role:"user",content:userContent,timestamp:Date.now(),...clientMessageIdentity(options)};this._userInputSources.set(userMessage2,options?.source??"interactive"),messages.push(userMessage2),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);if(this._applyBeforeAgentStartResult(messages,result3,userMessage2),await this._enforceFinalProviderAdmission(messages),throwIfCancelled(),options.observedPauseSeq!==void 0&&this._stopAddedSince(options.observedPauseSeq)){this._holdPreparedInput(expandedText,currentImages,options),consumedNextTurnMessages!==void 0&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),options.onHeldByNewerStop?.(),await emitInputDisposition("handled"),promptDisposition?.("handled"),preflightResult?.(!0),messages=void 0;return}await emitInputDisposition("started")}catch(error2){throw await emitInputDisposition("rejected"),consumedReleaseExtras!==void 0&&this._releaseExtras.unshift(...consumedReleaseExtras.filter(extra=>!this._releaseExtras.includes(extra))),consumedNextTurnMessages&&consumedNextTurnMessages.length>0&&(this._pendingNextTurnMessages=[...consumedNextTurnMessages,...this._pendingNextTurnMessages]),preflightResult?.(!1),error2}finally{releaseStart(messages!==void 0)}if(messages){options?.toolBarrier&&this._toolBarrier.arm(options.toolBarrier);try{promptDisposition?.("started"),emitPendingCommandInvocation(),preflightResult?.(!0),options?.thinkingLevel!==void 0&&this.setSessionThinkingLevel(options.thinkingLevel),await this._promptAgent(messages,{inputOrigin:originOf(options),onQueuedInput:options?.onQueuedInput,onTurnAdmitted:options?.onTurnAdmitted})}catch(error2){throw options?.toolBarrier&&!this._isAgentRunActive&&this._toolBarrier.release(options.toolBarrier.id),error2}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,prompt){if(result3?.messages)for(let msg of result3.messages){let index=msg.placement==="before-prompt"?messages.indexOf(prompt):messages.length;messages.splice(index,0,{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(text3){let spaceIndex=text3.indexOf(" "),commandName=spaceIndex===-1?text3.slice(1):text3.slice(1,spaceIndex),args=spaceIndex===-1?"":text3.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(err){return this._extensionRunner.emitError({extensionPath:`command:${commandName}`,event:"command",error:err instanceof Error?err.message:String(err)}),!0}}_rejectUnknownCommand(text3){if(commandShapedName(text3)===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(text3,{promptCommands,interactiveCommands});if(rejection)throw rejection}_expandSkillCommand(text3){let skills=this.resourceLoader.getSkills().skills,invocationTokens=parseSkillInvocationTokens(text3,{knownSkillNames:new Set(skills.map(skill=>skill.name))});return invocationTokens.length===0?text3:this._expandSkillTokens(text3,skills,invocationTokens)}async _expandSkillTokens(text3,skills,invocationTokens){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=await readSkillFileChecked(skill.filePath,skill.provenance,skill.allowedSet),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(err){return err instanceof BlockedSkillLinkError&&this.securityNotices.add({category:"skill-link-blocked",message:err.message,path:skill.filePath}),this._extensionRunner.emitError({extensionPath:skill.filePath,event:"skill_expansion",error:err instanceof Error?err.message:String(err)}),text3}}if(skippedSkillNames.length>0){let count2=skippedSkillNames.length;this._extensionRunner.emitError({extensionPath:"skill:expansion",event:"skill_expansion",error:`Skipped ${count2} skill${count2===1?"":"s"} (${skippedSkillNames.join(", ")}): at most ${maxExpansions} skills load per prompt. Raise maxSkillExpansionsPerPrompt to load more.`})}if(skillBlocks.length===0)return text3;let userRequest=removeSkillInvocationTokens(text3,removedTokens,unloadedTokens);return this._emit({type:"skill_invocation",skills:invocationMetadata}),formatSkillInvocationPrompt(skillBlocks,userRequest)}_queueUserInput(text3,images,behavior,options){let hold=this.externalAdmission.beginInput();if(originOf(options)==="person"&&this._engineTurnHold.held)return this._promptHeldQueuedInput(text3,images,behavior,options,hold);let admitted=this._admitQueuedInput(text3,images,behavior,options);return admitted.then(hold.end,hold.end),admitted}async _promptHeldQueuedInput(text3,images,behavior,options,hold){try{return await this.prompt(text3,{...options,images,streamingBehavior:behavior,humanInputReported:!0,promptDisposition:disposition=>{disposition!=="started"&&hold.accepted()},onTurnAdmitted:()=>hold.accepted()}),"queued"}finally{hold.end()}}async _admitQueuedInput(text3,images,behavior,options){originOf(options)==="person"&&this._beginPersonInput(),text3.startsWith("/")&&this._throwIfExtensionCommand(text3);let processedInput=await this._runInputHandlers(text3,images,options?.source??"interactive",this.isStreaming?behavior:void 0);if(!processedInput)return"handled";let skillExpansion=this._expandSkillCommand(processedInput.text),expandedText=typeof skillExpansion=="string"?skillExpansion:await skillExpansion,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(text3,images,options){return isHumanInput(options)&&this._humanInputAdmitted("steer"),this._queueUserInput(text3,images,"steer",options)}async followUp(text3,images,options){return isHumanInput(options)&&this._humanInputAdmitted("follow_up"),this._queueUserInput(text3,images,"followUp",options)}_startSessionTitleGeneration(firstPrompt){if(!this._autoTitleSessions||this.sessionManager.getSessionName()||shouldSkipSessionTitle(firstPrompt)||this._sessionTitleAbortController!==void 0)return;let model=this.model;if(!model)return;let abortController=new AbortController;this._sessionTitleAbortController=abortController,this._sessionTitlePromise=this._generateSessionTitle(firstPrompt,model,abortController)}async _generateSessionTitle(firstPrompt,model,abortController){try{let auth=await this._getSummarizationRequestAuth(model,abortController.signal,{}),title=await generateSessionTitle({firstPrompt,model,auth,sessionId:this.sessionId,baseOptions:this._buildSessionTitleBaseOptions(),retry:sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),signal:abortController.signal,streamFn:this.agent.streamFunction});if(abortController.signal.aborted)return;title&&!this.sessionManager.getSessionName()&&this.setSessionName(title)}catch(error2){if(abortController.signal.aborted)return;this._sessionLogger.debug("session_title_failed",{error:error2 instanceof Error?error2.message:String(error2)})}finally{this._sessionTitleAbortController===abortController&&(this._sessionTitleAbortController=void 0),this._sessionTitlePromise!==void 0&&(this._sessionTitlePromise=void 0)}}abortSessionTitleGeneration(){this._sessionTitleAbortController?.abort(),this._sessionTitleAbortController=void 0}_buildSessionTitleBaseOptions(){return{onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,timeoutMs:this.agent.timeoutMs,maxRetryDelayMs:this.agent.maxRetryDelayMs}}async _queueSteer(text3,images,options){await this._enqueueQueuedInput({...options,text:text3,images,mode:"steer"})}async _queueFollowUp(text3,images,options){await this._enqueueQueuedInput({...options,text:text3,images,mode:"followUp"})}async _enqueueQueuedInput(input){let clientMessageId=input.clientMessageId,sourced={...input,source:input.source??"interactive"};if(clientMessageId===void 0){this._enqueuePreparedInput(sourced);return}await this._pendingInputs.admit({clientMessageId,text:input.text,...input.images?{images:input.images}:{},mode:input.mode},queuedId=>this._enqueuePreparedInput({...sourced,queuedId}))}async restoreQueuedInput(input){let restored=input.clientMessageId===void 0?void 0:await this._pendingInputs.restoreHandle(input.clientMessageId);restored!=="retired"&&this._enqueuePreparedInput(restored===void 0?input:{...input,queuedId:restored.queuedId})}_enqueuePreparedInput(input){let enqueueOrder=input.enqueueOrder??this.reserveQueuedInputOrder(),prepared={...clientMessageIdentity(input),text:input.text,images:input.images,mode:input.mode,enqueueOrder,...input.source===void 0?{}:{source:input.source}};input.onQueuedInput?.(prepared);let queue=input.mode==="steer"?this._steeringMessages:this._followUpMessages;queue.push(input.text);let queuedId=this._recordQueuedInput(input.text,input.mode,prepared,void 0,input.queuedId);originOf(input)==="person"&&this._personQueuedIds.add(queuedId),this._sessionLogger.debug("queue_enqueue",{mode:input.mode,count:queue.length});let message={role:"user",content:[...userTextContent(input.text,input.textBlocks),...input.images??[]],timestamp:Date.now(),...clientMessageIdentity(input)};input.source!==void 0&&this._userInputSources.set(message,input.source),this._queuedMessages.set(queuedId,message),this._promptStartPending&&this._skipNextPostCompactionAssistantCheck?(input.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages).push(message):input.mode==="steer"?this.agent.steer(message):this.agent.followUp(message),this._emitQueueUpdate()}_flushPostCompactionDeferredMessages(){let steering=this._postCompactionDeferredSteeringMessages,followUps=this._postCompactionDeferredFollowUpMessages;this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[],this._requeueAtOriginalPlace(steering,"steer"),this._requeueAtOriginalPlace(followUps,"followUp")}_requeueAtOriginalPlace(parked,mode){if(parked.length===0)return;let enqueueOrderOf=new Map;for(let input of this._queuedInputOrder){let message=this._queuedMessages.get(input.queuedId);message!==void 0&&enqueueOrderOf.set(message,input.enqueueOrder)}let orderOf=message=>enqueueOrderOf.get(message)??Number.POSITIVE_INFINITY,oldestParked=Math.min(...parked.map(orderOf)),parkedSet=new Set(parked),newer=this._queuedInputOrder.filter(input=>input.mode===mode&&input.enqueueOrder>oldestParked).map(input=>this._queuedMessages.get(input.queuedId)).filter(message=>message!==void 0&&!parkedSet.has(message)&&this.agent.removeQueuedMessage(message));for(let message of[...parked,...newer].sort((a,b)=>orderOf(a)-orderOf(b)))mode==="steer"?this.agent.steer(message):this.agent.followUp(message)}_throwIfExtensionCommand(text3){let spaceIndex=text3.indexOf(" "),commandName=spaceIndex===-1?text3.slice(1):text3.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.`)}_wakeGateApplies(customType,options){return customTurnOrigin(customType)==="engine"&&options?.deliverAs!=="nextTurn"&&options?.triggerTurn!==!1&&(this.isStreaming||options?.triggerTurn===!0)}_sendItemizedMessage(message,options){let receipts=Promise.withResolvers(),admit=claim2=>{this._admitItemized(message,options,claim2).then(receipts.resolve,error2=>{error2 instanceof ModelNotReadyError&&this._noticeProviderRequired(error2.message),receipts.reject(error2)})};return options.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim2=>admit(claim2))||this._agentSettledDelivery.defer(()=>admit())||admit(),receipts.promise}async _admitItemized(message,options,claim2){let{items}=options;if(this._wakeGateApplies(message.customType,options)&&(this._engineTurnHold.holdsSource(engineWakeSource(message.customType))||this._runHolds.holdsWake(message.details)||items.some(item=>this._engineTurnHold.holdsSource(item.producer)||this._runHolds.holdsWake({runRef:item.runRef})))){if(claim2?.resolve("finished-without-start"),options.ticket!==void 0){let admission=this.workObligations.admission(options.ticket);if(admission!=="admitted")throw new DeliveryTicketRefused(options.ticket,admission)}let notices=this._engineTurnHold.noteItems(items.map(item=>({source:item.producer,message:itemNoticeMessage(message,item),item}))),firstNotice=notices[0];return options.ticket!==void 0&&firstNotice!==void 0&&this.workObligations.held(options.ticket,firstNotice.noticeId),notices.map(notice2=>({...notice2,disposition:"notice_persisted"}))}let outcome=Promise.withResolvers();return this.sendCustomMessage(message,options,claim2,void 0,{persisted:entryId=>outcome.resolve(deliveredReceipts(items,entryId)),failed:outcome.reject,droppedByAbort:()=>{this._admitItemized(message,options).then(outcome.resolve,outcome.reject)},itemIds:items.map(item=>item.itemId)}).catch(outcome.reject),outcome.promise}_joinPersistWatcher(carrier,joined){let first=this._persistWatchers.get(carrier);this._persistWatchers.set(carrier,first===void 0?joined:{persisted:entryId=>{first.persisted(entryId),joined.persisted(entryId)},failed:error2=>{first.failed(error2),joined.failed(error2)},itemIds:first.itemIds})}_queuedTicketCarrier(ticket){return[...this.agent.peekQueuedMessages({all:!0}),...this._pendingNextTurnMessages].find(queued=>queued.role==="custom"&&messageTicket(queued)===ticket)}_recordWrittenTicket(message,entryId){let ticket=message.role==="custom"?messageTicket(message):void 0;ticket!==void 0&&this._carrierJoiners.has(ticket)&&this._writtenTicketEntries.set(ticket,entryId)}_takePersistWatcher(message){let watcher=this._persistWatchers.get(message);return this._persistWatchers.delete(message),watcher}async sendCustomMessage(message,options,deferredTurnClaim,releasedWake,itemized,onQueued){let deliveryMessage2={...message,content:message.content??[]};if(this._sizesOnlyStartup&&options?.triggerTurn===!0){this._pendingNextTurnMessages.push({role:"custom",...deliveryMessage2,timestamp:Date.now()}),deferredTurnClaim?.resolve("finished-without-start");return}let obligations=this.workObligations,deliveryId=deliveryIdOf({...deliveryMessage2,role:"custom",timestamp:Date.now()}),engineTicket=options?.ticket===void 0&&options?.deliverAs!=="nextTurn"&&(this.isStreaming||options?.triggerTurn===!0)?obligations.open(`${ENGINE_DELIVERY_KEY_PREFIX}${message.customType}:${deliveryId??randomUUID6()}`,"background").ticket():void 0,ticket=options?.ticket??engineTicket,generation2=this._userAbortGeneration,admission=ticket===void 0?"admitted":obligations.admission(ticket);if(ticket!==void 0&&admission!=="admitted"){if(deferredTurnClaim?.resolve("finished-without-start"),itemized!==void 0){itemized.failed(new DeliveryTicketRefused(ticket,admission));return}if(admission==="unknown")throw new CustodyViolation(ticket);return}let queuedCarrier=ticket===void 0?void 0:this._queuedTicketCarrier(ticket),carrierItems=queuedCarrier&&ticket!==void 0?this._persistWatchers.get(queuedCarrier)?.itemIds??obligations.queuedItemIds(ticket):void 0;if(ticket!==void 0&&itemized?.itemIds&&carrierItems&&!sameItems(carrierItems,itemized.itemIds)){deferredTurnClaim?.resolve("finished-without-start"),itemized.failed(new DeliveryTicketRefused(ticket,"different_items"));return}ticket&&queuedCarrier===void 0&&this._writtenTicketEntries.delete(ticket);let joinsCarrier=ticket!==void 0&&queuedCarrier!==void 0;joinsCarrier&&this._carrierJoiners.set(ticket,(this._carrierJoiners.get(ticket)??0)+1),ticket&&queuedCarrier===void 0&&obligations.queue(ticket,{message:deliveryMessage2,deliverAs:options?.deliverAs,...itemized?.itemIds?{itemIds:itemized.itemIds}:{}}),onQueued?.();let readmit=!1,delivery=itemized===void 0?void 0:{persisted:itemized.persisted,failed:itemized.failed,droppedByAbort:()=>{readmit=!0},itemIds:itemized.itemIds};try{let startsTurn=options?.triggerTurn===!0&&!this.isStreaming;startsTurn&&this._pendingCustomTurnHeaders++;try{await this.sessionManager.persistHeaderNow()}finally{startsTurn&&this._pendingCustomTurnHeaders--}if(generation2!==this._userAbortGeneration){ticket&&this._retireLifecycleDelivery(ticket,!this._isEngineDelivery(ticket)),deferredTurnClaim?.resolve("finished-without-start"),readmit=itemized!==void 0;return}await this._deliverCustomMessage(deliveryMessage2,{...options,ticket,...queuedCarrier!==void 0?{joinsQueuedCarrier:!0}:{}},deferredTurnClaim,releasedWake,delivery),ticket&&generation2!==this._userAbortGeneration&&([...this.agent.peekQueuedMessages({all:!0}),...this._pendingNextTurnMessages].some(queued=>queued.role==="custom"&&messageTicket(queued)===ticket)||this._retireLifecycleDelivery(ticket,!this._isEngineDelivery(ticket)))}catch(error2){throw ticket&&obligations.failed(ticket),error2}finally{ticket&&obligations.endDelivery(ticket),joinsCarrier&&this._leaveCarrier(ticket),readmit&&itemized?.droppedByAbort()}}_leaveCarrier(ticket){let joiners=(this._carrierJoiners.get(ticket)??1)-1;if(joiners>0){this._carrierJoiners.set(ticket,joiners);return}this._carrierJoiners.delete(ticket),this._writtenTicketEntries.delete(ticket)}_queuedDeliveryTickets(){return this.agent.peekQueuedMessages({all:!0}).flatMap(queued=>{let ticket=queued.role==="custom"?messageTicket(queued):void 0;return ticket===void 0?[]:[ticket]})}_isEngineDelivery(ticket){return this.workObligations.active.some(record10=>record10.ticketId===ticket&&record10.key.startsWith(ENGINE_DELIVERY_KEY_PREFIX))}_releaseQueuedDeliveries(tickets,cause){for(let ticket of tickets){let engineOwned=this._isEngineDelivery(ticket);cause==="cleared"?engineOwned?this.workObligations.cancel(ticket):this.workObligations.retire(ticket):engineOwned&&this.workObligations.passive(ticket)}}_settleRemovedCarriers(removed){for(let message of removed){let watcher=this._takePersistWatcher(message);watcher?.failed(new QueuedDeliveryCleared(watcher.itemIds))}}_retireLifecycleDelivery(ticket,producerOwned){let removed=[];for(let queued of this.agent.peekQueuedMessages({all:!0}))queued.role==="custom"&&messageTicket(queued)===ticket&&(this.agent.removeQueuedMessage(queued),removed.push(queued));this._pendingNextTurnMessages=this._pendingNextTurnMessages.filter(queued=>{let carriesTicket=messageTicket(queued)===ticket;return carriesTicket&&removed.push(queued),!carriesTicket}),this._settleRemovedCarriers(removed),producerOwned?this.workObligations.retire(ticket):this.workObligations.cancel(ticket)}async _deliverCustomMessage(message,options,deferredTurnClaim,releasedWake,itemized){let userAbortGeneration=this._userAbortGeneration,queuedCarrier=options?.ticket===void 0?void 0:this._queuedTicketCarrier(options.ticket);if(queuedCarrier!==void 0){itemized!==void 0&&this._joinPersistWatcher(queuedCarrier,itemized),deferredTurnClaim?.resolve("delegated");return}if(options?.joinsQueuedCarrier===!0&&options.ticket!==void 0){let writtenEntry=this._writtenTicketEntries.get(options.ticket);if(writtenEntry!==void 0){itemized?.persisted(writtenEntry),deferredTurnClaim?.resolve("delegated");return}deferredTurnClaim?.resolve("finished-without-start"),itemized?.failed(new QueuedDeliveryCleared(itemized.itemIds));return}let appMessage={role:"custom",customType:message.customType,content:message.content,display:message.display,details:options?.ticket?{...typeof message.details=="object"&&message.details!==null&&!Array.isArray(message.details)?message.details:message.details===void 0?{}:{producerDetails:message.details},ticketId:options.ticket}:message.details,timestamp:Date.now()};if(this._sizesOnlyStartup&&options?.triggerTurn===!0){this._pendingNextTurnMessages.push(appMessage),deferredTurnClaim?.resolve("finished-without-start");return}if(itemized!==void 0&&this._persistWatchers.set(appMessage,itemized),!releasedWake&&this._wakeGateApplies(message.customType,options)&&(this._engineTurnHold.holdsSource(engineWakeSource(message.customType))||this._runHolds.holdsWake(message.details))){if(this._engineTurnHold.note(engineWakeSource(message.customType),appMessage),options?.ticket){let noticeId=heldLifecycleNotice(this,options.ticket,message.customType);noticeId&&this.workObligations.held(options.ticket,noticeId)}deferredTurnClaim?.resolve("finished-without-start");return}let 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){this._persistWatchers.delete(appMessage),itemized?.droppedByAbort();return}finishSessionWork=this._sessionWorkBarrier.begin()}if(options?.deliverAs==="nextTurn")this._pendingNextTurnMessages.push(appMessage);else if(this.isStreaming&&options?.triggerTurn!==!1){if(releasedWake)return;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")){if(releasedWake)return;deferredTurnClaim?.resolve("delegated"),options?.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage)}else if(options?.triggerTurn&&this._stopEngineTurn(message.customType))releasedWake||this._recordRefusedEngineTurnMessage(appMessage);else if(options?.triggerTurn){finishSessionWork??=this._sessionWorkBarrier.begin();let environmentContext=this._pendingEnvironmentContextMessage(),messages=environmentContext?[environmentContext,appMessage]:[appMessage],queueTriggerForLater=()=>{releasedWake||(options.deliverAs==="followUp"?this.agent.followUp(appMessage):this.agent.steer(appMessage))};this._triggerTurnAdmissionAbortGeneration=userAbortGeneration;try{this._extensionBindingPromptReadiness===void 0&&!this._lifecycleBinding.isRestored&&await this._lifecycleBinding.restore(),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,appMessage),await this._enforceFinalProviderAdmission(messages),userAbortGeneration!==this._userAbortGeneration){queueTriggerForLater();return}}catch(error2){throw queueTriggerForLater(),error2}finally{this._triggerTurnAdmissionAbortGeneration=void 0}if(releasedWake&&!releasedWake())return;let inputOrigin=customTurnOrigin(message.customType);inputOrigin==="engine"&&this._recordEngineTurnStart(message.customType),await this._promptAgent(messages,{inputOrigin,deferredTurnClaim})}else this.isStreaming?(options?.ticket&&this.workObligations.passive(options.ticket),this._pendingCustomMessages.push(appMessage)):(options?.ticket&&this.workObligations.passive(options.ticket),this._appendCustomMessage(appMessage))}finally{deferredTurnClaim?.resolve("finished-without-start"),finishSessionWork?.()}}onHumanInputAdmitted(listener){return this._humanInputListeners.add(listener),()=>this._humanInputListeners.delete(listener)}admitHumanAnswer(){let input=this.externalAdmission.beginInput();try{this._humanInputAdmitted("answer")}finally{input.end()}}_humanInputAdmitted(kind){let event={kind,at:Date.now()};for(let listener of this._humanInputListeners)try{listener(event)}catch(error2){this._sessionLogger.warn("human_input_listener_failed",{error:String(error2)})}}resumeSession(){return this.beginResume({}).then(({settled:settled2})=>settled2)}async resumeSessionRequest(request2){let{answer:answer3,settled:settled2}=await this.beginResume(request2);return await settled2,answer3}async beginResume(request2){this._humanInputAdmitted("resume");let replayed=request2.effectId===void 0?void 0:this._resumeEffects.get(request2.effectId);if(replayed!==void 0)return{answer:{...replayed,replayed:!0},settled:Promise.resolve()};let input=this.externalAdmission.beginInput(),result3;try{result3=await this._resumeOnce(request2,()=>input.accepted())}catch(error2){throw input.end(),error2}return result3.settled.then(input.end,input.end),request2.effectId!==void 0&&result3.answer.resumed&&(this._resumeEffects.set(request2.effectId,result3.answer),this._emitEntryAppended(this.sessionManager.appendCustomEntry(RESUME_EFFECT_ENTRY,{effectId:request2.effectId,answer:result3.answer}))),result3}async _resumeOnce(request2,onQueued){let pauseSeq=this._engineTurnHold.currentPauseSeq,holds2=this._engineTurnHold.holds,idle={pauseSeq,turnStarted:!1,deliveredNotices:0,deliveredHeldInputs:0},answered=answer3=>({answer:answer3,settled:Promise.resolve()});if(holds2.length===0&&!this._engineTurnHold.awaitingInput)return answered({resumed:!1,reason:"not_paused",...idle});let inherited2=this._runHolds.inheritedOwner();if(inherited2!==void 0&&holds2.every(hold=>hold.kind==="inherited_hold"))return answered({resumed:!1,reason:"resume_through_parent",parentSessionId:inherited2.parentSessionId,...idle});if(request2.expectedSeq!==void 0&&request2.expectedSeq!==pauseSeq)return answered({resumed:!1,reason:"stale",...idle});if(request2.mode==="release"||inherited2!==void 0)return this._engineTurnHold.attend(),this._engineTurnHold.release(holds2.filter(hold=>hold.kind==="session_hold"||hold.kind==="unattended").map(hold=>hold.key),"resume_session"),answered({resumed:!0,...idle});request2.message!==void 0&&this._heldInputs.hold({inputId:`resume-${request2.effectId??crypto.randomUUID()}`,revision:0,text:request2.message});let deliveredNotices=this._engineTurnHold.noticeCount,deliveredHeldInputs=this._heldInputs.pending().length;if(this._stopHoldLive()&&(this._resumeCause()==="stop"||deliveredNotices===0||this._engineTurnHold.messages().length>0)||this._engineTurnHold.fences.length>0||deliveredHeldInputs>0){let{turnStarted,settled:settled3}=await this._resumeAfterStop(onQueued);return{answer:{resumed:!0,pauseSeq,turnStarted,deliveredNotices,deliveredHeldInputs},settled:settled3}}let settled2=this._engineTurnRelease.resume(this._engineTurnHold,async(message,admit)=>{let generation2=this._userAbortGeneration;await this.waitForIdle();let claim2=new DeferredTurnClaim;return await this.sendCustomMessage(message,{triggerTurn:!0},claim2,admit,void 0,onQueued),await claim2.disposition!=="started"?!1:(await this.waitForIdle(),generation2!==this._userAbortGeneration?(this._engineTurnHold.invalidate(),this._engineTurnHold.rejectInput(),!1):!0)},sources=>this._extensionRunner.emitHeldWakesReleased(sources));return{answer:{resumed:!0,pauseSeq,turnStarted:deliveredNotices>0,deliveredNotices,deliveredHeldInputs:0},settled:settled2}}async _resumeAfterStop(onQueued){let resumeCause=this._resumeCause(),sources=this._engineTurnHold.releaseAll("resume_session"),{turnId,delivered}=await this._startResumeTurn(onQueued,resumeCause),settled2=(async()=>{if(!await delivered){this._engineTurnHold.rejectInput();return}let remaining=this._engineTurnHold.finish();this._engineTurnHold.held||await this._extensionRunner.emitHeldWakesReleased({...sources,...remaining})})();return{turnStarted:turnId!==void 0,settled:settled2}}resumeSettled(){return this._resumeSettlement}async _startResumeTurn(onQueued,resumeCause="stop"){let settlement=Promise.withResolvers();this._resumeSettlement=settlement.promise;try{let generation2=this._userAbortGeneration,continues=new Set,prepared=new Map,heldInputs;for(;;){if(this._runHolds.inheritedOwner()!==void 0)return settlement.resolve(),{turnId:void 0,delivered:Promise.resolve(!1)};let commands=this._takeHeldCommands();if(continues=commands.continues,commands.run!==void 0){await commands.run;continue}let pending=this._heldInputs.pending().filter(input=>!continues.has(input.inputId)),unread=pending.filter(input=>prepared.get(input.inputId)?.entryId!==input.entryId);if(unread.length===0){heldInputs=pending.map(input=>prepared.get(input.inputId)??input);break}await Promise.all(unread.map(async input=>{prepared.set(input.inputId,{...input,text:await this._preparedHeldText(input)})}))}let started=await this._startResumeTurnWith(generation2,continues,heldInputs,onQueued,resumeCause);return started.delivered.then(()=>settlement.resolve(),()=>settlement.resolve()),started}catch(error2){throw settlement.resolve(),error2}}_startResumeTurnWith(generation2,continues,heldInputs,onQueued,resumeCause="stop"){return startRunResumeTurn({resumeCause,heldInputs:()=>heldInputs,continueInputs:()=>[...continues],heldWakes:()=>this._engineTurnHold.messages(),send:message=>this.sendCustomMessage(message,{triggerTurn:!0},void 0,()=>!0,void 0,onQueued),turnStarted:until=>this._nextTurnStart(until),idle:()=>this.waitForIdle(),current:()=>generation2===this._userAbortGeneration,consume:(inputIds,sources)=>{this._heldInputs.consume(inputIds);for(let source2 of sources)this._engineTurnHold.consume(source2)},sendFailed:error2=>this._sessionLogger.warn("resume_turn_send_failed",{error:String(error2)})})}holdInput(input){return this._heldInputs.hold(input)}withdrawHeldInput(inputId){return this._heldInputs.withdraw(inputId)}get pausedHeldInputCount(){return this._heldInputs.pending().length}_captureReleaseExtras(){if(!this._engineTurnHold.held||this._engineTurnHold.releasing||this._releaseExtras.length>0)return;this._releaseExtrasGeneration=this._userAbortGeneration,this._stopHoldLive()&&this._releaseExtras.push({role:"custom",...stopResumeDirective(this._resumeCause()),timestamp:Date.now()});let{messages,commands}=this._takeHeldInputs();this._releaseExtras.push(...messages),commands!==void 0&&(this._heldCommandRun=commands)}_takeHeldCommandRun(){let run2=this._heldCommandRun;return this._heldCommandRun=void 0,run2}_takeHeldCommands(){let commands=[],continues=new Set,hasMessages=this.agent.state.messages.length>0;for(let input of this._heldInputs.pending()){if(input.prepare!==!0)continue;let hasImages=(input.images?.length??0)>0;this._isExtensionCommandText(input.text)?commands.push(input):isManualContinueSubmission({text:input.text,hasMessages,hasImages})&&continues.add(input.inputId)}return commands.length===0?{run:void 0,continues}:(this._heldInputs.consume(commands.map(input=>input.inputId)),{run:(async()=>{for(let input of commands)await this._tryExecuteExtensionCommand(input.text)})().catch(error2=>this._sessionLogger.warn("held_command_failed",{error:String(error2)})),continues})}async _preparedHeldText(input){return input.prepare!==!0?input.text:expandPromptTemplateWithMetadata(await this._expandSkillCommand(input.text),[...this.promptTemplates]).text}_takeHeldInputs(){let{run:run2,continues}=this._takeHeldCommands(),pending=this._heldInputs.pending();return this._deliveredHeldInputIds.push(...pending.map(input=>input.inputId)),{messages:pending.filter(input=>!continues.has(input.inputId)).map(input=>{let timestamp=Date.now(),message=this._preparedHeldText(input).then(text3=>({role:"custom",customType:HELD_INPUT_ENTRY,content:input.images===void 0?text3:[{type:"text",text:text3},...input.images],display:!0,timestamp}));return message.catch(()=>{}),message}),commands:run2}}async pauseForRun(owner){let result3=this._runHolds.inherit(owner);return"childSeq"in result3&&await this.abort(),result3}async resumeForRun(request2){let released=this._runHolds.releaseInherited(request2);if(!released.released||released.otherHoldLive||this._engineTurnHold.isHeld())return released;let{turnId,delivered}=await this._startResumeTurn();return delivered.catch(error2=>this._sessionLogger.warn("run_resume_settle_failed",{error:String(error2)})),turnId===void 0?released:{...released,turnId}}_pauseState(){let holds2=this._engineTurnHold.holds.map(({kind,key,data})=>({kind,key,...data===void 0?{}:{data}}));return{pauseSeq:this._engineTurnHold.currentPauseSeq,holds:holds2}}_emitHoldChanged(event){let change=event.type==="session_paused"?"paused":"resumed";this._extensionRunner.emit({type:"session_hold_changed",change,...this._pauseState(),pauseSeq:event.pauseSeq}).catch(error2=>this._sessionLogger.warn("session_hold_changed_failed",{error:String(error2)}))}_nextTurnStart(until){return new Promise(resolve55=>{let unsubscribe=this.subscribe(event=>{event.type==="agent_start"&&(unsubscribe(),resolve55(String(this.externalAdmission.turnEpoch)))});until.then(()=>{unsubscribe(),resolve55(void 0)})})}noteAutomaticInput(text3){if(!this._engineTurnHold.holds.some(hold=>hold.kind==="session_hold"&&hold.key!=="interrupted-run"||hold.kind==="inherited_hold"))return!1;let message={role:"custom",customType:"rpc-automatic-input",content:text3,display:!0,timestamp:Date.now()};return this._engineTurnHold.note(`rpc-input:${crypto.randomUUID()}`,message),!0}_stopAddedSince(observedPauseSeq){return this._engineTurnHold.holds.some(hold=>hold.kind==="session_hold"&&(hold.data?.localSeq??0)>observedPauseSeq)}_stopHoldLive(){return this._engineTurnHold.holds.some(hold=>hold.kind==="session_hold")}_resumeCause(){let holds2=this._engineTurnHold.holds;return holds2.some(hold=>hold.kind==="session_hold"&&hold.key==="interrupted-run")&&!holds2.some(hold=>hold.kind==="session_hold"&&hold.key!=="interrupted-run")?"interrupted":"stop"}get pauseView(){return{pauseSeq:this._engineTurnHold.currentPauseSeq,records:this._engineTurnHold.holds.map(({kind,key,data})=>{let value=data??{};return{kind,key,...value.runRef===void 0?{}:{runRef:value.runRef},...value.parentSessionId===void 0?{}:{parentSessionId:value.parentSessionId}}})}}get runPaused(){return this._engineTurnHold.fences.length>0}get paused(){return this._engineTurnHold.isHeld()}_createLifecycleBinding(){return new LifecycleSessionBinding(this,{append:(type2,data)=>{let startupBookkeeping=type2==="session-lifecycle"&&typeof data=="object"&&data!==null&&"epoch"in data&&data.epoch===0&&"state"in data&&data.state==="done"&&"humanInputRevision"in data&&data.humanInputRevision===0,id=this.sessionManager.appendCustomEntry(type2,data,{startupBookkeeping});return this._emitEntryAppended(id),id},emit:event=>this._emit(event),factsFailed:error2=>this._sessionLogger.warn("lifecycle_goal_read_failed",{error:String(error2)})})}get lifecycle(){return this._lifecycleBinding.controller.ledger.snapshot}get workObligations(){return this._lifecycleBinding.controller.obligations}get lifecycleApi(){return{obligations:this.workObligations,reportChild:report=>this.reportChildLifecycle(report),markRunCompleted:({runId})=>this._lifecycleBinding.controller.markRunCompleted(runId)}}reportChildLifecycle(report){this._lifecycleBinding.controller.reportChild(report)}requestSelfSettle(){return this._lifecycleBinding.controller.requestSelfSettle()}refreshLifecycle(){this._disposed||this._lifecycleBinding.controller.recompute()}get pausedNoticeCount(){return this._engineTurnHold.noticeCount}get holds(){return this._engineTurnHold.holds}_recordEngineTurnStart(customType){this._engineTurnPauseRecorded=!1,this._engineTurnPauseNotified=!1,this._engineTurnStarts.push({at:Date.now(),toolUsed:!1});try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_TURN_START_ENTRY_TYPE,{customType}))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_TURN_START_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}}_recordRefusedEngineTurnMessage(appMessage){try{this._appendCustomMessage(appMessage),this.externalAdmission.observePersisted(appMessage)}catch(error2){if(deliveryIdOf(appMessage)!==void 0){let index=this.agent.state.messages.lastIndexOf(appMessage);index>=0&&this.agent.state.messages.splice(index,1)}this.externalAdmission.observeRefused(appMessage,error2 instanceof Error?error2.message:String(error2)),this._takePersistWatcher(appMessage)?.failed(error2)}}_observeEngineTurnMessage(message){if(message.role==="user"||message.role==="custom"&&resetsEngineTurnHistory(message.customType,message.details)){this._engineTurnStarts=[],this._engineResumeWindow=!1,this._engineTurnPauseRecorded=!1,this._engineTurnPauseNotified=!1;return}let running2=this._engineTurnStarts.at(-1);running2!==void 0&&message.role==="assistant"&&message.content.some(block=>block.type==="toolCall")&&(running2.toolUsed=!0)}_stopEngineTurn(customType){if(isUserDirectedTurn(customType))return!1;let stop=engineTurnStop(this.sessionManager.reduceHistory(engineTurnHistory),Date.now(),{...this.settingsManager.getEngineTurnSettings(),maxPerResumeWindow:this._engineResumeWindow?this.settingsManager.getEngineTurnSettings().maxPerResumeWindow:0},this._engineTurnStarts);if(stop===null)return!1;let details={customType,...stop,at:Date.now()};if(!this._engineTurnPauseRecorded&&!enginePauseSinceLastTurn(this.sessionManager.getBranch())){this._engineTurnPauseRecorded=!0;try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_PAUSED_ENTRY_TYPE,{reason:stop.reason==="resume-window"?"cap-per-resume-window":stop.reason==="per-user-input"?"cap-per-message":"cap-per-minute",customType,count:stop.reason!=="tool-free-rate"?stop.sinceUserInput:stop.toolFreeInWindow,at:details.at}))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_PAUSED_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}}try{this._emitEntryAppended(this.sessionManager.appendCustomEntry(ENGINE_TURN_LIMIT_ENTRY_TYPE,details))}catch(error2){this._sessionLogger.warn("engine_turn_record_write_failed",{entry:ENGINE_TURN_LIMIT_ENTRY_TYPE,error:error2 instanceof Error?error2.message:String(error2)})}return this._extensionRunner.emitBusEvent(ENGINE_TURN_LIMIT_EVENT,details),this._engineTurnPauseNotified||(this._engineTurnPauseNotified=!0,this._extensionRunner.getUIContext().notify(engineTurnLimitNotice(stop),"warning")),!0}_pendingEnvironmentContextMessage(){if(this._environmentContextEnabled)return environmentContextMessageIfChanged(this.agent.state.messages,resolveEnvironmentContext(this._cwd))}_appendCustomMessage(appMessage){this.agent.state.messages.push(appMessage);let entryId=this.sessionManager.appendCustomMessageEntry(appMessage.customType,appMessage.content,appMessage.display,appMessage.details);this._emitEntryAppended(entryId),this._recordWrittenTicket(appMessage,entryId),this._takePersistWatcher(appMessage)?.persisted(entryId),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,inputOrigin="extension"){if(this._engineTurnHold.held&&inputOrigin!=="person"){await this.sendCustomMessage({customType:"extension-user-message",content,display:!0},{triggerTurn:!0,deliverAs:options?.deliverAs},deferredTurnClaim);return}let bindingPromptReadiness=this._extensionBindingPromptReadiness,resolveBindingPromptReadiness;if(bindingPromptReadiness){let readiness=new Promise(resolve55=>{resolveBindingPromptReadiness=resolve55});bindingPromptReadiness.add(readiness)}let text3,images,textBlocks;try{if(typeof content=="string")text3=content;else{let textParts=[];images=[];for(let part of content)part.type==="text"?textParts.push(part.text):images.push(part);text3=joinUserTextBlocks(textParts),textParts.length>1&&(textBlocks=textParts),images.length===0&&(images=void 0)}}catch(error2){throw deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),error2}if(this._sizesOnlyStartup){try{await this._queueFollowUp(text3,images,{textBlocks})}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.()}return}let waitForExistingSessionWork=this._sessionWorkBarrier.hasActiveWork,finishSessionWork,disposition;try{await this.prompt(text3,{expandPromptTemplates:options?.expandPromptTemplates??!1,streamingBehavior:options?.deliverAs,images,textBlocks,source:"extension",inputOrigin,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(text3,images,{textBlocks,source:"extension",inputOrigin}):await this._queueFollowUp(text3,images,{textBlocks,source:"extension",inputOrigin})),error2}finally{deferredTurnClaim?.resolve("finished-without-start"),resolveBindingPromptReadiness?.(),finishSessionWork?.()}}reserveQueuedInputOrder(){return this._nextQueuedInputOrder+=1,this._nextQueuedInputOrder}_recordQueuedInput(text3,mode,options,message,admittedQueuedId){let order=options?.enqueueOrder??this.reserveQueuedInputOrder();this._nextQueuedInputOrder=Math.max(this._nextQueuedInputOrder,order);let queuedId=admittedQueuedId??this._mintQueuedId();return this._queuedInputOrder.push({text:text3,mode,enqueueOrder:order,queuedId,revision:1,...clientMessageIdentity(options)}),message!==void 0&&this._queuedMessages.set(queuedId,message),this._queuedInputAges.noteQueued(queuedId,Date.now()),queuedId}_warnQueuedInputOutlivingRun(agentEnd){if(agentEnd?.type!=="agent_end")return;let lastAssistant=agentEnd.messages.findLast(message=>message.role==="assistant");if(lastAssistant?.role==="assistant"&&(lastAssistant.stopReason==="error"||lastAssistant.stopReason==="aborted"))return;let stillQueued=this._queuedInputOrder.map(input=>input.queuedId);for(let{queuedId,ageMs}of this._queuedInputAges.takeOutlived(stillQueued,Date.now())){let input=this._queuedInputOrder.find(candidate=>candidate.queuedId===queuedId),message=this._queuedMessages.get(queuedId);this._sessionLogger.warn("queued_input_outlived_run",{queuedId,mode:input?.mode,ageMs,source:message===void 0?void 0:this._userInputSources.get(message)})}}_mintQueuedId(){return this._nextQueuedId+=1,`q_${this._nextQueuedId}`}_removeQueuedInput(text3,mode,clientMessageId){let index=this._queuedInputOrder.findIndex(message=>clientMessageId===void 0?message.mode===mode&&message.text===text3:message.clientMessageId===clientMessageId);if(index===-1)return;let[delivered]=this._queuedInputOrder.splice(index,1);if(delivered!==void 0&&(this._queuedMessages.delete(delivered.queuedId),this._deliveredQueuedIds.add(delivered.queuedId),this._deliveredQueuedIds.size>256)){let oldest=this._deliveredQueuedIds.values().next().value;oldest!==void 0&&this._deliveredQueuedIds.delete(oldest)}}dequeueQueuedInput(queuedId,options){return this._changeQueuedInput(queuedId,void 0,options?.expectedRevision)}editQueuedInput(queuedId,text3,options){return this._changeQueuedInput(queuedId,text3,options?.expectedRevision)}async changeQueuedInput(queuedId,text3,options){let clientMessageId=this._queuedInputOrder.find(input=>input.queuedId===queuedId)?.clientMessageId;return(clientMessageId===void 0?void 0:await this._pendingInputs.change({clientMessageId,text:text3,...options?.expectedRevision===void 0?{}:{expectedRevision:options.expectedRevision},...options?.effectId===void 0?{}:{effectId:options.effectId}},()=>this._changeQueuedInput(queuedId,text3,void 0)))??this._changeQueuedInput(queuedId,text3,options?.expectedRevision)}_changeQueuedInput(queuedId,nextText,expectedRevision){let index=this._queuedInputOrder.findIndex(input=>input.queuedId===queuedId);if(index===-1)return this._deliveredQueuedIds.has(queuedId)?"already_delivered":"not_found";let record10=this._queuedInputOrder[index],message=this._queuedMessages.get(queuedId);if(nextText!==void 0&&message?.role!=="user")return"not_found";let deferred=record10.mode==="steer"?this._postCompactionDeferredSteeringMessages:this._postCompactionDeferredFollowUpMessages,nextMessage=nextText===void 0||message?.role!=="user"?void 0:{...message,content:[...userTextContent(nextText),...typeof message.content=="string"?[]:message.content.filter(part=>part.type==="image")]},deferredIndex=message===void 0?-1:deferred.indexOf(message);if(expectedRevision!==void 0&&record10.revision!==expectedRevision)return message!==void 0&&(deferredIndex!==-1||this.agent.replaceQueuedMessage(message,message))?"conflict":"already_delivered";if(!(message!==void 0&&(deferredIndex!==-1||(nextMessage===void 0?this.agent.removeQueuedMessage(message):this.agent.replaceQueuedMessage(message,nextMessage)))))return"already_delivered";deferredIndex!==-1&&(nextMessage===void 0?deferred.splice(deferredIndex,1):deferred[deferredIndex]=nextMessage);let texts=record10.mode==="steer"?this._steeringMessages:this._followUpMessages,occurrence=this._queuedInputOrder.slice(0,index).filter(input=>input.mode===record10.mode&&input.text===record10.text).length,seen=-1,textIndex=texts.findIndex(text3=>text3===record10.text&&++seen===occurrence);return nextText===void 0||nextMessage===void 0?(textIndex!==-1&&texts.splice(textIndex,1),this._queuedInputOrder.splice(index,1),this._queuedMessages.delete(queuedId)):(textIndex!==-1&&(texts[textIndex]=nextText),this._queuedInputOrder[index]={...record10,text:nextText,revision:record10.revision+1},this._queuedMessages.set(queuedId,nextMessage)),this._emitQueueUpdate(),nextText===void 0?"removed":"edited"}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._queuedMessages.clear();let recorded=this._pendingInputs.recordCleared(ordered.flatMap(input=>input.clientMessageId===void 0?[]:[input.clientMessageId]));recorded.catch(error2=>{this._sessionLogger.warn("pending_input_clear_unrecorded",{error:error2 instanceof Error?error2.message:String(error2)})}),this._queueClearRecorded=recorded,this._postCompactionDeferredSteeringMessages=[],this._postCompactionDeferredFollowUpMessages=[];let clearedDeliveries=this._queuedDeliveryTickets(),clearedMessages=this.agent.peekQueuedMessages({all:!0});this.agent.clearAllQueues(),this._releaseQueuedDeliveries(clearedDeliveries,"cleared"),this._settleRemovedCarriers(clearedMessages),this.externalAdmission.dropQueued(),this._emitQueueUpdate();let cleared={steering,followUp};return Object.defineProperty(cleared,"ordered",{value:ordered,enumerable:!1}),cleared}whenQueueClearRecorded(){return this._queueClearRecorded}get hasQueuedPersonInput(){for(let id of this._personQueuedIds)this._queuedInputOrder.some(input=>input.queuedId===id)||this._personQueuedIds.delete(id);return this._personQueuedIds.size>0}get pendingMessageCount(){return this._steeringMessages.length+this._followUpMessages.length}getSteeringMessages(){return this._steeringMessages}getFollowUpMessages(){return this._followUpMessages}getPendingInputs(knownClientMessageIds){return this._pendingInputs.snapshot(knownClientMessageIds)}getQueuedInputs(){return[...this._queuedInputOrder].sort((left,right)=>left.enqueueOrder-right.enqueueOrder)}get resourceLoader(){return this._resourceLoader}async stop(){this._runHolds.stamp(),this.refreshLifecycle(),this._stopInterrupt={pauseSeq:this._engineTurnHold.currentPauseSeq,at:new Date().toISOString()};try{await this.abort()}finally{this._stopInterrupt=void 0}}async abort(options){options?.cause!==void 0&&this._abortCause===void 0&&(this._abortCause=options.cause),await this._abortWithProvenance()}async _abortWithProvenance(){let wasMidRun=this.isStreaming&&this._retryAbortController===void 0,hadRetryBackoff=this._retryAbortController!==void 0,hasPendingTriggerTurnAdmission=this._pendingCustomTurnHeaders>0||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);this.abortCompaction(),hasPendingTriggerTurnAdmission&&this._recordUserAbort(),this._isBeforeSettle&&(this._abortDuringBeforeSettle=!0),await this._abortActiveAgentAndRetry("user");let releaseStranded=()=>this._releaseQueuedDeliveries(this._queuedDeliveryTickets(),"aborted");if(this.isIdle?releaseStranded():this.waitForIdle().then(releaseStranded,error2=>{this._sessionLogger.warn("abort_delivery_release_failed",{error:error2 instanceof Error?error2.message:String(error2)})}),this.isIdle||this._waitForIdleAfterAbort().catch(error2=>{this._sessionLogger.warn("abort_release_failed",{error:error2 instanceof Error?error2.message:String(error2)})}),!!shouldEmitAbort)try{await this._emitSessionAbort()}catch{}}async waitForIdle(){this.isIdle||await this._getIdleWaitPromise()}async _emitModelSelect(nextModel,previousModel,source2){if(this.syncPromptCacheSafeWaitEnv(),!this._modelSelectionChangesContext(previousModel,nextModel))return;let result3=await this._extensionRunner.emitModelSelect({type:"model_select",model:nextModel,previousModel,source:source2,systemPrompt:this.agent.state.systemPrompt,systemPromptOptions:this._baseSystemPromptOptions});if(result3?.systemPrompt===void 0)return;let previousSystemPrompt=this.agent.state.systemPrompt,systemPrompt=result3.systemPrompt??this._baseSystemPrompt;if(previousSystemPrompt===systemPrompt)return;this.agent.state.systemPrompt=systemPrompt;let event={type:"system_prompt_change",systemPrompt,previousSystemPrompt,model:nextModel,previousModel,source:"model_select"};return result3.systemPromptName&&(event.systemPromptName=result3.systemPromptName),await this._extensionRunner.emit(event),this._emit(event),event}async setModel(model,origin=SDK_MODEL_CHANGE){return this._setModel(model,!0,origin)}assertModelUsable(model=this.model,liveContextTokens=0,options){if(!model||model.contextWindow<=0)return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction:this._getCompactionSettings(),includeSpeculationLead:options?.includeSpeculationLead,admission:options?.admission});if(!projection.usable)throw new ModelUsabilityBudgetError(projection)}get pendingModelSwitch(){return this._pendingModelSwitch}_projectSwitchDeferral(model,liveContextTokens){if(model.contextWindow<=0)return;let compaction=this._getCompactionSettings();if(!compaction.enabled||this._modelSwitchAdmission()!=="switch")return;let projection=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens,compaction,includeSpeculationLead:!1,admission:"switch"});return projection.verdict==="fits-after-compaction"?projection:void 0}_admitSwitchCompactionRequired(model,projection,persistDefault,origin){let pending=createPendingModelSwitch({model,projection,persistDefault,origin});this._clearPendingModelSwitch(),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})}_clearPendingModelSwitch(error2){let pending=this._pendingModelSwitch;this._pendingModelSwitch=void 0,pending!==void 0&&this._emit({type:"model_change_cancelled",origin:pending.origin,reason:error2===void 0?"superseded":"context-budget",...error2===void 0?{}:{detail:error2.message}})}_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+estimateTokens(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(!projection.usable){let error2=new ModelUsabilityBudgetError(projection);throw this._clearPendingModelSwitch(error2),this._recordRejectedModelChange(pending.model,error2),error2}this._pendingModelSwitch=void 0;try{await this._switchActiveModel(pending.model,{persistDefault:pending.persistDefault,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,allowDeferral:!1,admittedLiveContextTokens:projection.liveContextTokens,origin:heldSwitchOrigin(pending.origin)})}catch(error2){throw this._emit({type:"model_change_cancelled",origin:pending.origin,reason:error2 instanceof ModelUsabilityBudgetError?"context-budget":"error",detail:error2 instanceof Error?error2.message:String(error2)}),error2}return!0}_resumeRequirementStillBlocks(model,settings){let currentContext=estimateProjectedContextTokens(this.sessionManager.buildSessionProjection(),this.sessionManager.getBranch()).tokens;return!projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,liveContextTokens:currentContext,compaction:settings,includeSpeculationLead:!1,admission:"resume"}).usable}_clearResumeCompactionRequirementIfFits(){let model=this.model;this._resumeCompactionRequirement===void 0||!model||this._resumeRequirementStillBlocks(model,this._getCompactionSettings(model))||(this._resumeCompactionRequirement=void 0)}admitResumeCompactionRequired(projection){this._resumeCompactionRequirement=createResumeCompactionRequirement(projection)}applyResumeSlice(plan){this.sessionManager.appendCompaction(plan.summary,plan.firstKeptEntryId,plan.tokensBefore,{schema:RESUME_SLICE_SCHEMA,origin:RESUME_SLICE_ORIGIN}),this.agent.state.messages=this.sessionManager.buildSessionContext().messages,this._resumeSlice=plan,this._sessionLogger.info("resume_context_reduced",{count:plan.droppedEntries,tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter}),this._emit(this._resumeSliceEvent(plan))}_resumeSliceEvent(plan){return{type:"resume_context_reduced",tokensBefore:plan.tokensBefore,tokensAfter:plan.tokensAfter,droppedEntries:plan.droppedEntries,notice:resumeSliceNotice(plan)}}_getDownswitchLiveContextTokens(model){let currentModel=this.model;if(!currentModel)return 0;let compaction=this._getCompactionSettings(),currentBudget=projectModelUsabilityBudget({model:currentModel,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),targetBudget=projectModelUsabilityBudget({model,systemPrompt:this.agent.state.systemPrompt,tools:this.agent.state.tools,compaction}),currentUsableContext=currentBudget.contextWindow-currentBudget.requiredTokens;if(targetBudget.contextWindow-targetBudget.requiredTokens>=currentUsableContext)return 0;let fixedPrefixTokens=currentBudget.systemPromptTokens+currentBudget.activeToolSchemaTokens;return Math.max(0,(this.getContextUsage()?.tokens??0)-fixedPrefixTokens)}async setSessionModel(model,origin=SDK_MODEL_CHANGE){return this._setModel(model,!1,origin)}_recordRejectedModelChange(model,error2){let budget=error2 instanceof ModelUsabilityBudgetError?error2.projection:void 0,detail=error2 instanceof Error?error2.message:String(error2),reason=budget?"context-budget":"auth",numbers=budget?{contextWindow:budget.contextWindow,liveContextTokens:budget.liveContextTokens,requiredTokens:budget.requiredTokens,shortfallTokens:budget.shortfallTokens,safetyMarginProfile:budget.safetyMarginProfile}:{};this.sessionManager.appendModelChangeRejected({provider:model.provider,modelId:model.id,reason,detail,...numbers}),this._emit({type:"model_change_rejected",model,reason,detail,...numbers})}_modelSwitchAdmission(){return this.sessionManager.hasContextMessages()?"switch":"start"}_assertModelUsableForSwitch(model,liveContextTokens){let admission=this._modelSwitchAdmission();try{this.assertModelUsable(model,liveContextTokens,{admission,includeSpeculationLead:admission==="start"})}catch(error2){throw this._recordRejectedModelChange(model,error2),error2}}async _setModel(model,updateGlobalDefaults,origin){let liveContextTokens=this._getDownswitchLiveContextTokens(model),deferral=this._projectSwitchDeferral(model,liveContextTokens);if(deferral===void 0&&this._assertModelUsableForSwitch(model,liveContextTokens),!await this._modelRuntime.checkAuth(model.provider)){let error2=new ModelSwitchAuthError(model.provider,model.id);throw this._recordRejectedModelChange(model,error2),error2}if(deferral!==void 0){this._admitSwitchCompactionRequired(model,deferral,updateGlobalDefaults,origin);return}let hadActiveFallback=this._retryFallback.activeState!==void 0;return this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(model),hadActiveFallback&&this._retryAbortController&&this.abortRetry(),await this._switchActiveModel(model,{persistDefault:updateGlobalDefaults,appendSessionEntry:!0,emitModelSelect:!0,modelSelectSource:"set",invalidateCompaction:!0,origin})}async _maybeRestoreFallbackPrimary(boundary="turn"){try{await this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy,boundary),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("turn")}async _switchActiveModel(model,opts){let previousModel=this.model,duringTurn=this.isStreaming;opts.invalidateCompaction&&(this._modelSelectionChangesContext(previousModel,model)||previousModel?.provider!==model.provider||previousModel?.id!==model.id)&&this._invalidateCompactionForModelSelection();let thinking=this._getThinkingForModelSwitch(model,opts.ephemeralThinkingLevel,void 0,!0),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,previousThinkingLevelSource=this._thinkingLevelSource;this.agent.abortServerSideFallback=this.settingsManager.getAbortServerSideFallback()&&this._retryFallback.hasConfiguredChain(),this._currentServiceTier=this._resolveServiceTier(model,scopedMatch?.serviceTier),opts.ephemeralThinkingLevel!==void 0?this._applyEphemeralThinkingLevel(thinking.level):this._setThinkingLevel(thinking.level,!1,thinking.selection,opts.origin),this._thinkingLevelSource=thinking.source,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._thinkingLevelSource=previousThinkingLevelSource,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(model,deferral,opts.persistDefault,opts.origin);return}let admittedLiveContextTokens=opts.admittedLiveContextTokens??(opts.repairWithSlice?this._reduceForSwitchTarget(model,liveContextTokens):liveContextTokens);return this._assertModelUsableForSwitch(model,admittedLiveContextTokens),opts.appendSessionEntry&&this.sessionManager.appendModelChange(model.provider,model.id,opts.entryReason,previousModel?.provider,previousModel?.id,{origin:opts.origin,duringTurn}),opts.persistDefault&&this.settingsManager.setDefaultModelAndProvider(model.provider,model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:opts.origin,from:previousModel,to:model,duringTurn,persistDefault:opts.persistDefault})),this._clearPendingModelSwitch(),this._emit({type:"model_changed",model,thinkingLevel:this.thinkingLevel,source:opts.modelSelectSource,origin:opts.origin,...previousModel===void 0?{}:{previousModel},duringTurn}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode),systemPromptChange}catch(error2){throw previousModel?this.agent.state.model=previousModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this.agent.state.thinkingLevel=previousThinkingLevel,this.agent.state.thinkingSelection=previousThinkingSelection,this._thinkingLevelSource=previousThinkingLevelSource,this.agent.state.reasoningBaseline=previousReasoningBaseline,this.agent.abortServerSideFallback=previousAbortServerSideFallback,this._currentServiceTier=previousTier,error2}}_applyEphemeralThinkingLevel(level){let previousLevel=this.agent.state.thinkingLevel;this.agent.state.thinkingLevel=level,this.agent.state.thinkingSelection=void 0,previousLevel!==level&&this._emit({type:"thinking_level_changed",level})}async cycleModel(direction="forward",options={}){let favoriteModels2=this._getCurrentFavoriteModels();if(favoriteModels2.length>0)return this._cycleFavoriteModel(direction,favoriteModels2,{persistDefault:options.persistDefault??!0,origin:options.origin??{source:"cycle"}})}async _cycleFavoriteModel(direction,favoriteModels2,cycle){if(favoriteModels2.length<=1)return;let currentModel=this.model;if(!currentModel)return;let currentIndex=favoriteModels2.findIndex(sm=>modelsAreEqual(sm.model,currentModel)),nextIndex;if(currentIndex===-1)nextIndex=direction==="forward"?0:favoriteModels2.length-1;else{let len=favoriteModels2.length;nextIndex=direction==="forward"?(currentIndex+1)%len:(currentIndex-1+len)%len}let favoriteCount=favoriteModels2.length,step=direction==="forward"?1:-1,selectedIndex,skippedModels=[];for(let offset=0;offset<favoriteCount;offset++){let candidate=favoriteModels2[(nextIndex+step*offset+favoriteCount)%favoriteCount];if(modelsAreEqual(candidate.model,currentModel))continue;let admission=this._modelChangeWouldExhaustContext(candidate.model);if(admission){skippedModels.push(candidate.model),this._emit({type:"model_change_skipped",model:candidate.model,contextWindow:candidate.model.contextWindow,liveContextTokens:admission.liveContextTokens,requiredTokens:admission.requiredTokens,shortfallTokens:admission.shortfallTokens,safetyMarginProfile:admission.safetyMarginProfile,direction});continue}selectedIndex=(nextIndex+step*offset+favoriteCount)%favoriteCount;break}if(selectedIndex===void 0){let alternatives=favoriteModels2.filter(entry2=>!modelsAreEqual(entry2.model,currentModel)),onlyAlternative=alternatives.length===1?alternatives[0]:void 0;if(onlyAlternative){let onlyLiveContextTokens=this._getDownswitchLiveContextTokens(onlyAlternative.model),onlyDeferral=this._projectSwitchDeferral(onlyAlternative.model,onlyLiveContextTokens);onlyDeferral!==void 0?this._admitSwitchCompactionRequired(onlyAlternative.model,onlyDeferral,cycle.persistDefault,cycle.origin):this._assertModelUsableForSwitch(onlyAlternative.model,onlyLiveContextTokens)}return{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels}}let next=favoriteModels2[selectedIndex],liveContextTokens=this._getDownswitchLiveContextTokens(next.model),cycleDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(cycleDeferral!==void 0)return this._admitSwitchCompactionRequired(next.model,cycleDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens),(this._modelSelectionChangesContext(currentModel,next.model)||currentModel?.provider!==next.model.provider||currentModel?.id!==next.model.id)&&this._invalidateCompactionForModelSelection(),this._probeBackScheduler.cancel("manual-model-change"),this._retryFallback.clearForManualModelChange(next.model);let thinking=this._getThinkingForModelSwitch(next.model,next.thinkingLevel,next.thinkingSelection);this.agent.state.model=next.model;let previousTier=this._currentServiceTier,previousFastMode=this.isFastModeActive();this._currentServiceTier=this._resolveServiceTier(next.model,next.serviceTier),this._setThinkingLevel(thinking.level,!1,thinking.selection,cycle.origin),this._thinkingLevelSource=thinking.source;let previousSystemPrompt=this.agent.state.systemPrompt;try{let systemPromptChange=await this._emitModelSelect(next.model,currentModel,"cycle"),postHookDeferral=this._projectSwitchDeferral(next.model,liveContextTokens);if(postHookDeferral!==void 0)return currentModel&&(this.agent.state.model=currentModel),this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,this._admitSwitchCompactionRequired(next.model,postHookDeferral,cycle.persistDefault,cycle.origin),{model:currentModel,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};this._assertModelUsableForSwitch(next.model,liveContextTokens);let duringTurn=this.isStreaming;this.sessionManager.appendModelChange(next.model.provider,next.model.id,void 0,currentModel?.provider,currentModel?.id,{origin:cycle.origin,duringTurn}),cycle.persistDefault&&this.settingsManager.setDefaultModelAndProvider(next.model.provider,next.model.id),this._sessionLogger.info("model_change",modelChangeLogFields({origin:cycle.origin,from:currentModel,to:next.model,duringTurn,persistDefault:cycle.persistDefault})),this._clearPendingModelSwitch(),this._emit({type:"model_changed",model:next.model,thinkingLevel:this.thinkingLevel,source:"cycle",origin:cycle.origin,...currentModel===void 0?{}:{previousModel:currentModel},duringTurn}),this._emitServiceTierChangeIfNeeded(previousTier,previousFastMode);let cycleResult={model:next.model,thinkingLevel:this.thinkingLevel,isScoped:!0,skippedModels};return systemPromptChange&&(cycleResult.systemPromptChange=systemPromptChange),cycleResult}catch(error2){throw currentModel?this.agent.state.model=currentModel:delete this.agent.state.model,this.agent.state.systemPrompt=previousSystemPrompt,this._currentServiceTier=previousTier,error2}}setThinkingLevel(level,origin){this._setThinkingLevel(level,!0,{level,source:"explicit"},origin,!0),this._thinkingLevelSource=this.thinkingLevel===level?"explicit":"clamped"}setSessionThinkingLevel(level,origin){this._setThinkingLevel(level,!1,{level,source:"explicit"},origin,!0),this._thinkingLevelSource=this.thinkingLevel===level?"explicit":"clamped"}_setThinkingLevel(level,rememberModelLevel,selection,trigger,stampNoOpEffect=!1){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,rememberModelLevel){(this.supportsThinking()||effectiveLevel!=="off")&&(this._lastManualThinkingLevel=effectiveLevel);let model=this.model;model&&this.settingsManager.setModelThinkingLevel(model.provider,model.id,effectiveLevel)}if(isChanging||selectionChanged){this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection,trigger,this.model);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),this._emit({type:"thinking_level_changed",level:effectiveLevel}),this._extensionRunner.emit({type:"thinking_level_select",level:effectiveLevel,previousLevel}),this._emitHighReasoningWarningIfNeeded(),this._emitThinkingClampWarningIfNeeded()}else stampNoOpEffect&&trigger?.effectId!==void 0&&this.sessionManager.appendThinkingLevelChange(effectiveLevel,effectiveSelection,trigger,this.model)}_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,ephemeral=!1){let found=(ephemeral&&explicitLevel!==void 0?[[explicitLevel,"fallback"]]:[[this._sessionThinkingMemory.levelFor(model),"session"],[explicitLevel,"explicit"],[this.settingsManager.getModelThinkingLevel(model.provider,model.id),"global"],[model.defaultThinkingLevel,"model-default"],[this._lastManualThinkingLevel??this.settingsManager.getDefaultThinkingLevel(),"default"]]).find(([candidate])=>candidate!==void 0),requested=found?.[0]??DEFAULT_THINKING_LEVEL,foundSource=found?.[1]??"default",selection=found===void 0||foundSource==="model-default"?void 0:foundSource==="explicit"&&explicitSelection?explicitSelection:{level:requested,source:"explicit"},fromGlobalDefault=found!==void 0&&foundSource==="default",level=this._clampThinkingLevel(requested,getSupportedThinkingLevels2(model)),requestClamped=level!==requested&&foundSource!=="default"&&foundSource!=="fallback";return{level,selection:clampThinkingSelection(selection,fromGlobalDefault?level:requested,level,model),source:requestClamped?"clamped":foundSource}}_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._waitForIdleAfterAbort()})();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&&isDeepStrictEqual3(candidate.messages,fullContext.messages.slice(0,candidate.messages.length)),sourceContext;if(preparation.messagesToSummarize.length>0&&preparation.sourceMessages){let candidate=await buildSourceContext(preparation.sourceMessages);isExactPrefix(candidate)&&(sourceContext=candidate)}let turnPrefixSourceContext;if(preparation.isSplitTurn&&preparation.turnPrefixMessages.length>0&&preparation.turnPrefixSourceMessages){let candidate=await buildSourceContext(preparation.turnPrefixSourceMessages),providerTurnPrefix=await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());isExactPrefix(candidate)&&providerTurnPrefix.length>0&&providerTurnPrefix.length<=candidate.messages.length&&isDeepStrictEqual3(candidate.messages.slice(-providerTurnPrefix.length),providerTurnPrefix)&&(turnPrefixSourceContext=candidate)}(sourceContext||turnPrefixSourceContext)&&(cacheFriendly={sourceContext,turnPrefixSourceContext,requestOptions:{sessionId:this.agent.sessionId,onPayload:this.agent.onPayload,onResponse:this.agent.onResponse,transport:this.agent.transport,thinkingBudgets:this.agent.thinkingBudgets,maxRetryDelayMs:this.agent.maxRetryDelayMs}})}return compact(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(!prepareCompaction(pathEntries,settings)){let requestId2=randomUUID6(),lastEntry=pathEntries[pathEntries.length-1],error2=new Error(lastEntry?.type==="compaction"?"Already compacted":"Nothing to compact (session too small)"),errorMessage6=`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:errorMessage6}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage6,aborted:!1,willRetry:!1,fromExtension:!1}),error2}let admission=this._claimPendingCompactionAdmission(),controller=admission.controller,requestId=randomUUID6(),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),errorMessage6=aborted?void 0:`Compaction failed: ${message}`;throw this._emit({type:"compaction_end",reason:"manual",result:void 0,aborted,willRetry:!1,requestId,errorMessage:errorMessage6}),await this._emitSessionCompactFailed({reason:"manual",errorMessage:errorMessage6,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,lifecycleState2=this._compactionLifecycle.state,requestId=!ownsController&&lifecycleState2.status==="running"&&lifecycleState2.stage==="feedback"?lifecycleState2.operationId:randomUUID6();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=randomUUID6();return this._compactionLifecycle.begin({operationId:requestId,stage:"feedback",reason,model:model?{provider:model.provider,id:model.id}:void 0,startedRevision:this._messageRevision},controller),this._emit({type:"compaction_start",reason,requestId}),controller.signal}_updateExtensionCompactionFeedback(options){!options.signal||!this._compactionLifecycle.hasCurrentSignal(options.signal)||this._emit({type:"compaction_progress",reason:options.reason,...options.delta!==void 0?{delta:options.delta}:{},...options.text!==void 0?{text:options.text}:{}})}_endExtensionCompactionFeedback(options){if(!options.signal)return;if(!this._compactionLifecycle.hasCurrentSignal(options.signal)){this._releaseCompactionController(options.signal);return}let operation=this._compactionLifecycle.state;if(operation.status!=="running"||operation.stage!=="feedback")return;let aborted=options.aborted??options.signal.aborted;this._compactionLifecycle.finish({operationId:operation.operationId,status:aborted?"aborted":"failed",endedRevision:this._messageRevision,...aborted?{errorMessage:"Compaction cancelled"}:{errorMessage:options.errorMessage??"Compaction did not apply"}}),this._emit({type:"compaction_end",reason:options.reason,result:void 0,aborted,willRetry:!1,requestId:operation.operationId,errorMessage:aborted?void 0:options.errorMessage??"Compaction did not apply"}),this._releaseCompactionController(options.signal),aborted||this._resumeQueuedMessagesAfterCompaction()}async _executeCompaction(request2){let model=this.model;if(!model)throw new Error(formatNoModelSelectedMessage());let controller=request2.controller;if(!this._ownsCompactionController(controller,request2.owner))throw new CompactionExecutionError(new CompactionCancelledError,!1,!0);let requestId=request2.requestId??randomUUID6(),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=prepareCompaction(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)");let compactionModel=this._resolveCompactionModel(model);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{model:requestModel,apiKey,headers,extraBody,env,thinkingLevel}=await this._getCompactionRequestAuth(compactionModel,signal,this._summarizationRetryCallbacks({source:"compaction",reason:request2.reason}));compactionResult=await this._runDefaultCompaction(preparation,requestModel,apiKey,headers,extraBody,request2.customInstructions,signal,env,request2.reason,thinkingLevel)}}if(signal.aborted)throw new CompactionCancelledError;if(!this._compactionLifecycle.isCurrent(operationId,controller))throw new CompactionCancelledError;let lifecycleState2=this._compactionLifecycle.state,currentMessagesAtCheck=this.agent.state.messages,onlyPendingPersistenceAppends=agentMessagesAtStart.every((message,index)=>currentMessagesAtCheck[index]===message)&¤tMessagesAtCheck.slice(agentMessagesAtStart.length).every(message=>this._messageEndsAwaitingPersistence.has(message)||compactionOwnedDiagnosticMessages.has(message));if(lifecycleState2.status!=="running"||lifecycleState2.operationId!==operationId||lifecycleState2.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(entry2=>entry2.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=estimateMessagesTokens(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 lifecycleState2=this._compactionLifecycle.state,ownsTerminalTransition=lifecycleState2.status!=="idle"&&lifecycleState2.operationId===operationId,aborted=signal.aborted||isCompactionExecutionAborted(error2);throw ownsTerminalTransition&&lifecycleState2.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){return wouldCompactionOverflow(pathEntries,compactionResult,fromExtension,model,this._getCompactionSettings())}_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),errorMessage6=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:errorMessage6}),await this._extensionRunner.emit({type:"session_compact",reason:request2.reason,requestId,accepted:!1,rejectionCause,fromExtension:!1,willRetry:!1}),{accepted:!1,requestId,rejectionCause}}abortCompaction(){let lifecycleState2=this._compactionLifecycle.state,activeFeedbackRequestId=lifecycleState2.status==="running"&&lifecycleState2.stage==="feedback"?lifecycleState2.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 compacted=assistantMessage?await this._checkCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction):!1;if(compacted||assistantMessage&&this._postCompactionUsageExemptAssistants.has(assistantMessage))return compacted;let contextTokens=this._estimatePrePromptContextTokens(),limitsModel=this._limitsModel();if(!settings.enabled||!limitsModel||limitsModel.contextWindow<=0||!shouldCompact(contextTokens,limitsModel.contextWindow,settings))return!1;if(assistantMessage!==void 0&&this._isAssistantFromBeforeLatestCompaction(assistantMessage)&&assistantMessage&&await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason))return!0;if(this._isCompactionOnCooldown()||this._isCompactionDelegated()||this._hasSupersedingCompactionClaim())return!1;throw new RequiredCompactionError}_estimatePrePromptContextTokens(additions=[]){let branch=this.sessionManager.getBranch(),messages=[...this.sessionManager.buildSessionContext().messages,...additions],estimate=estimateContextTokens(messages),usageMessage=estimate.lastUsageIndex===null?void 0:messages[estimate.lastUsageIndex],usageEntryId=usageMessage?getSessionContextEntryId(usageMessage):void 0,needsProjection=!1;for(let i=branch.length-1;i>=0;i--){let entry2=branch[i];if(usageEntryId!==void 0&&entry2.id===usageEntryId)break;if(entry2.type==="compaction"||entry2.type==="context_edit"){needsProjection=!0;break}}if(!needsProjection)return estimate.tokens;this._prePromptProjection?.branch!==branch&&(this._prePromptProjection={branch,projection:this.sessionManager.buildSessionProjection()});let{projection}=this._prePromptProjection;return estimateProjectedContextTokens({...projection,messages:[...projection.messages,...additions]},branch).tokens}_pendingQueuedInputMessages(){let timestamp=Date.now();return[...this._steeringMessages,...this._followUpMessages].map(text3=>({role:"user",content:[{type:"text",text:text3}],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=()=>this._estimatePrePromptContextTokens([...messages,...this._pendingQueuedInputMessages()])>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&&shouldCompact(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 errorMessage6=OVERFLOW_RECOVERY_EXHAUSTED_MESSAGE;if(this._emit({type:"compaction_end",reason:"overflow",result:void 0,aborted:!1,willRetry:!1,errorMessage:errorMessage6}),inlineReason==="pre_prompt")throw new Error(errorMessage6);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(this._consumePostCompactionUsageExemption(assistantMessage)||!settings.enabled)return!1;let contextTokens,staleUsageContentTokens;if(inlineReason)contextTokens=this._estimatePrePromptContextTokens();else{let directContextTokens=assistantMessage.usage?calculateContextTokens(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=estimateContextTokens(messages);if(estimate.lastUsageIndex!==null){let usageMsg=messages[estimate.lastUsageIndex];if(compactionEntry&&usageMsg.role==="assistant"&&this._isAssistantFromBeforeLatestCompaction(usageMsg)&&(staleUsageContentTokens=estimateMessagesTokens(messages),!shouldCompact(staleUsageContentTokens,contextWindow,settings)))return!1}contextTokens=staleUsageContentTokens??estimate.tokens}}if(shouldCompact(contextTokens,contextWindow,settings))if(inlineReason){let compacted=await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction);return compacted||!this._compactionSkippedTooSmall?compacted:(this._compactionSkippedTooSmall=!1,await this._runPrePromptCompaction(assistantMessage,skipAbortedCheck,inlineReason,retryAfterCompaction,!1,0))}else{let compacted=await this._runAutoCompaction("threshold",retryAfterCompaction);return!compacted&&this._compactionLifecycle.state.status==="failed"&&this._compactionLifecycle.state.rejectionCause!=="external-owner"&&getLatestCompactionEntry(this.sessionManager.getBranch())!==null&&(this._blockedPostCompactionAssistant={assistant:assistantMessage,contentTokens:this._blockedAdmissionContentTokens()}),compacted}return!1}_isCompactionOnCooldown(){let state3=this._compactionLifecycle.state;return state3.status==="failed"&&state3.rejectionCause==="circuit-breaker"}_hasSupersedingCompactionClaim(){let claimant=this._compactionAbortController??this._autoCompactionAbortController;return claimant!==void 0&&!claimant.signal.aborted}_isCompactionDelegated(){let model=this.model;return this._delegatedCompactionKey!==void 0&&model!==void 0&&this._delegatedCompactionKey.provider===model.provider&&this._delegatedCompactionKey.id===model.id}async _runPrePromptCompaction(lastAssistantMessage2,skipAbortedCheck,reason="pre_prompt",willRetry=!1,allowSummaryOnly=!1,keepRecentTokensOverride){if(this._compactionSkippedTooSmall=!1,isAutomaticCompactionBlocked(this.sessionManager.getBranch(),this.model,this._getCompactionSettings())||!(reason==="overflow"&&willRetry)&&this._isCompactionDelegated())return!1;let controller=new AbortController,requestId=randomUUID6();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 errorMessage6=error2 instanceof Error?error2.message:"compaction failed";this._compactionSkippedTooSmall=shouldRetryOverflowWithoutCompact(!1,errorMessage6);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: ${errorMessage6}`}),!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 contextTokens=this._estimatePrePromptContextTokens(),atHardLimit=shouldCompact(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("continuation"),await this._revalidateScheduledContinuationAdmission(),this.agent.state.isStreaming)?"taken-over":(this._promptOwnsRun||this._transcriptWriteFailures.startRun(),await runBoundedRetryContinuation({continueRun:async()=>{if(this._continueWithQueuedInput)this._continueWithQueuedInput=!1,await this.agent.continueWithQueuedMessages(options);else if(this._scheduledContinuationRecompacted){let tail=this.agent.state.messages.at(-1);tail?.role==="assistant"&&(tail.stopReason==="error"||tail.stopReason==="aborted")&&(this._retireFailedRetryAssistant(tail),this.agent.state.messages.at(-1)===tail&&(this.agent.state.messages=this.agent.state.messages.slice(0,-1),this._incrementMessageRevision())),await this.agent.continueWithQueuedMessages(options)}else await this.agent.continue(options)},getActiveSignal:()=>this.agent.signal,abortActive:()=>this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs,this.agent.streamStartTimeoutMs))),timeoutMs:retryTimeoutMs,onStreamStarted:listener=>{let unsubscribe=this.agent.subscribe(event=>{event.type!=="message_start"||event.message.role!=="assistant"||(unsubscribe(),listener())});return unsubscribe}}),"continued")}catch(error2){if(this.agent.state.isStreaming&&error2 instanceof Error&&error2.message.startsWith("Agent is already processing"))return"taken-over";throw error2}finally{this._scheduledContinuationRecompacted=!1,this._continueWithQueuedInput=!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}`})}_drainJoinedInput(){this.agent.hasQueuedMessages()&&(this._continueWithQueuedInput=!0,this._scheduleContinuationAfterCurrentEvent())}_scheduleContinuationAfterCurrentEvent(options={},retryContinuation=!1,retryTimeoutMs){let currentEventQueue=this._agentEventQueue,finishContinuationWork=this._sessionWorkBarrier.begin(),continueAfterEvent=async()=>{try{let outcome=await this._continueAgentAfterCurrentRun(options,retryTimeoutMs);retryContinuation&&outcome==="taken-over"&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this)}catch(error2){retryContinuation&&DEFERRED_RETRY_QUEUE_OWNERS.delete(this);let message=error2 instanceof Error?error2.message:String(error2);this._emit({type:"continuation_error",errorMessage:`Failed to continue queued messages: ${message}`}),this.agent.state.isStreaming||await this._emitAgentSettled(),retryContinuation&&this._resolveRetry()}};currentEventQueue.then(continueAfterEvent,continueAfterEvent).finally(finishContinuationWork).catch(()=>{})}async _runAutoCompaction(reason,willRetry,options={}){if(isAutomaticCompactionBlocked(this.sessionManager.getBranch(),this.model,this._getCompactionSettings())||!(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=randomUUID6();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 prepareCompaction(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 errorMessage6=error2 instanceof Error?error2.message:"compaction failed",aborted=isCompactionExecutionAborted(error2),formattedErrorMessage=aborted?void 0:reason==="overflow"?`Context overflow recovery failed: ${errorMessage6}`:`Auto-compaction failed: ${errorMessage6}`;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){this._sizesOnlyStartup=bindings2.sizesOnly===!0,this._promptSizeInventory=this._sizesOnlyStartup?bindings2.promptSizeInventory:void 0;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._lifecycleBinding.controller.requiresHumanContinuation&&this._engineTurnHold.addHold("session_hold",{key:"interrupted-run"}),this._engineTurnHold.start(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({...this._sessionStartEvent,...this._sizesOnlyStartup?{sizesOnly:!0}:{}}),await restoreMovedState(this.sessionManager,moved=>this._extensionRunner.emitSessionMove({type:"session_move_import",...moved}).then(failures=>failures.length===0)),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),this._lifecycleBinding.isRestored?await this._lifecycleBinding.refreshFacts():await this._lifecycleBinding.restore()}_beginSessionStartSettlement(){let settle2;return this._sessionStartSettled=new Promise(resolve55=>{settle2=resolve55}),settle2}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),this.securityNotices.setResources(this._resourceLoader.getSkills().diagnostics),(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.setLifecycleAttentionObserver(()=>this.refreshLifecycle()),runner.setEventHandlerBudget(()=>({warnMs:this.settingsManager.getExtensionEventHandlerWarnMs(),timeoutMs:this.settingsManager.getExtensionEventHandlerTimeoutMs()}),stall=>reportExtensionHandlerStall(stall,this._sessionLogger,(message,type2)=>runner.getUIContext().notify(message,type2)),()=>this._handlerTurnScope),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._lifecycleBinding.sessionId!==this.sessionId&&(this._lifecycleBinding.dispose(),this._lifecycleBinding=this._createLifecycleBinding()),this._unsubscribeWakeSources?.(),this._unsubscribeWakeSources=runner.onBusEvent(WAKE_SOURCE_STATE_EVENT,data=>this._wakeSources.observe(data)),this._lifecycleBinding.bindFactEvents(runner);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]},sessionControl=createSessionControlActions({admission:this.externalAdmission,sessionManager:this.sessionManager,host:()=>this._controlEndpointHost,relocationHost:()=>this._relocationHost});this._sessionControl=sessionControl,runner.bindCore({sendMessage:(message,options)=>{let reportError=err=>{if(err instanceof ModelNotReadyError){this._noticeProviderRequired(err.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_message",error:err instanceof Error?err.message:String(err)})};if(options?.triggerTurn===!0&&this._agentSettledDelivery.deferTriggerTurn(claim2=>{this.sendCustomMessage(message,options,claim2).catch(reportError)}))return;let send=()=>this.sendCustomMessage(message,options).catch(reportError);this._agentSettledDelivery.defer(send)||send()},sendItemizedMessage:(message,options)=>this._sendItemizedMessage(message,options),sendUserMessage:(content,options,inputOrigin="extension")=>{let reportError=err=>{if(err instanceof ModelNotReadyError){this._noticeProviderRequired(err.message);return}runner.emitError({extensionPath:RUNTIME_EXTENSION_PATH,event:"send_user_message",error:err instanceof Error?err.message:String(err)})};this._agentSettledDelivery.deferTriggerTurn(claim2=>{this.sendUserMessage(content,options,claim2,inputOrigin).catch(reportError)})||this.sendUserMessage(content,options,void 0,inputOrigin).catch(reportError)},appendEntry:(customType,data,options)=>{let entryId=this.sessionManager.appendCustomEntry(customType,data,options),entry2=this.sessionManager.getEntry(entryId);entry2&&this._emit({type:"entry_appended",entry:entry2})},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)},armToolBarrier:spec2=>this.armToolBarrier(spec2),releaseToolBarrier:id=>this.releaseToolBarrier(id),getCommands,setModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setModel(model,origin??{source:"extension"}),!0):!1,getThinkingLevel:()=>this.thinkingLevel,setThinkingLevel:level=>this.setThinkingLevel(level),setSessionModel:async(model,origin)=>this._modelRuntime.hasConfiguredAuth(model.provider)?(await this.setSessionModel(model,origin??{source:"extension"}),!0):!1,setSessionThinkingLevel:level=>this.setSessionThinkingLevel(level),setSessionFastMode:enabled=>this.setSessionFastMode(enabled),sessionControl,lifecycle:this.lifecycleApi},{offload:(id,args,options)=>offload(this._toolDispatcher,this._extensionRunner.getAllChildModules(),id,args,options),getModel:()=>this.model,getServiceTier:()=>this.serviceTier,getEffectiveServiceTier:()=>this.effectiveServiceTier,getScopedModels:()=>this._scopedModels,isIdle:()=>this.isIdle,engineTurnsHeld:()=>this._engineTurnHold.holdsSource("goal"),noteHeldWake:source2=>this._engineTurnHold.note(source2),getPauseState:()=>this._pauseState(),fenceRun:runRef=>this._runHolds.fence(runRef),releaseRunFence:runRef=>this._runHolds.releaseFences("run_cancelled",[runRef]),questionInput:()=>{this._humanInputAdmitted("answer"),this._runHolds.inheritedOwner()===void 0&&(this._captureReleaseExtras(),this._engineTurnInput.begin({consumeAtSettlement:this._stopHoldLive()}),this._engineResumeWindow=!1),queueMicrotask(()=>{this._settleInputRelease()?.catch(error2=>{this._sessionLogger.warn("input_release_settle_failed",{error:error2 instanceof Error?error2.message:String(error2)})})})},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,hasQueuedPersonInput:()=>this.hasQueuedPersonInput,isCompacting:()=>this.isCompacting,checkReloadVeto:()=>this.checkReloadVeto(),shutdown:()=>{this._extensionShutdownHandler?.()},getContextUsage:()=>this.getContextUsage(),getCompactionSettings:()=>this._getCompactionSettings(),getCompactionModel:()=>this.model?this._resolveCompactionModel(this.model):void 0,getPromptCacheSafeWaitSeconds:()=>this.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getPromptCacheKeepAliveSettings:()=>this.settingsManager.getPromptCacheKeepAliveSettings(),onUserActivity:listener=>this._userActivity.subscribe(listener),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project2=this.settingsManager.getProjectSettings().lookAt;return{enabled:project2?.enabled??global?.enabled??!0,models:project2?.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=randomUUID6();(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 err=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err)}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,getBaseSystemPromptParts:()=>this._baseSystemPromptParts,sizesOnlyStartup:this._sizesOnlyStartup,...this._promptSizeInventory===void 0?{}:{promptSizeInventory:this._promptSizeInventory}},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}get toolDispatcher(){return this._toolDispatcher}_isBuiltinExtensionPath(path14){return path14.startsWith("<builtin:")||path14.startsWith(BUILTIN_PATH_PREFIX)||/[\\/]senpi-codemode[\\/]/u.test(path14)}_enforceConfiguredDefaultTools(){let defaultToolNames=this._defaultToolNames;defaultToolNames!==void 0&&this.setActiveToolsByName(this.getActiveToolNames().filter(name=>{if(defaultToolNames.has(name))return!0;let entry2=this._toolDefinitions.get(name);return entry2!==void 0&&!this._isBuiltinExtensionPath(entry2.sourceInfo.path)&&entry2.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(entry2=>entry2!==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(entry2=>entry2!==void 0));let runner=this._extensionRunner,createToolContext=signal=>this._createToolContext(signal),wrappedExtensionTools=wrapRegisteredTools(allCustomTools,runner,createToolContext,this._toolDispatcher),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,this._toolDispatcher),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)])}armToolBarrier(spec2){let error2=toolBarrierSpecError(spec2);if(error2!==void 0)throw new Error(error2);this._toolBarrier.arm(spec2)}releaseToolBarrier(id){return this._toolBarrier.release(id)}async _waitForToolBarrier(toolCall,signal){if(this._toolDefinitions.get(toolCall.name)?.definition.workspaceEffect==="read")return!1;let wait=this._toolBarrier.wait(signal);return wait?(this._emit({type:"tool_barrier_waiting",id:wait.id,toolCallId:toolCall.id,toolName:toolCall.name}),await wait.done,!0):!1}_getToolExposure(name){let entry2=this._toolDefinitions.get(name);return entry2?normalizeToolExposure(entry2.definition).exposure:"direct"}_isActivatedOnRegistration(name){let entry2=this._toolDefinitions.get(name);if(!entry2)return!1;let exposure=normalizeToolExposure(entry2.definition).exposure;return(exposure==="direct"||exposure==="eval"||exposure==="model-only")&&entry2.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??[]));this._filesystemPolicy=filesystemPolicy;let 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,operations:this._toolDispatcher.bashOperations({shellPath})},write:{filesystemPolicy},edit:{filesystemPolicy},grep:{filesystemPolicy},find:{filesystemPolicy},glob:{filesystemPolicy},ls:{filesystemPolicy}});if(this._baseToolDefinitions=new Map(Object.entries(baseToolDefinitions).map(([name,tool])=>[name,tool])),options.flagValues)for(let[name,value]of options.flagValues)extensionsResult.runtime.flagValues.set(name,value);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 applyProjectTrustChange(){for(;this._promptStartPending||this._sessionStartDispatching;)await new Promise(resolve55=>this._admissionIdleWaiters.push(resolve55));let finishReloadWork=this._sessionWorkBarrier.begin();try{await this._rebuildRuntimeForReload()}finally{finishReloadWork()}}_notifyAdmissionIdle(){if(this._promptStartPending||this._sessionStartDispatching)return;let waiters=this._admissionIdleWaiters;this._admissionIdleWaiters=[];for(let resolve55 of waiters)resolve55()}async _rebuildRuntimeForReload(options){resetTimings("reload");let oldExtensionRunner=this._extensionRunner,oldSessionControl=this._sessionControl,oldExtensionIdentities=oldExtensionRunner.getExtensionIdentities(),previousActiveToolRegistrationIds=new Map;for(let name of this._requestedActiveToolNames??this.getActiveToolNames()){let entry2=this._toolDefinitions.get(name);entry2&&previousActiveToolRegistrationIds.set(name,deriveExtensionRegistrationId(entry2.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:[]),trustEpoch=this.settingsManager.getTrustEpoch();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;for(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});this.settingsManager.getTrustEpoch()!==trustEpoch;)trustEpoch=this.settingsManager.getTrustEpoch(),await this.settingsManager.reload(),await this._resourceLoader.reload({settingsAlreadyReloadedFor:this.settingsManager});time("resources","reload"),this.securityNotices.setResources(this._resourceLoader.getSkills().diagnostics);try{this._buildRuntime({activeToolNames:requestedActiveToolNamesBeforeRebuild,flagValues:this._extensionRunner.getFlagValues(),includeAllExtensionTools:!0,previousActiveToolRegistrationIds,addedToolNames:addedDefaultTools})}finally{let newExtensionResolvedPaths=new Set(this._extensionRunner.getExtensionIdentities().map(extension=>extension.resolvedPath)),removed=oldExtensionIdentities.filter(extension=>!newExtensionResolvedPaths.has(extension.resolvedPath));try{removed.length>0&&await oldExtensionRunner.emit({type:"session_extensions_removed",reason:"reload",removed})}finally{await oldSessionControl?.retire().catch(error2=>{this._extensionRunner.emitError({extensionPath:"<session-control>",event:"reload",error:error2 instanceof Error?error2.message:String(error2)})}),oldExtensionRunner.invalidate("stale extension generation after reload")}time("runtime","reload")}if(this._extensionUIContext||this._extensionCommandContextActions||this._extensionShutdownHandler||this._extensionErrorListener){let settleSessionStart=this._beginSessionStartSettlement();this._sessionStartDispatching=!0;try{await options?.beforeSessionStart?.(),this.syncPromptCacheSafeWaitEnv(),await this._extensionRunner.emit({type:"session_start",reason:"reload"}),await this.extendResourcesFromExtensions("reload")}finally{this._sessionStartDispatching=!1,settleSessionStart(),this._notifyAdmissionIdle()}}return time("lifecycle","reload"),{cancelled:!1}}async checkReloadVeto(){return checkSessionReloadVeto(this._extensionRunner,()=>this._promptStartPending,()=>this._sessionStartDispatching)}_isRetryableError(message){return message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX3)||this._isLocalFailure(message)||isContextOverflow(message,(this._modelForMessage(message)??this.model)?.contextWindow??0)?!1:isClassifierRefusal(message)?!0:message.errorMessage?message.stopReason==="aborted"?isProviderTimeoutError(message):isRetryableAssistantError(message):!1}_isLocalFailure(message){return message.failureSource==="local"}_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._isLocalFailure(message)&&!this._isClaudeSdkAuthMissError(message)&&!this._isClaudeSdkSameModelRemintError(message)&&message.stopReason==="error"&&!isContextOverflow(message,this.model?.contextWindow??0)&&this._requestShapeRecovery.decide(message,this.model?.contextWindow??0)==="not-request-shape"&&!this._isCursorPayloadOverflow(message)&&!isCursorZeroTokenResourceExhausted(message)&&!isClassifierRefusal(message)&&!message.content.some(content=>content.type==="toolCall")&&this._retryFallback.canTryFallback()}async _handleRequestShapeRejection(message,decision){return decision==="give-up"?(this._requestShapeRecovery.endStreak(),this._emit({type:"auto_retry_end",success:!1,attempt:Math.max(1,this._retryAttempt),finalError:REQUEST_SHAPE_FAILURE_TEXT}),this._retryAttempt=0,"not-handled"):(this._requestShapeRecovery.begin(message.timestamp),this._emitEntryAppended(this.sessionManager.appendCustomEntry(REQUEST_SHAPE_RECOVERY_ENTRY_TYPE,{note:REQUEST_SHAPE_RECOVERY_NOTE,model:message.model})),this._sessionLogger.info("request_shape_recovery",{provider:message.provider,model:message.model}),this._retryAttempt=0,await this._handleRetryableError({...message,errorMessage:REQUEST_SHAPE_RECOVERY_NOTE},{sameModelRemint:!0}))}_takeNativeToolSearchInjectionFailure(){return this._toolSearchService?.takeNativeInjectionFailure()??null}_getProviderRetryDelayMs(errorMessage6){let markerMs=parseRetryAfterMsMarker(errorMessage6);return markerMs!==void 0?markerMs:extract429RetryAfterMs({bodyText:errorMessage6})}_summarizationRetryCallbacks(source2){return{onRetryScheduled:(attempt2,maxAttempts,delayMs,errorMessage6)=>{this._emit({type:"summarization_retry_scheduled",attempt:attempt2,maxAttempts,delayMs,errorMessage:errorMessage6})},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,usageLimit:usageLimitScope(message.errorMessage),recovery:this._retryFallback.hasConfiguredChain()?"chain-exhausted":"no-fallback-configured"})??(message.errorMessage===void 0?void 0:stripTurnRetrySuppressionPrefix(message.errorMessage))}_degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage6){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:errorMessage6}),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(resolve55=>{this._retryResolve=resolve55}));let errorMessage6=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(usageLimitScope(errorMessage6)==="account"){if(switchedFallback=await tryFallback(isBillingErrorMessage(errorMessage6)?"billing":"transient",{errorMessage:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),!switchedFallback){let chainKey=this._retryFallback.exhaustedChainKey;return chainKey&&this._emit({type:"retry_fallback_exhausted",chainKey,lastError:errorMessage6}),this._retryAttempt>0&&this._emit({type:"auto_retry_end",success:!1,attempt:this._retryAttempt,finalError:this._terminalFailureText(message,this._retryAttempt)}),this._retryAttempt=0,this._resetHintTierState(),this._resolveRetry(),"not-handled"}this._retryAttempt=1}else 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(errorMessage6)?"billing":"hard-error";if(switchedFallback=await tryFallback(reason,{errorMessage:errorMessage6}),!switchedFallback){let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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:errorMessage6}),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:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),!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(errorMessage6);if(is429Class&&retryProfile.fallback.rateLimited==="after-turn-budget"){if(is429TierRouted=!0,this._retryAttempt++,this._retryAttempt>retryProfile.turn.maxRetries)if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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(errorMessage6),hintSettings=this.settingsManager.getHintPolicySettings(),tier=classifyRateLimitedWait(hintMs,hintSettings);if(is429TierRouted=!0,tier==="no-hint-fast-fallback")if(switchedFallback=await tryFallback("transient",{errorMessage:errorMessage6}),switchedFallback)this._retryAttempt=1;else{let degradedDelayMs=this._degradeRateLimitedWithoutFallback(tier,hintMs,message,errorMessage6);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:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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:errorMessage6,retryAfterMs:remainingHintMs}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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:errorMessage6,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,errorMessage6);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:errorMessage6,retryAfterMs:this._getProviderRetryDelayMs(errorMessage6)}),switchedFallback)this._retryAttempt=1;else{let exhaustedChainKey=this._retryFallback.exhaustedChainKey;return exhaustedChainKey&&this._emit({type:"retry_fallback_exhausted",chainKey:exhaustedChainKey,lastError:errorMessage6}),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(errorMessage6),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:errorMessage6,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:usageLimitScope(errorMessage6)==="account"?new AccountUsageLimitError(message.provider,errorMessage6).message:errorMessage6});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("continuation");let model=this.model,compactionSettings=this._getCompactionSettings(),contextTokens=this._estimatePrePromptContextTokens();if(compactionSettings.enabled&&model&&shouldCompact(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),this.refreshLifecycle();let prefix=this.settingsManager.getShellCommandPrefix(),shellPath=this.settingsManager.getShellPath(),resolvedCommand=prefix?`${prefix}
|
|
300
300
|
${command}`:command;try{let result3=await executeBashWithOperations(resolvedCommand,this.sessionManager.getCwd(),options?.operations??this._toolDispatcher.bashOperations({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),this.refreshLifecycle()}}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(path14){await rm5(path14,{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,text3,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedLeaf(options.expectedLeafId,lifecycleEditLeaf(this.sessionManager,options.expectedLeafId));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,text3);return assistantTextEquals(targetEntry.message,text3)?{cancelled:!1,unchanged:!0}:this._navigateTree(entryId,options,replacement)}async editUserMessage(entryId,text3,options={}){if(this.isStreaming)throw new SessionStreamingError;assertExpectedUserLeaf(options.expectedLeafId,lifecycleEditLeaf(this.sessionManager,options.expectedLeafId));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,text3);return userTextEquals(targetEntry.message,text3)?{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,lifecycleEditLeaf(this.sessionManager,options.expectedLeafId)),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}=collectEntriesForBranchSummary(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;let finishSessionWork=this._sessionWorkBarrier.begin();try{let extensionSummary,fromExtension=!1;if(this._extensionRunner.hasHandlers("session_before_tree")){let result3=await this._extensionRunner.emit({type:"session_before_tree",preparation,signal:this._branchSummaryAbortController.signal});if(result3?.cancel)return{cancelled:!0};result3?.summary&&options.summarize&&(extensionSummary=result3.summary,fromExtension=!0),result3?.customInstructions!==void 0&&(customInstructions=result3.customInstructions),result3?.replaceInstructions!==void 0&&(replaceInstructions=result3.replaceInstructions),result3?.label!==void 0&&(label3=result3.label)}let summaryText,summaryDetails,summaryUsage;if(options.summarize&&entriesToSummarize.length>0&&!extensionSummary){let model=this.model,{model:requestModel,apiKey,headers,extraBody,env}=await this._getCompactionRequestAuth(model,this._branchSummaryAbortController.signal),branchSummarySettings=this.settingsManager.getBranchSummarySettings(),result3=await generateBranchSummary(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 replacement&&this._observeEngineTurnMessage(replacement),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._branchSummaryAbortControllerValue=void 0,finishSessionWork(),this.refreshLifecycle()}}getUserMessagesForForking(){let entries=this.sessionManager.getEntries(),result3=[];for(let entry2 of entries){if(entry2.type!=="message"||entry2.message.role!=="user")continue;let text3=askUserAnswerDisplayText(entry2.message.content)??contentText(entry2.message.content,"");text3&&result3.push({entryId:entry2.id,text:text3})}return result3}getSessionStats(){let userMessages=0,assistantMessages=0,toolResults=0,totalMessages=0,toolCalls=0,usageTotals=createUsageTotals();for(let entry2 of this.sessionManager.getEntries()){entry2.type==="usage"?addUsageToTotals(usageTotals,entry2.usage):(entry2.type==="branch_summary"||entry2.type==="compaction")&&entry2.usage&&addUsageToTotals(usageTotals,entry2.usage);let prewarmUsage=getPromptCachePrewarmUsage(entry2);if(prewarmUsage&&addUsageToTotals(usageTotals,prewarmUsage),entry2.type!=="message")continue;totalMessages++;let message=entry2.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,...usageTotals.costUnknown?{costUnknown:!0}:{},contextUsage:this.getContextUsage(),failures:computeSessionFailureReport(this.sessionManager.getEntries())}}resolvePromptCacheSafeWaitSeconds(){let global=this.settingsManager.getGlobalSettings().promptCache,project2=this.settingsManager.getProjectSettings().promptCache,merged=global||project2?{...global,...project2}: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 entry2=branchEntries[i];if(entry2.type==="message"&&entry2.message.role==="assistant"){let assistant=entry2.message;if(assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens(assistant.usage)>0){hasPostCompactionUsage=!0;break}}}if(!hasPostCompactionUsage){let tokens=messages.reduce((sum,message)=>sum+estimateTokens(message),0);return{tokens,contextWindow,percent:tokens/contextWindow*100}}}let estimate=branchEntries.some(entry2=>entry2.type==="context_edit")?estimateProjectedContextTokens(this.sessionManager.buildSessionProjection(),branchEntries):estimateContextTokens(messages),percent=estimate.tokens/contextWindow*100;return{tokens:estimate.tokens,contextWindow,percent}}async exportToHtml(outputPath,options={}){return await exportSessionToHtml(this.sessionManager,this.state,{...this.htmlExportOptions(options.themeName),outputPath})}renderToHtml(options){return renderSessionToHtml(this.sessionManager,this.state,{...this.htmlExportOptions(options.themeName),sanitize:options.sanitize})}htmlExportOptions(requestedTheme){let themeName=[requestedTheme,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{themeName,toolRenderer}}exportToJsonl(outputPath){let filePath=resolvePath(outputPath??`session-${new Date().toISOString().replace(/[:.]/g,"-")}.jsonl`,process.cwd()),dir=dirname29(filePath);existsSync9(dir)||mkdirSync6(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.getFullBranch(),lines=[JSON.stringify(header2)],prevId=null;for(let entry2 of branchEntries){let linear={...entry2,parentId:prevId};lines.push(JSON.stringify(linear)),prevId=entry2.id}return writeFileSync6(filePath,`${lines.join(`
|
|
301
301
|
`)}
|
|
302
302
|
`),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 text3="";for(let content of lastAssistant.content)content.type==="text"&&(text3+=content.text);return text3.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,requestContext=usage3?.contextUsage;return`${size}:${usage3?.input??""}:${usage3?.output??""}:${usage3?.totalTokens??""}:${requestContext?.input}:${requestContext?.output}:${requestContext===null}`}var EVAL_HANDLE_ERROR_CODES=["eval_handle_stale","eval_handle_forbidden","eval_handle_not_found","eval_handle_pending","eval_handle_operation_unsupported","eval_wait_unavailable","eval_wait_timeout","eval_wait_empty","eval_pool_open","eval_workpool_failed"],EvalHandleError=class extends Error{constructor(code,message,details){super(`${code}: ${message}`),this.name="EvalHandleError",this.code=code,details!==void 0&&(this.details=details)}};var ReservedCustodyKey=class extends Error{constructor(key){super(`Custody key is reserved for the engine: ${key}`),this.name="ReservedCustodyKey",this.key=key}};function assertExtensionKey(key){if(ENGINE_CUSTODY_KEY_PREFIXES.some(prefix=>key.startsWith(prefix)))throw new ReservedCustodyKey(key)}function extensionToken(token){return{transfer(nextKey,kind){return assertExtensionKey(nextKey),extensionToken(token.transfer(nextKey,kind))},ticket:()=>token.ticket(),heldAsNotice:noticeId=>token.heldAsNotice(noticeId),close:reason=>token.close(reason)}}function extensionObligations(obligations){return{open(key,kind,detail){return assertExtensionKey(key),extensionToken(obligations.open(key,kind,detail))}}}function createLifecycleApi(resolve55){return{get obligations(){return extensionObligations(resolve55().obligations)},reportChild(report){resolve55().reportChild(report)},markRunCompleted(run2){resolve55().markRunCompleted(run2)}}}var BOLD="\x1B[1m",BOLD_OFF="\x1B[22m";function noticeText(text3){return{render(width){return wrapTextWithAnsi(text3,Math.max(1,width))},invalidate(){}}}function buildNoticeBox(spec2,options,theme2){let box2=new Box(1,1,text3=>theme2.bg("customMessageBg",text3));box2.addChild(noticeText(theme2.fg(spec2.tone??"accent",`${BOLD}${spec2.title}${BOLD_OFF}`))),box2.addChild(noticeText(theme2.fg("dim",spec2.why)));for(let line of spec2.extra??[])box2.addChild(noticeText(theme2.fg(line.tone??"dim",line.text)));return options.expanded&&spec2.expandedLine!==void 0&&box2.addChild(noticeText(theme2.fg("dim",spec2.expandedLine))),box2}function noticeMessageRenderer(map){return(message,options,theme2)=>{let spec2=map(message);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}function noticeEntryRenderer(map){return(entry2,options,theme2)=>{let spec2=map(entry2);return spec2===void 0?void 0:buildNoticeBox(spec2,options,theme2)}}import{existsSync as existsSync35,mkdirSync as mkdirSync20,readdirSync as readdirSync8,readFileSync as readFileSync39,realpathSync as realpathSync15,statSync as statSync22,unlinkSync as unlinkSync5,writeFileSync as writeFileSync20}from"node:fs";import{dirname as dirname61,join as join82,resolve as resolve47,sep as sep18}from"node:path";import{fileURLToPath as fileURLToPath6,pathToFileURL as pathToFileURL3}from"node:url";var GENERATED_SHIM_BANNER=`// Generated by ${APP_NAME}. Delete this file to stop loading the default global extension.
|
|
@@ -335,7 +335,7 @@ ${ANTHROPIC_BASH_SECTION}`}},{previewSafe:!0})}import{existsSync as existsSync15
|
|
|
335
335
|
|
|
336
336
|
`}),message.role==="toolResult"&&blocks.push({type:"text",text:`Tool result (${mapPiToolNameToSdk(message.toolName,customToolNameToSdk)}, id=${message.toolCallId}):
|
|
337
337
|
`}),appendContent(blocks,message.content);return blocks}function semanticContentBlock(block){switch(block.type){case"text":return{type:block.type,text:block.text};case"thinking":return{type:block.type,thinking:block.thinking,thinkingSignature:block.thinkingSignature};case"toolCall":return{type:block.type,id:block.id,name:block.name,arguments:block.arguments};default:return block}}function semanticProjection(message){return{role:message.role,api:message.api,provider:message.provider,model:message.model,content:message.content.map(semanticContentBlock)}}function assistantContentHash(message){return sessionSyncDigest(semanticProjection(message))}function isResidentAssistant(message,modelId){return message.api===CLAUDE_SDK_OAUTH_API_ID&&message.provider===ANTHROPIC_SUBSCRIPTION_PROVIDER_ID&&message.model===modelId}function isTerminalFailure(message){return message.stopReason==="error"||message.stopReason==="aborted"}var AssistantCommitBoundary=class{constructor(){this.providerFinalByKey=new Map}captureProviderFinal(key,message){let projection=semanticProjection(message);this.providerFinalByKey.set(key,{hash:sessionSyncDigest(projection),projection:snapshotProjection(projection)})}commit(key,message,modelId){let providerFinal=this.providerFinalByKey.get(key);if(this.providerFinalByKey.delete(key),!isResidentAssistant(message,modelId))return{outcome:"not-resident"};if(providerFinal===void 0)return{outcome:"clean"};let committed=semanticProjection(message);return providerFinal.hash===sessionSyncDigest(committed)?{outcome:"clean"}:{outcome:"rewritten",divergedPath:firstDivergedPath(providerFinal.projection,committed)}}forget(key){this.providerFinalByKey.delete(key)}};var BINDING_ENTRY_TYPE="claude-sdk-oauth-binding",BINDING_MARKER={schemaVersion:2,marker:!0};function storedBindingFromEntry(entry2,hashes,anchor){return{schemaVersion:1,sessionPath:anchor.sessionPath,sessionId:anchor.sessionId,markerEntryId:anchor.markerEntryId,sdkSessionId:entry2.sdkSessionId,sentCount:hashes.length,sentPrefixHash:sentHashPrefixDigest(hashes),assistantContentHash:anchor.assistantContentHash,lastAssistantUuid:entry2.assistantUuidByIndex.get(hashes.length)??null,accountName:entry2.accountName,modelId:entry2.modelId,systemPromptHash:entry2.systemPromptHash,toolsetHash:entry2.toolsetHash}}function storedBindingFromBinding(binding,hashes,anchor){if(binding.sdkSessionIdConfirmed===!1||binding.sentCount!==hashes.length)return;let expectedDigest=sentHashPrefixDigest(hashes),bindingDigest=binding.sentPrefixHash??(binding.sentHashes.length>0?sentHashPrefixDigest(binding.sentHashes):void 0);if(!(bindingDigest===void 0||bindingDigest!==expectedDigest))return{schemaVersion:1,sessionPath:anchor.sessionPath,sessionId:anchor.sessionId,markerEntryId:anchor.markerEntryId,sdkSessionId:binding.sdkSessionId,sentCount:hashes.length,sentPrefixHash:sentHashPrefixDigest(hashes),assistantContentHash:anchor.assistantContentHash,lastAssistantUuid:binding.lastAssistantUuid,accountName:binding.accountName,modelId:binding.modelId,systemPromptHash:binding.systemPromptHash,toolsetHash:binding.toolsetHash}}function invalidationReasonFromBranch(branch){let index=newestBindingEntryIndex(branch);if(index<0)return;let data=branch[index]?.data;return isBindingInvalidation(data)?data.reason:void 0}function isBindingInvalidation(value){return typeof value!="object"||value===null?!1:"invalidated"in value&&value.invalidated===!0&&"reason"in value&&typeof value.reason=="string"}function bindingFromStoredBranch(branch,stored){let markerIndex=newestBindingEntryIndex(branch);if(markerIndex<0)return;let marker=branch[markerIndex];if(marker?.id!==stored.markerEntryId||!isBindingMarker(marker.data))return;let assistantIndex=committedAssistantIndex(branch,markerIndex+1);if(assistantIndex<0||!branch.slice(assistantIndex+1).every(isAppendOnlyTailEntry))return;let committedAssistant=branch[assistantIndex]?.message;if(isAssistantMessage(committedAssistant)&&assistantContentHash(committedAssistant)===stored.assistantContentHash)return bindingFromStored(stored)}function committedAssistantIndex(branch,from){for(let index=from;index<branch.length;index+=1){let entry2=branch[index];if(entry2?.type==="message")return index;if(!entry2||!isLedgerOnlyEntry(entry2))return-1}return-1}var LEDGER_ONLY_ENTRY_TYPES=new Set(["custom","label","session_info","thinking_level_change","model_change","model_change_rejected","configuration_update"]);function isLedgerOnlyEntry(entry2){return entry2.type==="custom_message"?entry2.customType===GOAL_CONTINUATION_MESSAGE_TYPE:LEDGER_ONLY_ENTRY_TYPES.has(entry2.type)}function isAppendOnlyTailEntry(entry2){if(isLedgerOnlyEntry(entry2)||entry2.type==="custom_message")return!0;if(entry2.type!=="message")return!1;let message=entry2.message;return typeof message!="object"||message===null||!("role"in message)?!1:message.role==="user"||message.role==="toolResult"}function newestBindingEntryIndex(branch){for(let index=branch.length-1;index>=0;index-=1){let entry2=branch[index];if(entry2?.type==="custom"&&entry2.customType===BINDING_ENTRY_TYPE)return index}return-1}function isBindingMarker(value){return typeof value!="object"||value===null?!1:"schemaVersion"in value&&value.schemaVersion===2&&"marker"in value&&value.marker===!0}function isAssistantMessage(value){return typeof value!="object"||value===null?!1:"role"in value&&value.role==="assistant"&&"api"in value&&typeof value.api=="string"&&"provider"in value&&typeof value.provider=="string"&&"model"in value&&typeof value.model=="string"&&"content"in value&&Array.isArray(value.content)}function bindingFromStored(stored){return{senpiSessionId:stored.sessionId,sdkSessionId:stored.sdkSessionId,sentCount:stored.sentCount,sentHashes:[],sentPrefixHash:stored.sentPrefixHash,lastAssistantUuid:stored.lastAssistantUuid,assistantUuidByIndex:stored.lastAssistantUuid===null?[]:[[stored.sentCount,stored.lastAssistantUuid]],accountName:stored.accountName,modelId:stored.modelId,systemPromptHash:stored.systemPromptHash,toolsetHash:stored.toolsetHash}}import{randomUUID as randomUUID7}from"node:crypto";import{realpathSync as realpathSync6}from"node:fs";import{readFile as readFile6,rename as rename2,rm as rm6,stat as stat2,writeFile as writeFile4}from"node:fs/promises";import{basename as basename16,dirname as dirname35,join as join34,resolve as resolve13}from"node:path";var SHA256_HEX=/^[0-9a-f]{64}$/,MAX_RECORD_BYTES=16*1024,storedBindingSchema=external_exports.strictObject({schemaVersion:external_exports.literal(1),sessionPath:external_exports.string().min(1).max(4096),sessionId:external_exports.string().min(1).max(256),markerEntryId:external_exports.string().min(1).max(256),sdkSessionId:external_exports.string().min(1).max(256),sentCount:external_exports.number().int().nonnegative().safe(),sentPrefixHash:external_exports.string().regex(SHA256_HEX),assistantContentHash:external_exports.string().regex(SHA256_HEX),lastAssistantUuid:external_exports.string().min(1).max(256).nullable(),accountName:external_exports.string().min(1).max(256),modelId:external_exports.string().min(1).max(256),systemPromptHash:external_exports.string().regex(SHA256_HEX),toolsetHash:external_exports.string().regex(SHA256_HEX)});function bindingSidecarPath(sessionFile){return`${canonicalSessionPath(sessionFile)}.claude-sdk-oauth-binding.json`}function canonicalSessionPath(sessionFile){let resolved=resolve13(sessionFile);try{return realpathSync6(resolved)}catch{try{return join34(realpathSync6(dirname35(resolved)),basename16(resolved))}catch{return resolved}}}async function readStoredBinding(sessionFile){let path14=bindingSidecarPath(sessionFile),metadata;try{metadata=await stat2(path14)}catch(error2){if(isNotFoundError(error2))return;throw error2}if(metadata.size>MAX_RECORD_BYTES)return;let value;try{value=JSON.parse(await readFile6(path14,"utf8"))}catch(error2){if(error2 instanceof SyntaxError)return;throw error2}let parsed=storedBindingSchema.safeParse(value);if(!(!parsed.success||parsed.data.sessionPath!==canonicalSessionPath(sessionFile)))return parsed.data}async function writeStoredBinding(sessionFile,record10){let sessionPath=canonicalSessionPath(sessionFile),parsed=storedBindingSchema.parse(record10);if(canonicalSessionPath(parsed.sessionPath)!==sessionPath)throw new StoredBindingPathError(sessionPath,parsed.sessionPath);let canonical3={...parsed,sessionPath},serialized=`${JSON.stringify(canonical3)}
|
|
338
|
-
`;if(Buffer.byteLength(serialized)>MAX_RECORD_BYTES)throw new StoredBindingSizeError(Buffer.byteLength(serialized),MAX_RECORD_BYTES);let path14=bindingSidecarPath(sessionPath),temporaryPath=join34(dirname35(path14),`.${basename16(path14)}-${randomUUID7()}.tmp`);try{await writeFile4(temporaryPath,serialized,{encoding:"utf8",mode:384}),await rename2(temporaryPath,path14)}catch(error2){throw await rm6(temporaryPath,{force:!0}),error2}}async function deleteStoredBinding(sessionFile){await rm6(bindingSidecarPath(sessionFile),{force:!0})}var StoredBindingPathError=class extends Error{constructor(expected,actual){super(`Stored binding path mismatch: expected ${expected}, received ${actual}`),this.name="StoredBindingPathError"}},StoredBindingSizeError=class extends Error{constructor(actual,maximum){super(`Stored binding exceeds ${maximum} bytes: ${actual}`),this.name="StoredBindingSizeError"}};function isNotFoundError(error2){return error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT"}var loaded2,loading;function loadClaudeAgentSdk(){return loaded2?Promise.resolve(loaded2):(loading??=import("./sdk-OOLG5KXI.js").then(module=>(loaded2={query:module.query,createSdkMcpServer:module.createSdkMcpServer,getSessionMessages:module.getSessionMessages},loaded2)).finally(()=>{loading=void 0}),loading)}function loadedClaudeAgentSdk(){return loaded2}function requireLoadedSdk(member){let sdk=loadedClaudeAgentSdk();if(!sdk)throw new Error(`Claude Agent SDK was not preloaded before '${member}'. Await loadClaudeAgentSdk() on the entry path before reaching the SDK boundary.`);return sdk}var defaultSdkBoundary={query:input=>{let cwd=requireAnthropicSubscriptionCwd(input.options?.cwd);return requireLoadedSdk("query").query({...input,options:{...input.options,cwd}})},createSdkMcpServer:options=>requireLoadedSdk("createSdkMcpServer").createSdkMcpServer(options),getSessionMessages:async(sessionId,options)=>{let dir=requireAnthropicSubscriptionCwd(options?.dir);return(await loadClaudeAgentSdk()).getSessionMessages(sessionId,{...options,dir})}},activeSdkBoundary=defaultSdkBoundary;function getSdkBoundary(){return activeSdkBoundary}var SANITIZED_REASONS=new Set(["prefix_matched","registry_miss","idle_ttl","capacity","model_selected","thinking_level_selected","bound_account_token_expiring","account_changed","credential_refreshed","model_changed","toolset_changed","system_prompt_changed","assistant_stream_diverged","options_changed","history_rolled_back","assistant_rewritten","transcript_missing","cross_root_unsupported","sent_stream_diverged","branch_diverged","branch_boundary_unavailable","branch_resume","tainted_compaction","tainted_fork","tainted_abort","tainted_assistant_provenance_unverified","resume_initialization_failed","resume_initialization_aborted","resume_mode_off","query_failed","turn_attribution_failed","session_unconfirmed","abort_timeout","extensions_removed","session_shutdown","timeout_retry","other"]),cachedLogger;function sessionLogger(){return cachedLogger??=createSessionLogger(getAgentDir()),cachedLogger}var defaultBoundary={emit:()=>{},log:(event,data)=>sessionLogger().info(event,data)},activeBoundary=defaultBoundary;function logContinuityEvent(event,data){activeBoundary.log(event,data)}function sanitizeReason(value){let text3=typeof value=="string"?value:value instanceof Error?value.message:"";if(SANITIZED_REASONS.has(text3))return text3;let tainted=/^tainted:(.+)$/.exec(text3);if(tainted){let mapped=`tainted_${tainted[1]}`;if(SANITIZED_REASONS.has(mapped))return mapped}return sanitizeCloseCause(value)}function sanitizeCloseCause(value){let text3=typeof value=="string"?value:value instanceof Error?value.message:"";return SANITIZED_REASONS.has(text3)?text3:/did not terminate|interrupt failed/i.test(text3)?"abort_timeout":/user_message_uuid did not match|result arrived before replay claim|pre-replay buffer overflow/i.test(text3)?"turn_attribution_failed":/query ended before|Claude SDK OAuth query|Anthropic Subscription query|Claude Code/i.test(text3)?"query_failed":"other"}function sanitizeTerminalFailure(value){let cause=sanitizeCloseCause(value);return cause!=="other"?cause:value instanceof Error?"query_failed":"other"}var pendingCloseCauses=new Map,PENDING_CLOSE_CAUSE_LIMIT=256;function recordPendingCloseCause(senpiSessionId,reason){let cause=sanitizeReason(reason);if(pendingCloseCauses.delete(senpiSessionId),pendingCloseCauses.size>=PENDING_CLOSE_CAUSE_LIMIT){let oldest=pendingCloseCauses.keys().next().value;oldest!==void 0&&pendingCloseCauses.delete(oldest)}pendingCloseCauses.set(senpiSessionId,cause),activeBoundary.log("claude_sdk_oauth_session_close",{reason:cause,sessionId:senpiSessionId})}function peekPendingCloseCause(senpiSessionId){return pendingCloseCauses.get(senpiSessionId)}function consumePendingCloseCause(senpiSessionId){let cause=pendingCloseCauses.get(senpiSessionId);return pendingCloseCauses.delete(senpiSessionId),cause}function observeSessionSyncDecision(input){let diverged=input.divergedPath===void 0?{}:{divergedPath:input.divergedPath};if(input.kind==="incremental")return{kind:"delta",reason:"prefix_matched",deltaMessages:input.deltaMessages};if(input.kind==="resume")return{kind:"fork",reason:(input.reason==="registry_miss"?consumePendingCloseCause(input.senpiSessionId):void 0)??(input.reason===void 0?"branch_resume":sanitizeReason(input.reason)),deltaMessages:input.deltaMessages,...diverged};let reason=(input.reason==="registry_miss"?peekPendingCloseCause(input.senpiSessionId):void 0)??sanitizeReason(input.reason);return{kind:input.firstTurn&&reason==="registry_miss"?"bootstrap":"flatten",reason,deltaMessages:input.deltaMessages,...input.payloadBytes!==void 0?{payloadBytes:input.payloadBytes}:{},...input.collapsedDirectives!==void 0?{collapsedDirectives:input.collapsedDirectives}:{},...diverged}}function stageContinuityDecision(observation,sessionId,onDecision,beforeEmit){let emitted=!1;return{observation,emit:()=>{emitted||(emitted=!0,beforeEmit?.(),emitContinuityObservation(observation,sessionId,onDecision))}}}function emitContinuityObservation(observation,sessionId,onDecision){onDecision?.(observation),activeBoundary.emit(observation),activeBoundary.log("claude_sdk_oauth_session_continuity",{kind:observation.kind,reason:observation.reason,...observation.deltaMessages===void 0?{}:{count:observation.deltaMessages},...observation.settingSource===void 0?{}:{settingSource:observation.settingSource},...observation.seat===void 0?{}:{seat:observation.seat},...observation.seatChanged===void 0?{}:{seatChanged:observation.seatChanged},...observation.divergedPath===void 0?{}:{divergedPath:observation.divergedPath},...sessionId===void 0?{}:{sessionId}})}import{randomBytes as randomBytes4}from"node:crypto";import{createHash as createHash12}from"node:crypto";async function*retainedAttemptMessages(attempt2){let retained=!1;try{for await(let event of attempt2.messages)yield event;retained=!0}finally{retained||attempt2.discard()}}async function*closingQueryMessages(query){try{for await(let message of query)yield message}finally{query.close()}}async function createAttemptMessages(input,auth){if(input.createAttempt)return recordingLimitWindows(retainedAttemptMessages(await input.createAttempt(auth)),auth);let query=input.query({prompt:input.prompt,options:auth.options});return input.onQuery?.(query),recordingLimitWindows(closingQueryMessages(query),auth)}async function*recordingLimitWindows(messages,auth){for await(let message of messages)message.type==="rate_limit_event"&&subscriptionLimits.record(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,auth.accountName,claudeWindowsFromSdkEvent(message)),yield message}function isAuthBlockRecoverable(slot2){return slot2.blockReason==="auth_error"&&slot2.source!=="env"&&slot2.refresh!==""&&slot2.authRecoveryGrant!==authGrantDigest(slot2.refresh)}function recovered(slot2,refreshed){let{blockReason:_blockReason,blockedUntil:_blockedUntil,...unblocked}=slot2;return{...unblocked,access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires,authRecoveryGrant:authGrantDigest(refreshed.refresh)}}async function recoverSlot(input,name){await input.store.modify(input.providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current,stored=credential.accounts?.find(slot2=>slot2.name===name);if(!stored||!isAuthBlockRecoverable(stored))return current;let next;try{next=recovered(stored,await input.refresher(stored.refresh,input.signal))}catch(error2){if(input.signal.throwIfAborted(),!input.isGrantRejected(error2))throw error2;next={...stored,authRecoveryGrant:authGrantDigest(stored.refresh)}}return{...credential,accounts:(credential.accounts??[]).map(slot2=>slot2.name===name?next:slot2)}})}function isProbeDue(slot2,now2){return slot2.blockedUntil===void 0||slot2.blockedUntil<=now2}async function recoverAuthBlockedSlots(input){let recoverable=input.accounts.filter(isAuthBlockRecoverable),candidates=input.accounts.some(input.isUsable)?recoverable.filter(slot2=>isProbeDue(slot2,input.now)):recoverable;if(candidates.length===0)return[...input.accounts];let transientFailure;for(let candidate of candidates)try{await recoverSlot(input,candidate.name)}catch(error2){input.signal.throwIfAborted(),transientFailure=error2}let accounts=await input.reload();if(transientFailure!==void 0&&!accounts.some(input.isUsable))throw input.transientError(transientFailure);return accounts}function isClaudeOauthTokenName(name){return name==="CLAUDE_CODE_OAUTH_TOKEN"||/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)}function hasRequestOauthToken(requestEnvironment){return Object.entries(requestEnvironment??{}).some(([name,value])=>isClaudeOauthTokenName(name)&&!!value)}function mergeRequestAuthEnvironment(hostEnvironment,requestEnvironment){let environment={...hostEnvironment},requestTokens=Object.entries(requestEnvironment??{}).filter(([name])=>isClaudeOauthTokenName(name));if(requestTokens.length===0)return environment;for(let name of Object.keys(environment))isClaudeOauthTokenName(name)&&delete environment[name];for(let[name,value]of requestTokens)environment[name]=value;return environment}function stripManagedAuthEnvironment(parent){let{ANTHROPIC_API_KEY:_apiKey,ANTHROPIC_AUTH_TOKEN:_authToken,ANTHROPIC_BASE_URL:_gateway,ANTHROPIC_CUSTOM_HEADERS:_customHeaders,CLAUDE_CODE_OAUTH_TOKEN:_oauthToken,CLAUDE_CODE_USE_BEDROCK:_bedrock,CLAUDE_CODE_USE_FOUNDRY:_foundry,CLAUDE_CODE_USE_GATEWAY:_gatewayMode,CLAUDE_CODE_USE_VERTEX:_vertex,...environment}=parent;for(let name of Object.keys(environment))/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)&&delete environment[name],name.startsWith("SENPI_")&&delete environment[name];return environment}import{chmodSync as chmodSync4,cpSync,existsSync as existsSync13,mkdirSync as mkdirSync9,renameSync as renameSync7,rmSync as rmSync4,writeFileSync as writeFileSync9}from"node:fs";import{join as join35}from"node:path";var LEGACY_ACCOUNTS_DIR="claude-sdk-oauth-accounts",ACCOUNTS_DIR="anthropic-subscription-accounts";function resolveAccountsDirectory(agentDir){let legacy=join35(agentDir,LEGACY_ACCOUNTS_DIR),target=join35(agentDir,ACCOUNTS_DIR);if(!existsSync13(legacy))return target;if(existsSync13(target)){try{renameSync7(legacy,`${legacy}.${Date.now()}.bak`)}catch{}return target}try{return renameSync7(legacy,target),target}catch{try{return cpSync(legacy,target,{recursive:!0}),rmSync4(legacy,{recursive:!0,force:!0}),target}catch{try{rmSync4(target,{recursive:!0,force:!0})}catch{}return legacy}}}var CLI_OAUTH_SCOPES=["org:create_api_key","user:profile","user:inference","user:sessions:claude_code","user:mcp_servers","user:file_upload"];function writeConfigDirCredential(agentDir,slot2,access8){assertValidAccountName(slot2.name);let directory=join35(resolveAccountsDirectory(agentDir),slot2.name);return mkdirSync9(directory,{recursive:!0,mode:448}),chmodSync4(directory,448),writeFileSync9(join35(directory,".credentials.json"),JSON.stringify({claudeAiOauth:{accessToken:access8,refreshToken:slot2.refresh,expiresAt:slot2.expires,scopes:CLI_OAUTH_SCOPES}}),{encoding:"utf8",mode:384}),directory}var SDK_ERROR_CLASSIFICATIONS={authentication_failed:{kind:"auth_error",retryable:!0},oauth_org_not_allowed:{kind:"org_not_allowed",retryable:!0},billing_error:{kind:"billing",retryable:!0},rate_limit:{kind:"rate_limit",retryable:!0},overloaded:{kind:"overloaded",retryable:!0},invalid_request:{kind:"other",retryable:!1},server_error:{kind:"other",retryable:!0},account_on_hold:{kind:"billing",retryable:!0},model_not_found:{kind:"other",retryable:!1},max_output_tokens:{kind:"other",retryable:!1}},OTHER_ERROR={kind:"other",retryable:!1};function record2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:void 0}function errorText2(error2){if(typeof error2=="string")return error2;if(error2 instanceof Error)return error2.message;let value=record2(error2);if(!value)return String(error2);let message=value.message;if(typeof message=="string")return message;let code=value.error;return typeof code=="string"?code:String(error2)}var SdkResultFailure=class extends Error{constructor(message,usage3){super(message),this.name="SdkResultFailure",this.usage=usage3}};function sdkResultFailureUsage(error2){if(error2 instanceof SdkResultFailure)return error2.usage;let wrapped=record2(error2)?.original;return wrapped instanceof SdkResultFailure?wrapped.usage:void 0}function sdkResultFailure(message){if(message.subtype==="success"&&message.is_error!==!0)return;let firstError=("errors"in message&&Array.isArray(message.errors)?message.errors:[]).find(error2=>typeof error2=="string"&&error2.length>0),resultText="result"in message&&typeof message.result=="string"?message.result.trim():"",detail=firstError??(message.is_error===!0&&resultText?resultText:void 0)??`Claude Code ${message.subtype}`,status="api_error_status"in message&&message.api_error_status!=null?`HTTP ${message.api_error_status}`:"",reason="terminal_reason"in message&&typeof message.terminal_reason=="string"?message.terminal_reason:"",suffix=[status,reason].filter(Boolean).join(", ");return new SdkResultFailure(suffix?`${detail} (${suffix})`:detail,message.usage)}function sdkAssistantFailure(message){if(!message.error)return;let content=message.message.content,text3=(typeof content=="string"?content:content.filter(block=>block.type==="text"&&"text"in block&&typeof block.text=="string").map(block=>"text"in block&&typeof block.text=="string"?block.text:"").join(" ")).trim();return new Error(text3?message.error==="unknown"?text3:`${text3} (${message.error})`:message.error)}function classifySdkError(error2){let classification=classifyErrorKind(error2);if(classification.kind!=="rate_limit")return classification;let modelFamily=rateLimitModelFamily(errorText2(error2));return modelFamily===void 0?classification:{...classification,modelFamily}}function classifyErrorKind(error2){let text3=errorText2(error2).toLowerCase();if(/\b(?:extra usage|usage credits) (?:is|are) required for long context\b/.test(text3))return{kind:"long_context_unavailable",retryable:!0};if(/\b(enotfound|eai_again|econnreset|econnrefused|etimedout|enetunreach|ehostunreach|und_err_connect_timeout|und_err_socket)\b|fetch failed|socket hang up|connection reset by peer/.test(text3))return{kind:"other",retryable:!0};for(let[code,classification]of Object.entries(SDK_ERROR_CLASSIFICATIONS))if(new RegExp(`\\b${code}\\b`).test(text3))return classification??OTHER_ERROR;return/\b(?:http\s*)?429\b|too many requests|rate[ _-]?limit/.test(text3)?{kind:"rate_limit",retryable:!0}:/\bblocking_limit\b|\brapid_refill_breaker\b/.test(text3)?{kind:"rate_limit",retryable:!0}:/\b(?:hit|reached|exceeded)\b[^.]*\blimit\b|\b(?:weekly|daily|hourly|usage)\s+limit\b/.test(text3)?{kind:"rate_limit",retryable:!0}:/\b(?:http\s*)?529\b|overloaded/.test(text3)?{kind:"overloaded",retryable:!0}:/\bhttp\s*(?:408|5\d\d)\b/.test(text3)?{kind:"other",retryable:!0}:/\binvalid_grant\b|\binvalid_token\b|\b(?:http\s*)?401\b|\bunauthorized\b/.test(text3)?{kind:"auth_error",retryable:!0}:/\brequires usage credits\b|\/usage-credits\b|\bcredits_required\b/.test(text3)?{kind:"entitlement",retryable:!1}:OTHER_ERROR}var ClaudeSdkRefusalError=class extends Error{constructor(content,category){super(`Claude refused this request${category?` (${category})`:""}: ${content}`),this.name="ClaudeSdkRefusalError",this.category=category}};function refusalDetails(message){if(message.type==="system"&&message.subtype==="model_refusal_no_fallback")return{content:message.api_refusal_explanation??message.content,...message.api_refusal_category?{category:message.api_refusal_category}:{}};if(message.type!=="assistant")return;let assistantMessage=message.message;if(assistantMessage.stop_reason!=="refusal")return;let content=assistantMessage.stop_details?.explanation??"The request was blocked by policy.",category=assistantMessage.stop_details?.category??void 0;return{content,...category?{category}:{}}}function refusalError(message){let details=refusalDetails(message);return details?new ClaudeSdkRefusalError(details.content,details.category):void 0}function sdkFailure(message){let refusal=refusalError(message);if(refusal)return refusal;if(message.type==="assistant")return sdkAssistantFailure(message);if(message.type==="result")return sdkResultFailure(message)}function visibleSdkMessage(message){return message.type!=="stream_event"?!1:/^(?:content_block_start|content_block_delta|content_block_stop)$/.test(message.event.type)}function classifyForRequest(error2,askedLegacyLongContext){let classification=classifySdkError(error2);return classification.kind==="long_context_unavailable"&&!askedLegacyLongContext?{kind:"other",retryable:!1}:classification}async function*retryAtStandardWindowOnce(attempt2,askedLegacyLongContext){let first=(await attempt2())[Symbol.asyncIterator](),refused2=!1,finished=!1;try{let visible=!1;for(;;){let next=await first.next();if(next.done){finished=!0;return}let failure2=visible?void 0:sdkFailure(next.value);if(failure2!==void 0&&classifyForRequest(failure2,askedLegacyLongContext()).kind==="long_context_unavailable"){refused2=!0;break}visible||=visibleSdkMessage(next.value),yield next.value}}finally{if(!finished)try{await first.return?.()}catch{}}refused2&&(markLongContextRefused(),yield*await attempt2())}var TRANSIENT_REFRESH_FAILURE=/\bstatus=5\d\d\b|\bTimeoutError\b/;function refreshFailure(error2){let detail=error2 instanceof Error?error2.message:String(error2),classification=classifySdkError(detail);return classification.kind==="rate_limit"||classification.kind==="overloaded"?new Error(detail):classification.kind==="other"&&classification.retryable||TRANSIENT_REFRESH_FAILURE.test(detail)?new Error(`server_error: ${detail}`):new Error(`authentication_failed: ${detail}`)}function isGrantRejected(error2){return refreshFailure(error2).message.startsWith("authentication_failed:")}var EXPIRING_WITHIN_MS=5*6e4,NO_MANAGED_ACCOUNTS_ERROR="authentication_failed: No Anthropic Subscription accounts configured for the managed lane; run /login anthropic-subscription or set CLAUDE_CODE_OAUTH_TOKEN";async function refreshWithAnthropicOAuth(refresh,signal){let credential=await(await loadAnthropicOAuth()).refresh({type:"oauth",access:"",refresh,expires:0},signal);return{access:credential.access,refresh:credential.refresh,expires:credential.expires}}var defaultBoundary2={createStore:()=>AuthStorage.create(),env:()=>process.env,getAgentDir,now:()=>Date.now(),refresher:refreshWithAnthropicOAuth},activeBoundary2=defaultBoundary2;function authLaneRefresher(){return activeBoundary2.refresher}function resolveEffectiveLane(settings,accounts){return settings.tokenInjection??(accounts.length>0?"oauth-slots":"ambient")}async function managedPool(settings,requestEnvironment){let store=activeBoundary2.createStore(),credential=await store.read(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),environment=mergeRequestAuthEnvironment(activeBoundary2.env(),requestEnvironment),accounts=listAccounts(credential??emptyCredential(),name=>environment[name]);!credential&&accounts.length>0&&(credential=await store.modify(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,async()=>emptyCredential()),accounts=listAccounts(credential??emptyCredential(),name=>environment[name]));let configuredLane=resolveEffectiveLane(settings,accounts),lane=configuredLane==="config-dir"&&hasRequestOauthToken(requestEnvironment)?"oauth-slots":configuredLane;if(lane==="ambient")return;if(accounts.length===0)throw new Error(NO_MANAGED_ACCOUNTS_ERROR);let stored=credential?.type==="oauth"?credential:void 0;return{accounts,environment,lane,pinnedAccount:settings.pinnedAccount??stored?.pinned,...settings.pinnedAccount!==void 0?{pinSource:"settings"}:stored?.pinned!==void 0?{pinSource:"stored"}:{},...stored?.order===void 0?{}:{accountOrder:stored.order},store}}function storedAccounts(credential,pool){let stored=credential?.type==="oauth"?credential:void 0;return listAccounts(stored??emptyCredential(),key=>pool.environment[key])}function storedSlot(credential,pool,name){return storedAccounts(credential,pool).find(candidate=>candidate.name===name)}async function continueWhileStoreBusy(pool,slot2,busy){let latest=storedSlot(await pool.store.read(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),pool,slot2.name);if(latest&&latest.refresh!==slot2.refresh){Object.assign(slot2,latest);return}if(!(activeBoundary2.now()<slot2.expires))throw busy}async function prepareSlot(pool,selected,signal){let environment=pool.environment,slot2=selected;if(slot2.source!=="env"&&activeBoundary2.now()>=slot2.expires-EXPIRING_WITHIN_MS)try{let refreshed=await refreshSlot(pool.store,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,slot2.name,activeBoundary2.refresher,signal,expires=>activeBoundary2.now()>=expires-EXPIRING_WITHIN_MS),updated=storedSlot(refreshed,pool,slot2.name);if(!updated)throw new Error("selected account disappeared during refresh");Object.assign(slot2,updated)}catch(error2){if(signal.throwIfAborted(),!(error2 instanceof CredentialStoreBusyError))throw refreshFailure(error2);await continueWhileStoreBusy(pool,slot2,error2)}let access8=slot2.source==="env"?envSlotToken(name=>environment[name],slot2.name):slot2.access;if(!access8)throw new Error("authentication_failed: selected OAuth token is unavailable");let childEnvironment=stripManagedAuthEnvironment(environment),credentialDigest=createHash12("sha256").update(access8).digest("hex");if(pool.lane==="oauth-slots")return{env:{...childEnvironment,CLAUDE_CODE_OAUTH_TOKEN:access8},credentialDigest};let directory=writeConfigDirCredential(activeBoundary2.getAgentDir(),slot2,access8);return{env:{...childEnvironment,CLAUDE_CONFIG_DIR:directory},credentialDigest}}async function*queryWithAuthLane(input){let signal=input.signal??new AbortController().signal,pool=await managedPool(input.providerSettings,input.env);if(!pool){let ambientEnvironment={...mergeRequestAuthEnvironment(activeBoundary2.env(),input.env)};for(let name of Object.keys(ambientEnvironment))name.startsWith("SENPI_")&&delete ambientEnvironment[name];let askedLegacyLongContext2=!1;yield*retryAtStandardWindowOnce(async()=>{let options=input.buildOptions("ambient");return askedLegacyLongContext2=asksLegacyLongContext(options.model),options.env={...ambientEnvironment,...options.env},createAttemptMessages(input,{accountName:"ambient",accounts:[],authLane:"ambient",options})},()=>askedLegacyLongContext2);return}pool.accounts=await recoverAuthBlockedSlots({store:pool.store,providerId:ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,accounts:pool.accounts,refresher:activeBoundary2.refresher,signal,isGrantRejected,reload:async()=>storedAccounts(await pool.store.read(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),pool),isUsable:account=>!isBlockedFor(account,activeBoundary2.now(),input.model),now:activeBoundary2.now(),transientError:error2=>error2 instanceof CredentialStoreBusyError?error2:refreshFailure(error2)});let askedLegacyLongContext=!1;yield*runFailover({accounts:pool.accounts,accountFallback:input.providerSettings.accountFallback,selectFn:accounts=>selectAccount(accounts,{sessionId:input.sessionId,pinnedAccount:input.pinnedAccount??pool.pinnedAccount,...input.pinnedAccount!==void 0?{pinSource:"cli"}:pool.pinSource===void 0?{}:{pinSource:pool.pinSource},accountFallback:input.providerSettings.accountFallback,...pool.accountOrder===void 0?{}:{accountOrder:pool.accountOrder},...input.preferredAccount===void 0?{}:{preferredAccount:input.preferredAccount},now:activeBoundary2.now(),...input.model===void 0?{}:{model:input.model}}),runAttempt:async slot2=>{let options=input.buildOptions(pool.lane);askedLegacyLongContext=asksLegacyLongContext(options.model);let accounts=pool.accounts.map(account=>({...account})),prepared=await prepareSlot(pool,slot2,signal);return options.env={...prepared.env,...options.env},createAttemptMessages(input,{accountName:slot2.name,accounts,authLane:pool.lane,options,credentialDigest:prepared.credentialDigest})},classify:error2=>classifyForRequest(error2,askedLegacyLongContext),...input.sessionId===void 0?{}:{sessionKey:input.sessionId},onLongContextRefused:()=>markLongContextRefused(),store:pool.store,providerId:ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,...input.model===void 0?{}:{model:input.model},now:activeBoundary2.now,errorFromEvent:sdkFailure,isVisibleDelta:visibleSdkMessage,signal,onFailover:({account,nextAccount,classification})=>{emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),nextAccount&&emitProviderAccountFailover(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,account.name,nextAccount.name,classification.kind)}})}var allowedTransitions={ABSENT:["STARTING"],STARTING:["IDLE_SYNCED","TAINTED","CLOSING","BROKEN"],IDLE_SYNCED:["TURN_WAITING","TAINTED","CLOSING","BROKEN"],TURN_WAITING:["TURN_SENT","TAINTED","CLOSING","BROKEN"],TURN_SENT:["TURN_CLAIMED","TAINTED","CLOSING","BROKEN"],TURN_CLAIMED:["TURN_STREAMING","TAINTED","CLOSING","BROKEN"],TURN_STREAMING:["TURN_RESULT_SEEN","TAINTED","CLOSING","BROKEN"],TURN_RESULT_SEEN:["IDLE_SYNCED","TAINTED","CLOSING","BROKEN"],TAINTED:["CLOSING","BROKEN"],CLOSING:["CLOSED","BROKEN"],CLOSED:[],BROKEN:["CLOSING","CLOSED"]};function transitionSessionState(entry2,next){if(!allowedTransitions[entry2.state].includes(next))throw new Error(`Illegal session state transition: ${entry2.state} -> ${next}`);return entry2.state=next,entry2}var transitionToIdleSynced=entry2=>transitionSessionState(entry2,"IDLE_SYNCED"),transitionToTurnWaiting=entry2=>transitionSessionState(entry2,"TURN_WAITING"),transitionToTurnSent=entry2=>transitionSessionState(entry2,"TURN_SENT"),transitionToTurnClaimed=entry2=>transitionSessionState(entry2,"TURN_CLAIMED"),transitionToTurnStreaming=entry2=>transitionSessionState(entry2,"TURN_STREAMING"),transitionToTurnResultSeen=entry2=>transitionSessionState(entry2,"TURN_RESULT_SEEN");var transitionToClosing=entry2=>transitionSessionState(entry2,"CLOSING"),transitionToClosed=entry2=>transitionSessionState(entry2,"CLOSED");async function switchEntryModel(registry,senpiSessionId,modelId,sdkModel=modelId){let entry2=registry.get(senpiSessionId);return entry2?.query.setModel?(await entry2.query.setModel(sdkModel),entry2.modelId=modelId,registry.touch(entry2),!0):!1}function annotatePendingFork(registry,senpiSessionId,reason,divergedPath){let entry2=registry.get(senpiSessionId);entry2&&(entry2.pendingForkReason=reason,entry2.pendingForkDivergedPath=divergedPath??null,registry.touch(entry2))}function annotateBranchInfo(registry,senpiSessionId,info){let entry2=registry.get(senpiSessionId);entry2&&(entry2.branchInfo={...info},registry.touch(entry2))}var SessionReapScheduler=class{constructor(deps){this.scheduled=new Map,this.deps=deps}arm(senpiSessionId,generation2,delayMs=this.deps.idleTtlMs){let token=Symbol("session-reap"),handle=this.deps.scheduleTimer(()=>this.fire(senpiSessionId,generation2,token),delayMs);this.scheduled.set(senpiSessionId,{generation:generation2,token,handle}),handle.unref()}cancel(senpiSessionId,generation2){let scheduled=this.scheduled.get(senpiSessionId);!scheduled||scheduled.generation!==generation2||(scheduled.handle.cancel(),this.scheduled.delete(senpiSessionId))}fire(senpiSessionId,generation2,token){let scheduled=this.scheduled.get(senpiSessionId);if(!scheduled||scheduled.generation!==generation2||scheduled.token!==token)return;this.scheduled.delete(senpiSessionId);let candidate=this.deps.candidate(senpiSessionId,generation2);if(!candidate)return;let remaining=candidate.lastUsedAt+this.deps.idleTtlMs-this.deps.now();remaining<=0?this.deps.expire(senpiSessionId):this.arm(senpiSessionId,generation2,remaining)}};var SESSION_REGISTRY_IDLE_TTL_MS=30*6e4,SESSION_REGISTRY_MAX_ENTRIES=32,StreamingInputController=class{constructor(){this.closed=!1,this.pending=[],this.readers=[]}[Symbol.asyncIterator](){return this}next(){let message=this.pending.shift();return message?Promise.resolve({value:message,done:!1}):this.closed?Promise.resolve({value:void 0,done:!0}):new Promise(resolve55=>this.readers.push(resolve55))}push(message){if(this.closed)throw new Error("Cannot push to a closed session input controller");let reader=this.readers.shift();reader?reader({value:message,done:!1}):this.pending.push(message)}close(){if(!this.closed){this.closed=!0;for(let reader of this.readers.splice(0))reader({value:void 0,done:!0})}}},defaultSessionRegistryBoundary={now:()=>Date.now(),queryFactory:input=>getSdkBoundary().query(input),scheduleReap:(callback,delayMs)=>{let timer=setTimeout(callback,delayMs);return{cancel:()=>clearTimeout(timer),unref:()=>timer.unref()}}},activeSessionRegistryBoundary=defaultSessionRegistryBoundary;var SessionRegistryResourceLimitError=class extends Error{constructor(){super(`Anthropic Subscription session registry is at its ${SESSION_REGISTRY_MAX_ENTRIES}-entry limit with no idle session to evict`),this.code="session_registry_capacity",this.name="SessionRegistryResourceLimitError"}};function createSessionUuid(now2=Date.now()){let ts=BigInt(Math.trunc(now2)),bytes=randomBytes4(10),hex=[(ts>>40n&0xffn).toString(16).padStart(2,"0"),(ts>>32n&0xffn).toString(16).padStart(2,"0"),(ts>>24n&0xffn).toString(16).padStart(2,"0"),(ts>>16n&0xffn).toString(16).padStart(2,"0"),(ts>>8n&0xffn).toString(16).padStart(2,"0"),(ts&0xffn).toString(16).padStart(2,"0"),(112|bytes[0]&15).toString(16).padStart(2,"0"),bytes[1].toString(16).padStart(2,"0"),(128|bytes[2]&63).toString(16).padStart(2,"0"),bytes[3].toString(16).padStart(2,"0"),...Array.from(bytes.slice(4),byte=>byte.toString(16).padStart(2,"0"))].join("");return`${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20,32)}`}function evictable(entry2){return(entry2.state==="IDLE_SYNCED"||entry2.state==="TAINTED")&&entry2.activeTurn===null}var AnthropicSubscriptionSessionRegistry=class{constructor(){this.entries=new Map,this.generationCounter=0,this.reaper=new SessionReapScheduler({now:()=>activeSessionRegistryBoundary.now(),scheduleTimer:(callback,delayMs)=>activeSessionRegistryBoundary.scheduleReap(callback,delayMs),idleTtlMs:SESSION_REGISTRY_IDLE_TTL_MS,candidate:(senpiSessionId,generation2)=>{let entry2=this.entries.get(senpiSessionId);if(!(!entry2||entry2.generation!==generation2||!evictable(entry2)))return{generation:entry2.generation,lastUsedAt:entry2.lastUsedAt}},expire:senpiSessionId=>this.closeSession(senpiSessionId,"idle_ttl")})}get size(){return this.entries.size}get(senpiSessionId){return this.entries.get(senpiSessionId)}getOrCreate(input){let existing2=this.entries.get(input.senpiSessionId);if(existing2){let now3=activeSessionRegistryBoundary.now();if(!evictable(existing2)||now3-existing2.lastUsedAt<SESSION_REGISTRY_IDLE_TTL_MS)return this.touch(existing2),existing2;this.closeSession(existing2.senpiSessionId,"idle_ttl")}this.evictExpired(),this.ensureCapacity();let now2=activeSessionRegistryBoundary.now(),generation2=++this.generationCounter,sdkSessionId=input.resume?.sdkSessionId??createSessionUuid(now2),inputController=new StreamingInputController,lineageOptions=input.resume?{resume:input.resume.sdkSessionId,...input.resume.atUuid?{resumeSessionAt:input.resume.atUuid,forkSession:!0}:{}}:{sessionId:sdkSessionId},query=activeSessionRegistryBoundary.queryFactory({prompt:inputController,options:{...input.options,...lineageOptions,extraArgs:{...input.options.extraArgs,"replay-user-messages":""}}}),{resume:_resume,...entryInput}=input,target={...entryInput,sdkSessionId,sdkSessionIdConfirmed:input.resume!==void 0,generation:generation2,query,inputController,pumpTask:null,state:"STARTING",activeTurn:null,syncedPrefixHash:null,sentCount:0,assistantUuidByIndex:new Map,branchInfo:null,taintedReason:null,pendingForkReason:null,pendingForkDivergedPath:null,lastUsedAt:now2},entry2;return entry2=new Proxy(target,{set:(current,property,value)=>{if(this.entries.get(current.senpiSessionId)!==entry2)return!0;let previousTurn=current.activeTurn;return Reflect.set(current,property,value),property==="activeTurn"&&previousTurn!==value&&this.recordUse(entry2,value===null),!0}}),this.entries.set(input.senpiSessionId,entry2),entry2}touch(entry2){this.recordUse(entry2,entry2.activeTurn===null&&evictable(entry2))}closeSession(senpiSessionId,reason){let entry2=this.entries.get(senpiSessionId);if(entry2){recordPendingCloseCause(senpiSessionId,reason),this.reaper.cancel(senpiSessionId,entry2.generation),transitionToClosing(entry2),entry2.inputController.close();try{entry2.query.close()}finally{transitionToClosed(entry2),this.reaper.cancel(senpiSessionId,entry2.generation),this.entries.delete(senpiSessionId)}}}isCurrentGeneration(senpiSessionId,generation2){return this.entries.get(senpiSessionId)?.generation===generation2}evictExpired(){let now2=activeSessionRegistryBoundary.now();for(let entry2 of[...this.entries.values()])evictable(entry2)&&now2-entry2.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS&&this.closeSession(entry2.senpiSessionId,"idle_ttl")}recordUse(entry2,scheduleReap){this.entries.get(entry2.senpiSessionId)===entry2&&(entry2.lastUsedAt=activeSessionRegistryBoundary.now(),this.reaper.cancel(entry2.senpiSessionId,entry2.generation),scheduleReap&&this.reaper.arm(entry2.senpiSessionId,entry2.generation))}ensureCapacity(){if(this.entries.size<SESSION_REGISTRY_MAX_ENTRIES)return;let oldest=[...this.entries.values()].filter(evictable).sort((left,right)=>left.lastUsedAt-right.lastUsedAt)[0];if(!oldest)throw new SessionRegistryResourceLimitError;this.closeSession(oldest.senpiSessionId,"capacity")}},sessionRegistry=new AnthropicSubscriptionSessionRegistry;function getOrCreateSession(input){return sessionRegistry.getOrCreate(input)}function getSession(senpiSessionId){return sessionRegistry.get(senpiSessionId)}function closeSession(senpiSessionId,reason){sessionRegistry.closeSession(senpiSessionId,reason)}function isIdleExpired(entry2){return activeSessionRegistryBoundary.now()-entry2.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS}async function switchSessionModel(senpiSessionId,modelId,sdkModel){return switchEntryModel(sessionRegistry,senpiSessionId,modelId,sdkModel)}function recordPendingFork(senpiSessionId,reason,divergedPath){annotatePendingFork(sessionRegistry,senpiSessionId,reason,divergedPath)}function recordBranchInfo(senpiSessionId,info){annotateBranchInfo(sessionRegistry,senpiSessionId,info)}function isCurrentGeneration(senpiSessionId,generation2){return sessionRegistry.isCurrentGeneration(senpiSessionId,generation2)}var bindings=new Map;function cloneBinding(binding){return{...binding,sentHashes:[...binding.sentHashes],assistantUuidByIndex:binding.assistantUuidByIndex?.map(([index,uuid])=>[index,uuid])}}function evaluateAbortOutcome(receipt){if(!receipt||typeof receipt!="object")return"reattach";let queued=receipt.still_queued;return Array.isArray(queued)&&queued.length===0?"keep":"reattach"}function rememberBinding(binding){bindings.set(binding.senpiSessionId,cloneBinding(binding))}function getBinding(senpiSessionId){let binding=bindings.get(senpiSessionId);return binding?cloneBinding(binding):void 0}function forgetBinding(senpiSessionId){bindings.delete(senpiSessionId)}var bindingInvalidations=new Map;function rememberBindingInvalidation(senpiSessionId,reason){reason===void 0?bindingInvalidations.delete(senpiSessionId):bindingInvalidations.set(senpiSessionId,reason)}function bindingInvalidationReason(senpiSessionId){return bindingInvalidations.get(senpiSessionId)}function bindingFromEntry(entry2,sentHashes){return{senpiSessionId:entry2.senpiSessionId,sdkSessionId:entry2.sdkSessionId,sdkSessionIdConfirmed:entry2.sdkSessionIdConfirmed,sentCount:entry2.sentCount,sentHashes:[...sentHashes],lastAssistantUuid:entry2.assistantUuidByIndex.get(entry2.sentCount)??null,assistantUuidByIndex:[...entry2.assistantUuidByIndex.entries()],accountName:entry2.accountName,modelId:entry2.modelId,systemPromptHash:entry2.systemPromptHash,toolsetHash:entry2.toolsetHash}}async function verifyRestoredTranscript(binding,cwd,authLane){if(authLane==="config-dir")return!1;let messages;try{messages=await getSdkBoundary().getSessionMessages(binding.sdkSessionId,{dir:cwd})}catch(error2){if(error2 instanceof Error)return!1;throw error2}if(messages.length===0||messages.some(message=>message.session_id!==binding.sdkSessionId)||binding.lastAssistantUuid===null)return!1;let anchorIndex=messages.findIndex(message=>message.type==="assistant"&&message.uuid===binding.lastAssistantUuid&&message.parent_tool_use_id===null);if(anchorIndex<0)return!1;let orphanUserMessages=messages.slice(anchorIndex+1).filter(message=>message.type==="user"&&message.parent_tool_use_id===null).length;return orphanUserMessages>0?(logContinuityEvent("claude_sdk_oauth_restored_transcript_orphan_tail",{orphanUserMessages}),!1):!0}async function awaitInitialization(entry2,signal){let initialize=entry2.query.initializationResult;if(!initialize)return;if(!signal){await initialize.call(entry2.query);return}let rejectAborted=()=>{},aborted=new Promise((_,reject)=>{rejectAborted=reject}),onAbort=()=>{closeSession(entry2.senpiSessionId,"resume_initialization_aborted"),rejectAborted(new Error("Anthropic Subscription reattach aborted"))};signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0});try{await Promise.race([initialize.call(entry2.query),aborted])}finally{signal.removeEventListener("abort",onAbort)}}async function reattachSession(input){await loadClaudeAgentSdk();let{binding,atUuid}=input;closeSession(binding.senpiSessionId,"reattach");let entry2=getOrCreateSession({senpiSessionId:binding.senpiSessionId,accountName:binding.accountName,modelId:binding.modelId,systemPromptHash:binding.systemPromptHash,toolsetHash:binding.toolsetHash,options:input.options,resume:atUuid?{sdkSessionId:binding.sdkSessionId,atUuid}:{sdkSessionId:binding.sdkSessionId}});try{await awaitInitialization(entry2,input.signal)}catch(error2){throw closeSession(binding.senpiSessionId,"resume_initialization_failed"),error2}recordSyncedStream(entry2,binding.sentHashes);for(let[index,uuid]of binding.assistantUuidByIndex??[])entry2.assistantUuidByIndex.set(index,uuid);return binding.lastAssistantUuid&&entry2.assistantUuidByIndex.set(binding.sentCount,binding.lastAssistantUuid),rememberBinding({...binding,sdkSessionId:entry2.sdkSessionId}),entry2}var commitBoundary=new AssistantCommitBoundary;function persistBindingInvalidation(pi,sessionId,reason,divergedPath){pi.appendEntry?.(BINDING_ENTRY_TYPE,{schemaVersion:1,invalidated:!0,reason,...divergedPath===void 0?{}:{divergedPath}}),rememberBindingInvalidation(sessionId,reason)}async function invalidateBinding(pi,ctx,reason,divergedPath){let sessionId=ctx.sessionManager.getSessionId();forgetBinding(sessionId);let sessionFile=ctx.sessionManager.getSessionFile?.();sessionFile&&await deleteStoredBinding(sessionFile),persistBindingInvalidation(pi,sessionId,reason,divergedPath)}function keepBindingThenClose(sessionId,reason){let entry2=getSession(sessionId);entry2&&rememberBinding(bindingFromEntry(entry2,sentHashesForEntry(entry2)??[])),closeSession(sessionId,reason)}function residentEntryFor(sessionId,message){let entry2=getSession(sessionId);if(!(!entry2||!isResidentAssistant(message,entry2.modelId)))return entry2}function registerSessionRegistry(pi){pi.on("session_start",async(event,ctx)=>{if(event.reason==="reload")return;let sessionId=ctx.sessionManager.getSessionId();forgetBinding(sessionId),rememberBindingInvalidation(sessionId,void 0);let sessionFile=ctx.sessionManager.getSessionFile?.();if(event.reason==="new")return;if(event.reason==="fork"){sessionFile&&await deleteStoredBinding(sessionFile),persistBindingInvalidation(pi,sessionId,"fork");return}if(!sessionFile)return;let branch=ctx.sessionManager.getBranch();rememberBindingInvalidation(sessionId,invalidationReasonFromBranch(branch)),restoreColdSeedCalibration(sessionId,branch);let stored=await readStoredBinding(sessionFile);if(!stored)return;if(stored.sessionId!==sessionId){await deleteStoredBinding(sessionFile);return}let binding=bindingFromStoredBranch(branch,stored);if(!binding){await deleteStoredBinding(sessionFile);return}rememberBinding(binding)}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(recordPendingFork(ctx.sessionManager.getSessionId(),"compaction"),await invalidateBinding(pi,ctx,"compaction"))}),pi.on("session_tree",async(event,ctx)=>{event.oldLeafId===null||event.newLeafId===null||(recordBranchInfo(ctx.sessionManager.getSessionId(),{oldLeafId:event.oldLeafId,newLeafId:event.newLeafId}),await invalidateBinding(pi,ctx,"tree_changed"))}),pi.on("model_select",async(event,ctx)=>{let sessionId=ctx.sessionManager.getSessionId();if(event.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID){keepBindingThenClose(sessionId,"model_selected");return}await switchSessionModel(sessionId,event.model.id,sdkModelId(event.model))||keepBindingThenClose(sessionId,"model_selected")}),pi.on("thinking_level_select",(_event,ctx)=>{let sessionId=ctx.sessionManager.getSessionId();getSession(sessionId)?.activeTurn||keepBindingThenClose(sessionId,"thinking_level_selected")}),pi.on("message_update",(event,ctx)=>{if(event.message.role!=="assistant")return;let sessionId=ctx.sessionManager.getSessionId();residentEntryFor(sessionId,event.message)&&commitBoundary.captureProviderFinal(sessionId,event.message)}),pi.on("message_end",async(event,ctx)=>{if(event.message.role!=="assistant")return;let sessionId=ctx.sessionManager.getSessionId(),entry2=getSession(sessionId),binding=getBinding(sessionId),modelId=entry2?.modelId??binding?.modelId;if(!modelId)return;if(isTerminalFailure(event.message)){commitBoundary.forget(sessionId);return}let{outcome,divergedPath}=commitBoundary.commit(sessionId,event.message,modelId);if(outcome==="rewritten"){recordPendingFork(sessionId,"assistant_rewritten",divergedPath),await invalidateBinding(pi,ctx,"assistant_rewritten",divergedPath);return}if(outcome!=="clean")return;let sessionFile=ctx.sessionManager.getSessionFile?.();if(!sessionFile||!pi.appendEntry)return;let context=ctx.sessionManager.buildSessionContext(),hashes=sentMessageHashes(sentMessages({...context,messages:convertToLlm(context.messages)})),committedAssistantHash=assistantContentHash(event.message),recordFor=markerEntryId2=>{let anchor={sessionPath:sessionFile,sessionId,markerEntryId:markerEntryId2,assistantContentHash:committedAssistantHash};return entry2?storedBindingFromEntry(entry2,hashes,anchor):binding?storedBindingFromBinding(binding,hashes,anchor):void 0};if(!recordFor("pending"))return;pi.appendEntry(BINDING_ENTRY_TYPE,BINDING_MARKER),rememberBindingInvalidation(sessionId,void 0);let markerEntryId=ctx.sessionManager.getLeafId();if(!markerEntryId)return;let stored=recordFor(markerEntryId);stored&&await writeStoredBinding(sessionFile,stored)}),pi.on("session_shutdown",(event,ctx)=>{closeSession(ctx.sessionManager.getSessionId(),event.reason)}),pi.on("session_extensions_removed",async(_event,ctx)=>{closeSession(ctx.sessionManager.getSessionId(),"extensions_removed"),await invalidateBinding(pi,ctx,"extensions_removed")})}function schemaToZod(schema){let converted;if(schema.const!==void 0)converted=schema.const===null?external_exports.null():external_exports.literal(schema.const);else if(schema.enum&&schema.enum.length>0){let values=schema.enum.filter(value=>["string","number","boolean"].includes(typeof value));if(values.length===1)converted=external_exports.literal(values[0]);else if(values.length>1){let[first,second,...rest]=values.map(value=>external_exports.literal(value));converted=external_exports.union([first,second,...rest])}}if(converted===void 0){let variants=schema.anyOf??schema.oneOf;if(variants&&variants.length>0){let variantsConverted=variants.map(variant=>schemaToZod(variant));if(variantsConverted.length===1)converted=variantsConverted[0];else{let[first,second,...rest]=variantsConverted;converted=external_exports.union([first,second,...rest])}}else switch(Array.isArray(schema.type)?schema.type[0]:schema.type){case"string":converted=external_exports.string();break;case"number":converted=external_exports.number();break;case"integer":converted=external_exports.number().int();break;case"boolean":converted=external_exports.boolean();break;case"null":converted=external_exports.null();break;case"array":converted=external_exports.array(schema.items?schemaToZod(schema.items):external_exports.unknown());break;case"object":converted=objectToShape(schema);break;default:converted=external_exports.unknown();break}}if(converted===void 0)throw new Error("schema conversion did not produce a Zod type");return typeof schema.description=="string"?converted.describe(schema.description):converted}function objectToShape(schema){return external_exports.object(jsonSchemaToZodShape(schema))}function jsonSchemaToZodShape(schema){let object2=schema??{},properties=object2.properties??{},required=new Set(object2.required??[]),shape={};for(let[key,value]of Object.entries(properties)){let converted=schemaToZod(value);shape[key]=required.has(key)?converted:converted.optional()}return shape}async function denyCustomToolExecution(){return{content:[{type:"text",text:TOOL_EXECUTION_DENIED_MESSAGE}],isError:!0}}async function buildCustomToolServers(customTools){if(customTools.length===0)return;await loadClaudeAgentSdk();let server=getSdkBoundary().createSdkMcpServer({name:CUSTOM_TOOLS_MCP_SERVER_NAME,version:"1.0.0",tools:customTools.map(tool=>({name:tool.name,description:tool.description,inputSchema:jsonSchemaToZodShape(tool.parameters),handler:denyCustomToolExecution}))});return{[CUSTOM_TOOLS_MCP_SERVER_NAME]:server}}import{existsSync as existsSync14,readFileSync as readFileSync17}from"node:fs";import{dirname as dirname36,join as join36,relative as relative5,resolve as resolve14}from"node:path";var PROVIDER2="anthropic-subscription";function allAccountsBlockedGuidance(soonestUnblockAt3,blockReason){if(blockReason==="auth_error"){let recheck=soonestUnblockAt3!==void 0&&Number.isFinite(soonestUnblockAt3)?[` Next automatic re-check: ${new Date(soonestUnblockAt3).toISOString()}.`]:[];return[`All Claude accounts for ${PROVIDER2} are currently blocked (authentication error).`,...recheck,` /login ${PROVIDER2} - re-authenticate to refresh the blocked account`," /claude-account list - inspect account states",ACCOUNT_POOL_REFUSAL_NOTE].join(`
|
|
338
|
+
`;if(Buffer.byteLength(serialized)>MAX_RECORD_BYTES)throw new StoredBindingSizeError(Buffer.byteLength(serialized),MAX_RECORD_BYTES);let path14=bindingSidecarPath(sessionPath),temporaryPath=join34(dirname35(path14),`.${basename16(path14)}-${randomUUID7()}.tmp`);try{await writeFile4(temporaryPath,serialized,{encoding:"utf8",mode:384}),await rename2(temporaryPath,path14)}catch(error2){throw await rm6(temporaryPath,{force:!0}),error2}}async function deleteStoredBinding(sessionFile){await rm6(bindingSidecarPath(sessionFile),{force:!0})}var StoredBindingPathError=class extends Error{constructor(expected,actual){super(`Stored binding path mismatch: expected ${expected}, received ${actual}`),this.name="StoredBindingPathError"}},StoredBindingSizeError=class extends Error{constructor(actual,maximum){super(`Stored binding exceeds ${maximum} bytes: ${actual}`),this.name="StoredBindingSizeError"}};function isNotFoundError(error2){return error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT"}var loaded2,loading;function loadClaudeAgentSdk(){return loaded2?Promise.resolve(loaded2):(loading??=import("./sdk-OOLG5KXI.js").then(module=>(loaded2={query:module.query,createSdkMcpServer:module.createSdkMcpServer,getSessionMessages:module.getSessionMessages},loaded2)).finally(()=>{loading=void 0}),loading)}function loadedClaudeAgentSdk(){return loaded2}function requireLoadedSdk(member){let sdk=loadedClaudeAgentSdk();if(!sdk)throw new Error(`Claude Agent SDK was not preloaded before '${member}'. Await loadClaudeAgentSdk() on the entry path before reaching the SDK boundary.`);return sdk}var defaultSdkBoundary={query:input=>{let cwd=requireAnthropicSubscriptionCwd(input.options?.cwd);return requireLoadedSdk("query").query({...input,options:{...input.options,cwd}})},createSdkMcpServer:options=>requireLoadedSdk("createSdkMcpServer").createSdkMcpServer(options),getSessionMessages:async(sessionId,options)=>{let dir=requireAnthropicSubscriptionCwd(options?.dir);return(await loadClaudeAgentSdk()).getSessionMessages(sessionId,{...options,dir})}},activeSdkBoundary=defaultSdkBoundary;function getSdkBoundary(){return activeSdkBoundary}var SANITIZED_REASONS=new Set(["prefix_matched","registry_miss","idle_ttl","capacity","model_selected","thinking_level_selected","bound_account_token_expiring","account_changed","credential_refreshed","model_changed","toolset_changed","system_prompt_changed","assistant_stream_diverged","options_changed","history_rolled_back","assistant_rewritten","transcript_missing","cross_root_unsupported","sent_stream_diverged","branch_diverged","branch_boundary_unavailable","branch_resume","tainted_compaction","tainted_fork","tainted_abort","tainted_assistant_provenance_unverified","resume_initialization_failed","resume_initialization_aborted","resume_mode_off","query_failed","turn_attribution_failed","session_unconfirmed","abort_timeout","extensions_removed","session_shutdown","timeout_retry","other"]),cachedLogger;function sessionLogger(){return cachedLogger??=createSessionLogger(getAgentDir()),cachedLogger}var defaultBoundary={emit:()=>{},log:(event,data)=>sessionLogger().info(event,data)},activeBoundary=defaultBoundary;function logContinuityEvent(event,data){activeBoundary.log(event,data)}function sanitizeReason(value){let text3=typeof value=="string"?value:value instanceof Error?value.message:"";if(SANITIZED_REASONS.has(text3))return text3;let tainted=/^tainted:(.+)$/.exec(text3);if(tainted){let mapped=`tainted_${tainted[1]}`;if(SANITIZED_REASONS.has(mapped))return mapped}return sanitizeCloseCause(value)}function sanitizeCloseCause(value){let text3=typeof value=="string"?value:value instanceof Error?value.message:"";return SANITIZED_REASONS.has(text3)?text3:/did not terminate|interrupt failed/i.test(text3)?"abort_timeout":/user_message_uuid did not match|result arrived before replay claim|pre-replay buffer overflow/i.test(text3)?"turn_attribution_failed":/query ended before|Claude SDK OAuth query|Anthropic Subscription query|Claude Code/i.test(text3)?"query_failed":"other"}function sanitizeTerminalFailure(value){let cause=sanitizeCloseCause(value);return cause!=="other"?cause:value instanceof Error?"query_failed":"other"}var pendingCloseCauses=new Map,PENDING_CLOSE_CAUSE_LIMIT=256;function recordPendingCloseCause(senpiSessionId,reason){let cause=sanitizeReason(reason);if(pendingCloseCauses.delete(senpiSessionId),pendingCloseCauses.size>=PENDING_CLOSE_CAUSE_LIMIT){let oldest=pendingCloseCauses.keys().next().value;oldest!==void 0&&pendingCloseCauses.delete(oldest)}pendingCloseCauses.set(senpiSessionId,cause),activeBoundary.log("claude_sdk_oauth_session_close",{reason:cause,sessionId:senpiSessionId})}function peekPendingCloseCause(senpiSessionId){return pendingCloseCauses.get(senpiSessionId)}function consumePendingCloseCause(senpiSessionId){let cause=pendingCloseCauses.get(senpiSessionId);return pendingCloseCauses.delete(senpiSessionId),cause}function observeSessionSyncDecision(input){let diverged=input.divergedPath===void 0?{}:{divergedPath:input.divergedPath};if(input.kind==="incremental")return{kind:"delta",reason:"prefix_matched",deltaMessages:input.deltaMessages};if(input.kind==="resume")return{kind:"fork",reason:(input.reason==="registry_miss"?consumePendingCloseCause(input.senpiSessionId):void 0)??(input.reason===void 0?"branch_resume":sanitizeReason(input.reason)),deltaMessages:input.deltaMessages,...diverged};let reason=(input.reason==="registry_miss"?peekPendingCloseCause(input.senpiSessionId):void 0)??sanitizeReason(input.reason);return{kind:input.firstTurn&&reason==="registry_miss"?"bootstrap":"flatten",reason,deltaMessages:input.deltaMessages,...input.payloadBytes!==void 0?{payloadBytes:input.payloadBytes}:{},...input.collapsedDirectives!==void 0?{collapsedDirectives:input.collapsedDirectives}:{},...diverged}}function stageContinuityDecision(observation,sessionId,onDecision,beforeEmit){let emitted=!1;return{observation,emit:()=>{emitted||(emitted=!0,beforeEmit?.(),emitContinuityObservation(observation,sessionId,onDecision))}}}function emitContinuityObservation(observation,sessionId,onDecision){onDecision?.(observation),activeBoundary.emit(observation),activeBoundary.log("claude_sdk_oauth_session_continuity",{kind:observation.kind,reason:observation.reason,...observation.deltaMessages===void 0?{}:{count:observation.deltaMessages},...observation.settingSource===void 0?{}:{settingSource:observation.settingSource},...observation.seat===void 0?{}:{seat:observation.seat},...observation.seatChanged===void 0?{}:{seatChanged:observation.seatChanged},...observation.divergedPath===void 0?{}:{divergedPath:observation.divergedPath},...sessionId===void 0?{}:{sessionId}})}import{randomBytes as randomBytes4}from"node:crypto";import{createHash as createHash12}from"node:crypto";async function*retainedAttemptMessages(attempt2){let retained=!1;try{for await(let event of attempt2.messages)yield event;retained=!0}finally{retained||attempt2.discard()}}async function*closingQueryMessages(query){try{for await(let message of query)yield message}finally{query.close()}}async function createAttemptMessages(input,auth){if(auth.options.env={...auth.options.env,CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1"},typeof auth.options.settings!="string"&&(auth.options.settings={...auth.options.settings,autoMemoryEnabled:!1}),input.createAttempt)return recordingLimitWindows(retainedAttemptMessages(await input.createAttempt(auth)),auth);let query=input.query({prompt:input.prompt,options:auth.options});return input.onQuery?.(query),recordingLimitWindows(closingQueryMessages(query),auth)}async function*recordingLimitWindows(messages,auth){for await(let message of messages)message.type==="rate_limit_event"&&subscriptionLimits.record(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,auth.accountName,claudeWindowsFromSdkEvent(message)),yield message}function isAuthBlockRecoverable(slot2){return slot2.blockReason==="auth_error"&&slot2.source!=="env"&&slot2.refresh!==""&&slot2.authRecoveryGrant!==authGrantDigest(slot2.refresh)}function recovered(slot2,refreshed){let{blockReason:_blockReason,blockedUntil:_blockedUntil,...unblocked}=slot2;return{...unblocked,access:refreshed.access,refresh:refreshed.refresh,expires:refreshed.expires,authRecoveryGrant:authGrantDigest(refreshed.refresh)}}async function recoverSlot(input,name){await input.store.modify(input.providerId,async current=>{if(current?.type!=="oauth")return current;let credential=current,stored=credential.accounts?.find(slot2=>slot2.name===name);if(!stored||!isAuthBlockRecoverable(stored))return current;let next;try{next=recovered(stored,await input.refresher(stored.refresh,input.signal))}catch(error2){if(input.signal.throwIfAborted(),!input.isGrantRejected(error2))throw error2;next={...stored,authRecoveryGrant:authGrantDigest(stored.refresh)}}return{...credential,accounts:(credential.accounts??[]).map(slot2=>slot2.name===name?next:slot2)}})}function isProbeDue(slot2,now2){return slot2.blockedUntil===void 0||slot2.blockedUntil<=now2}async function recoverAuthBlockedSlots(input){let recoverable=input.accounts.filter(isAuthBlockRecoverable),candidates=input.accounts.some(input.isUsable)?recoverable.filter(slot2=>isProbeDue(slot2,input.now)):recoverable;if(candidates.length===0)return[...input.accounts];let transientFailure;for(let candidate of candidates)try{await recoverSlot(input,candidate.name)}catch(error2){input.signal.throwIfAborted(),transientFailure=error2}let accounts=await input.reload();if(transientFailure!==void 0&&!accounts.some(input.isUsable))throw input.transientError(transientFailure);return accounts}function isClaudeOauthTokenName(name){return name==="CLAUDE_CODE_OAUTH_TOKEN"||/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)}function hasRequestOauthToken(requestEnvironment){return Object.entries(requestEnvironment??{}).some(([name,value])=>isClaudeOauthTokenName(name)&&!!value)}function mergeRequestAuthEnvironment(hostEnvironment,requestEnvironment){let environment={...hostEnvironment},requestTokens=Object.entries(requestEnvironment??{}).filter(([name])=>isClaudeOauthTokenName(name));if(requestTokens.length===0)return environment;for(let name of Object.keys(environment))isClaudeOauthTokenName(name)&&delete environment[name];for(let[name,value]of requestTokens)environment[name]=value;return environment}function stripManagedAuthEnvironment(parent){let{ANTHROPIC_API_KEY:_apiKey,ANTHROPIC_AUTH_TOKEN:_authToken,ANTHROPIC_BASE_URL:_gateway,ANTHROPIC_CUSTOM_HEADERS:_customHeaders,CLAUDE_CODE_OAUTH_TOKEN:_oauthToken,CLAUDE_CODE_USE_BEDROCK:_bedrock,CLAUDE_CODE_USE_FOUNDRY:_foundry,CLAUDE_CODE_USE_GATEWAY:_gatewayMode,CLAUDE_CODE_USE_VERTEX:_vertex,...environment}=parent;for(let name of Object.keys(environment))/^CLAUDE_CODE_OAUTH_TOKEN_\d+$/.test(name)&&delete environment[name],name.startsWith("SENPI_")&&delete environment[name];return environment}import{chmodSync as chmodSync4,cpSync,existsSync as existsSync13,mkdirSync as mkdirSync9,renameSync as renameSync7,rmSync as rmSync4,writeFileSync as writeFileSync9}from"node:fs";import{join as join35}from"node:path";var LEGACY_ACCOUNTS_DIR="claude-sdk-oauth-accounts",ACCOUNTS_DIR="anthropic-subscription-accounts";function resolveAccountsDirectory(agentDir){let legacy=join35(agentDir,LEGACY_ACCOUNTS_DIR),target=join35(agentDir,ACCOUNTS_DIR);if(!existsSync13(legacy))return target;if(existsSync13(target)){try{renameSync7(legacy,`${legacy}.${Date.now()}.bak`)}catch{}return target}try{return renameSync7(legacy,target),target}catch{try{return cpSync(legacy,target,{recursive:!0}),rmSync4(legacy,{recursive:!0,force:!0}),target}catch{try{rmSync4(target,{recursive:!0,force:!0})}catch{}return legacy}}}var CLI_OAUTH_SCOPES=["org:create_api_key","user:profile","user:inference","user:sessions:claude_code","user:mcp_servers","user:file_upload"];function writeConfigDirCredential(agentDir,slot2,access8){assertValidAccountName(slot2.name);let directory=join35(resolveAccountsDirectory(agentDir),slot2.name);return mkdirSync9(directory,{recursive:!0,mode:448}),chmodSync4(directory,448),writeFileSync9(join35(directory,".credentials.json"),JSON.stringify({claudeAiOauth:{accessToken:access8,refreshToken:slot2.refresh,expiresAt:slot2.expires,scopes:CLI_OAUTH_SCOPES}}),{encoding:"utf8",mode:384}),directory}var SDK_ERROR_CLASSIFICATIONS={authentication_failed:{kind:"auth_error",retryable:!0},oauth_org_not_allowed:{kind:"org_not_allowed",retryable:!0},billing_error:{kind:"billing",retryable:!0},rate_limit:{kind:"rate_limit",retryable:!0},overloaded:{kind:"overloaded",retryable:!0},invalid_request:{kind:"other",retryable:!1},server_error:{kind:"other",retryable:!0},account_on_hold:{kind:"billing",retryable:!0},model_not_found:{kind:"other",retryable:!1},max_output_tokens:{kind:"other",retryable:!1}},OTHER_ERROR={kind:"other",retryable:!1};function record2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)?value:void 0}function errorText2(error2){if(typeof error2=="string")return error2;if(error2 instanceof Error)return error2.message;let value=record2(error2);if(!value)return String(error2);let message=value.message;if(typeof message=="string")return message;let code=value.error;return typeof code=="string"?code:String(error2)}var SdkResultFailure=class extends Error{constructor(message,usage3){super(message),this.name="SdkResultFailure",this.usage=usage3}};function sdkResultFailureUsage(error2){if(error2 instanceof SdkResultFailure)return error2.usage;let wrapped=record2(error2)?.original;return wrapped instanceof SdkResultFailure?wrapped.usage:void 0}function sdkResultFailure(message){if(message.subtype==="success"&&message.is_error!==!0)return;let firstError=("errors"in message&&Array.isArray(message.errors)?message.errors:[]).find(error2=>typeof error2=="string"&&error2.length>0),resultText="result"in message&&typeof message.result=="string"?message.result.trim():"",detail=firstError??(message.is_error===!0&&resultText?resultText:void 0)??`Claude Code ${message.subtype}`,status="api_error_status"in message&&message.api_error_status!=null?`HTTP ${message.api_error_status}`:"",reason="terminal_reason"in message&&typeof message.terminal_reason=="string"?message.terminal_reason:"",suffix=[status,reason].filter(Boolean).join(", ");return new SdkResultFailure(suffix?`${detail} (${suffix})`:detail,message.usage)}function sdkAssistantFailure(message){if(!message.error)return;let content=message.message.content,text3=(typeof content=="string"?content:content.filter(block=>block.type==="text"&&"text"in block&&typeof block.text=="string").map(block=>"text"in block&&typeof block.text=="string"?block.text:"").join(" ")).trim();return new Error(text3?message.error==="unknown"?text3:`${text3} (${message.error})`:message.error)}function classifySdkError(error2){let classification=classifyErrorKind(error2);if(classification.kind!=="rate_limit")return classification;let modelFamily=rateLimitModelFamily(errorText2(error2));return modelFamily===void 0?classification:{...classification,modelFamily}}function classifyErrorKind(error2){let text3=errorText2(error2).toLowerCase();if(/\b(?:extra usage|usage credits) (?:is|are) required for long context\b/.test(text3))return{kind:"long_context_unavailable",retryable:!0};if(/\b(enotfound|eai_again|econnreset|econnrefused|etimedout|enetunreach|ehostunreach|und_err_connect_timeout|und_err_socket)\b|fetch failed|socket hang up|connection reset by peer/.test(text3))return{kind:"other",retryable:!0};for(let[code,classification]of Object.entries(SDK_ERROR_CLASSIFICATIONS))if(new RegExp(`\\b${code}\\b`).test(text3))return classification??OTHER_ERROR;return/\b(?:http\s*)?429\b|too many requests|rate[ _-]?limit/.test(text3)?{kind:"rate_limit",retryable:!0}:/\bblocking_limit\b|\brapid_refill_breaker\b/.test(text3)?{kind:"rate_limit",retryable:!0}:/\b(?:hit|reached|exceeded)\b[^.]*\blimit\b|\b(?:weekly|daily|hourly|usage)\s+limit\b/.test(text3)?{kind:"rate_limit",retryable:!0}:/\b(?:http\s*)?529\b|overloaded/.test(text3)?{kind:"overloaded",retryable:!0}:/\bhttp\s*(?:408|5\d\d)\b/.test(text3)?{kind:"other",retryable:!0}:/\binvalid_grant\b|\binvalid_token\b|\b(?:http\s*)?401\b|\bunauthorized\b/.test(text3)?{kind:"auth_error",retryable:!0}:/\brequires usage credits\b|\/usage-credits\b|\bcredits_required\b/.test(text3)?{kind:"entitlement",retryable:!1}:OTHER_ERROR}var ClaudeSdkRefusalError=class extends Error{constructor(content,category){super(`Claude refused this request${category?` (${category})`:""}: ${content}`),this.name="ClaudeSdkRefusalError",this.category=category}};function refusalDetails(message){if(message.type==="system"&&message.subtype==="model_refusal_no_fallback")return{content:message.api_refusal_explanation??message.content,...message.api_refusal_category?{category:message.api_refusal_category}:{}};if(message.type!=="assistant")return;let assistantMessage=message.message;if(assistantMessage.stop_reason!=="refusal")return;let content=assistantMessage.stop_details?.explanation??"The request was blocked by policy.",category=assistantMessage.stop_details?.category??void 0;return{content,...category?{category}:{}}}function refusalError(message){let details=refusalDetails(message);return details?new ClaudeSdkRefusalError(details.content,details.category):void 0}function sdkFailure(message){let refusal=refusalError(message);if(refusal)return refusal;if(message.type==="assistant")return sdkAssistantFailure(message);if(message.type==="result")return sdkResultFailure(message)}function visibleSdkMessage(message){return message.type!=="stream_event"?!1:/^(?:content_block_start|content_block_delta|content_block_stop)$/.test(message.event.type)}function classifyForRequest(error2,askedLegacyLongContext){let classification=classifySdkError(error2);return classification.kind==="long_context_unavailable"&&!askedLegacyLongContext?{kind:"other",retryable:!1}:classification}async function*retryAtStandardWindowOnce(attempt2,askedLegacyLongContext){let first=(await attempt2())[Symbol.asyncIterator](),refused2=!1,finished=!1;try{let visible=!1;for(;;){let next=await first.next();if(next.done){finished=!0;return}let failure2=visible?void 0:sdkFailure(next.value);if(failure2!==void 0&&classifyForRequest(failure2,askedLegacyLongContext()).kind==="long_context_unavailable"){refused2=!0;break}visible||=visibleSdkMessage(next.value),yield next.value}}finally{if(!finished)try{await first.return?.()}catch{}}refused2&&(markLongContextRefused(),yield*await attempt2())}var TRANSIENT_REFRESH_FAILURE=/\bstatus=5\d\d\b|\bTimeoutError\b/;function refreshFailure(error2){let detail=error2 instanceof Error?error2.message:String(error2),classification=classifySdkError(detail);return classification.kind==="rate_limit"||classification.kind==="overloaded"?new Error(detail):classification.kind==="other"&&classification.retryable||TRANSIENT_REFRESH_FAILURE.test(detail)?new Error(`server_error: ${detail}`):new Error(`authentication_failed: ${detail}`)}function isGrantRejected(error2){return refreshFailure(error2).message.startsWith("authentication_failed:")}var EXPIRING_WITHIN_MS=5*6e4,NO_MANAGED_ACCOUNTS_ERROR="authentication_failed: No Anthropic Subscription accounts configured for the managed lane; run /login anthropic-subscription or set CLAUDE_CODE_OAUTH_TOKEN";async function refreshWithAnthropicOAuth(refresh,signal){let credential=await(await loadAnthropicOAuth()).refresh({type:"oauth",access:"",refresh,expires:0},signal);return{access:credential.access,refresh:credential.refresh,expires:credential.expires}}var defaultBoundary2={createStore:()=>AuthStorage.create(),env:()=>process.env,getAgentDir,now:()=>Date.now(),refresher:refreshWithAnthropicOAuth},activeBoundary2=defaultBoundary2;function authLaneRefresher(){return activeBoundary2.refresher}function resolveEffectiveLane(settings,accounts){return settings.tokenInjection??(accounts.length>0?"oauth-slots":"ambient")}async function managedPool(settings,requestEnvironment){let store=activeBoundary2.createStore(),credential=await store.read(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),environment=mergeRequestAuthEnvironment(activeBoundary2.env(),requestEnvironment),accounts=listAccounts(credential??emptyCredential(),name=>environment[name]);!credential&&accounts.length>0&&(credential=await store.modify(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,async()=>emptyCredential()),accounts=listAccounts(credential??emptyCredential(),name=>environment[name]));let configuredLane=resolveEffectiveLane(settings,accounts),lane=configuredLane==="config-dir"&&hasRequestOauthToken(requestEnvironment)?"oauth-slots":configuredLane;if(lane==="ambient")return;if(accounts.length===0)throw new Error(NO_MANAGED_ACCOUNTS_ERROR);let stored=credential?.type==="oauth"?credential:void 0;return{accounts,environment,lane,pinnedAccount:settings.pinnedAccount??stored?.pinned,...settings.pinnedAccount!==void 0?{pinSource:"settings"}:stored?.pinned!==void 0?{pinSource:"stored"}:{},...stored?.order===void 0?{}:{accountOrder:stored.order},store}}function storedAccounts(credential,pool){let stored=credential?.type==="oauth"?credential:void 0;return listAccounts(stored??emptyCredential(),key=>pool.environment[key])}function storedSlot(credential,pool,name){return storedAccounts(credential,pool).find(candidate=>candidate.name===name)}async function continueWhileStoreBusy(pool,slot2,busy){let latest=storedSlot(await pool.store.read(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),pool,slot2.name);if(latest&&latest.refresh!==slot2.refresh){Object.assign(slot2,latest);return}if(!(activeBoundary2.now()<slot2.expires))throw busy}async function prepareSlot(pool,selected,signal){let environment=pool.environment,slot2=selected;if(slot2.source!=="env"&&activeBoundary2.now()>=slot2.expires-EXPIRING_WITHIN_MS)try{let refreshed=await refreshSlot(pool.store,ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,slot2.name,activeBoundary2.refresher,signal,expires=>activeBoundary2.now()>=expires-EXPIRING_WITHIN_MS),updated=storedSlot(refreshed,pool,slot2.name);if(!updated)throw new Error("selected account disappeared during refresh");Object.assign(slot2,updated)}catch(error2){if(signal.throwIfAborted(),!(error2 instanceof CredentialStoreBusyError))throw refreshFailure(error2);await continueWhileStoreBusy(pool,slot2,error2)}let access8=slot2.source==="env"?envSlotToken(name=>environment[name],slot2.name):slot2.access;if(!access8)throw new Error("authentication_failed: selected OAuth token is unavailable");let childEnvironment=stripManagedAuthEnvironment(environment),credentialDigest=createHash12("sha256").update(access8).digest("hex");if(pool.lane==="oauth-slots")return{env:{...childEnvironment,CLAUDE_CODE_OAUTH_TOKEN:access8},credentialDigest};let directory=writeConfigDirCredential(activeBoundary2.getAgentDir(),slot2,access8);return{env:{...childEnvironment,CLAUDE_CONFIG_DIR:directory},credentialDigest}}async function*queryWithAuthLane(input){let signal=input.signal??new AbortController().signal,pool=await managedPool(input.providerSettings,input.env);if(!pool){let ambientEnvironment={...mergeRequestAuthEnvironment(activeBoundary2.env(),input.env)};for(let name of Object.keys(ambientEnvironment))name.startsWith("SENPI_")&&delete ambientEnvironment[name];let askedLegacyLongContext2=!1;yield*retryAtStandardWindowOnce(async()=>{let options=input.buildOptions("ambient");return askedLegacyLongContext2=asksLegacyLongContext(options.model),options.env={...ambientEnvironment,...options.env},createAttemptMessages(input,{accountName:"ambient",accounts:[],authLane:"ambient",options})},()=>askedLegacyLongContext2);return}pool.accounts=await recoverAuthBlockedSlots({store:pool.store,providerId:ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,accounts:pool.accounts,refresher:activeBoundary2.refresher,signal,isGrantRejected,reload:async()=>storedAccounts(await pool.store.read(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),pool),isUsable:account=>!isBlockedFor(account,activeBoundary2.now(),input.model),now:activeBoundary2.now(),transientError:error2=>error2 instanceof CredentialStoreBusyError?error2:refreshFailure(error2)});let askedLegacyLongContext=!1;yield*runFailover({accounts:pool.accounts,accountFallback:input.providerSettings.accountFallback,selectFn:accounts=>selectAccount(accounts,{sessionId:input.sessionId,pinnedAccount:input.pinnedAccount??pool.pinnedAccount,...input.pinnedAccount!==void 0?{pinSource:"cli"}:pool.pinSource===void 0?{}:{pinSource:pool.pinSource},accountFallback:input.providerSettings.accountFallback,...pool.accountOrder===void 0?{}:{accountOrder:pool.accountOrder},...input.preferredAccount===void 0?{}:{preferredAccount:input.preferredAccount},now:activeBoundary2.now(),...input.model===void 0?{}:{model:input.model}}),runAttempt:async slot2=>{let options=input.buildOptions(pool.lane);askedLegacyLongContext=asksLegacyLongContext(options.model);let accounts=pool.accounts.map(account=>({...account})),prepared=await prepareSlot(pool,slot2,signal);return options.env={...prepared.env,...options.env},createAttemptMessages(input,{accountName:slot2.name,accounts,authLane:pool.lane,options,credentialDigest:prepared.credentialDigest})},classify:error2=>classifyForRequest(error2,askedLegacyLongContext),...input.sessionId===void 0?{}:{sessionKey:input.sessionId},onLongContextRefused:()=>markLongContextRefused(),store:pool.store,providerId:ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,...input.model===void 0?{}:{model:input.model},now:activeBoundary2.now,errorFromEvent:sdkFailure,isVisibleDelta:visibleSdkMessage,signal,onFailover:({account,nextAccount,classification})=>{emitProviderAccountsChanged(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID),nextAccount&&emitProviderAccountFailover(ANTHROPIC_SUBSCRIPTION_PROVIDER_ID,account.name,nextAccount.name,classification.kind)}})}var allowedTransitions={ABSENT:["STARTING"],STARTING:["IDLE_SYNCED","TAINTED","CLOSING","BROKEN"],IDLE_SYNCED:["TURN_WAITING","TAINTED","CLOSING","BROKEN"],TURN_WAITING:["TURN_SENT","TAINTED","CLOSING","BROKEN"],TURN_SENT:["TURN_CLAIMED","TAINTED","CLOSING","BROKEN"],TURN_CLAIMED:["TURN_STREAMING","TAINTED","CLOSING","BROKEN"],TURN_STREAMING:["TURN_RESULT_SEEN","TAINTED","CLOSING","BROKEN"],TURN_RESULT_SEEN:["IDLE_SYNCED","TAINTED","CLOSING","BROKEN"],TAINTED:["CLOSING","BROKEN"],CLOSING:["CLOSED","BROKEN"],CLOSED:[],BROKEN:["CLOSING","CLOSED"]};function transitionSessionState(entry2,next){if(!allowedTransitions[entry2.state].includes(next))throw new Error(`Illegal session state transition: ${entry2.state} -> ${next}`);return entry2.state=next,entry2}var transitionToIdleSynced=entry2=>transitionSessionState(entry2,"IDLE_SYNCED"),transitionToTurnWaiting=entry2=>transitionSessionState(entry2,"TURN_WAITING"),transitionToTurnSent=entry2=>transitionSessionState(entry2,"TURN_SENT"),transitionToTurnClaimed=entry2=>transitionSessionState(entry2,"TURN_CLAIMED"),transitionToTurnStreaming=entry2=>transitionSessionState(entry2,"TURN_STREAMING"),transitionToTurnResultSeen=entry2=>transitionSessionState(entry2,"TURN_RESULT_SEEN");var transitionToClosing=entry2=>transitionSessionState(entry2,"CLOSING"),transitionToClosed=entry2=>transitionSessionState(entry2,"CLOSED");async function switchEntryModel(registry,senpiSessionId,modelId,sdkModel=modelId){let entry2=registry.get(senpiSessionId);return entry2?.query.setModel?(await entry2.query.setModel(sdkModel),entry2.modelId=modelId,registry.touch(entry2),!0):!1}function annotatePendingFork(registry,senpiSessionId,reason,divergedPath){let entry2=registry.get(senpiSessionId);entry2&&(entry2.pendingForkReason=reason,entry2.pendingForkDivergedPath=divergedPath??null,registry.touch(entry2))}function annotateBranchInfo(registry,senpiSessionId,info){let entry2=registry.get(senpiSessionId);entry2&&(entry2.branchInfo={...info},registry.touch(entry2))}var SessionReapScheduler=class{constructor(deps){this.scheduled=new Map,this.deps=deps}arm(senpiSessionId,generation2,delayMs=this.deps.idleTtlMs){let token=Symbol("session-reap"),handle=this.deps.scheduleTimer(()=>this.fire(senpiSessionId,generation2,token),delayMs);this.scheduled.set(senpiSessionId,{generation:generation2,token,handle}),handle.unref()}cancel(senpiSessionId,generation2){let scheduled=this.scheduled.get(senpiSessionId);!scheduled||scheduled.generation!==generation2||(scheduled.handle.cancel(),this.scheduled.delete(senpiSessionId))}fire(senpiSessionId,generation2,token){let scheduled=this.scheduled.get(senpiSessionId);if(!scheduled||scheduled.generation!==generation2||scheduled.token!==token)return;this.scheduled.delete(senpiSessionId);let candidate=this.deps.candidate(senpiSessionId,generation2);if(!candidate)return;let remaining=candidate.lastUsedAt+this.deps.idleTtlMs-this.deps.now();remaining<=0?this.deps.expire(senpiSessionId):this.arm(senpiSessionId,generation2,remaining)}};var SESSION_REGISTRY_IDLE_TTL_MS=30*6e4,SESSION_REGISTRY_MAX_ENTRIES=32,StreamingInputController=class{constructor(){this.closed=!1,this.pending=[],this.readers=[]}[Symbol.asyncIterator](){return this}next(){let message=this.pending.shift();return message?Promise.resolve({value:message,done:!1}):this.closed?Promise.resolve({value:void 0,done:!0}):new Promise(resolve55=>this.readers.push(resolve55))}push(message){if(this.closed)throw new Error("Cannot push to a closed session input controller");let reader=this.readers.shift();reader?reader({value:message,done:!1}):this.pending.push(message)}close(){if(!this.closed){this.closed=!0;for(let reader of this.readers.splice(0))reader({value:void 0,done:!0})}}},defaultSessionRegistryBoundary={now:()=>Date.now(),queryFactory:input=>getSdkBoundary().query(input),scheduleReap:(callback,delayMs)=>{let timer=setTimeout(callback,delayMs);return{cancel:()=>clearTimeout(timer),unref:()=>timer.unref()}}},activeSessionRegistryBoundary=defaultSessionRegistryBoundary;var SessionRegistryResourceLimitError=class extends Error{constructor(){super(`Anthropic Subscription session registry is at its ${SESSION_REGISTRY_MAX_ENTRIES}-entry limit with no idle session to evict`),this.code="session_registry_capacity",this.name="SessionRegistryResourceLimitError"}};function createSessionUuid(now2=Date.now()){let ts=BigInt(Math.trunc(now2)),bytes=randomBytes4(10),hex=[(ts>>40n&0xffn).toString(16).padStart(2,"0"),(ts>>32n&0xffn).toString(16).padStart(2,"0"),(ts>>24n&0xffn).toString(16).padStart(2,"0"),(ts>>16n&0xffn).toString(16).padStart(2,"0"),(ts>>8n&0xffn).toString(16).padStart(2,"0"),(ts&0xffn).toString(16).padStart(2,"0"),(112|bytes[0]&15).toString(16).padStart(2,"0"),bytes[1].toString(16).padStart(2,"0"),(128|bytes[2]&63).toString(16).padStart(2,"0"),bytes[3].toString(16).padStart(2,"0"),...Array.from(bytes.slice(4),byte=>byte.toString(16).padStart(2,"0"))].join("");return`${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20,32)}`}function evictable(entry2){return(entry2.state==="IDLE_SYNCED"||entry2.state==="TAINTED")&&entry2.activeTurn===null}var AnthropicSubscriptionSessionRegistry=class{constructor(){this.entries=new Map,this.generationCounter=0,this.reaper=new SessionReapScheduler({now:()=>activeSessionRegistryBoundary.now(),scheduleTimer:(callback,delayMs)=>activeSessionRegistryBoundary.scheduleReap(callback,delayMs),idleTtlMs:SESSION_REGISTRY_IDLE_TTL_MS,candidate:(senpiSessionId,generation2)=>{let entry2=this.entries.get(senpiSessionId);if(!(!entry2||entry2.generation!==generation2||!evictable(entry2)))return{generation:entry2.generation,lastUsedAt:entry2.lastUsedAt}},expire:senpiSessionId=>this.closeSession(senpiSessionId,"idle_ttl")})}get size(){return this.entries.size}get(senpiSessionId){return this.entries.get(senpiSessionId)}getOrCreate(input){let existing2=this.entries.get(input.senpiSessionId);if(existing2){let now3=activeSessionRegistryBoundary.now();if(!evictable(existing2)||now3-existing2.lastUsedAt<SESSION_REGISTRY_IDLE_TTL_MS)return this.touch(existing2),existing2;this.closeSession(existing2.senpiSessionId,"idle_ttl")}this.evictExpired(),this.ensureCapacity();let now2=activeSessionRegistryBoundary.now(),generation2=++this.generationCounter,sdkSessionId=input.resume?.sdkSessionId??createSessionUuid(now2),inputController=new StreamingInputController,lineageOptions=input.resume?{resume:input.resume.sdkSessionId,...input.resume.atUuid?{resumeSessionAt:input.resume.atUuid,forkSession:!0}:{}}:{sessionId:sdkSessionId},query=activeSessionRegistryBoundary.queryFactory({prompt:inputController,options:{...input.options,...lineageOptions,extraArgs:{...input.options.extraArgs,"replay-user-messages":""}}}),{resume:_resume,...entryInput}=input,target={...entryInput,sdkSessionId,sdkSessionIdConfirmed:input.resume!==void 0,generation:generation2,query,inputController,pumpTask:null,state:"STARTING",activeTurn:null,syncedPrefixHash:null,sentCount:0,assistantUuidByIndex:new Map,branchInfo:null,taintedReason:null,pendingForkReason:null,pendingForkDivergedPath:null,lastUsedAt:now2},entry2;return entry2=new Proxy(target,{set:(current,property,value)=>{if(this.entries.get(current.senpiSessionId)!==entry2)return!0;let previousTurn=current.activeTurn;return Reflect.set(current,property,value),property==="activeTurn"&&previousTurn!==value&&this.recordUse(entry2,value===null),!0}}),this.entries.set(input.senpiSessionId,entry2),entry2}touch(entry2){this.recordUse(entry2,entry2.activeTurn===null&&evictable(entry2))}closeSession(senpiSessionId,reason){let entry2=this.entries.get(senpiSessionId);if(entry2){recordPendingCloseCause(senpiSessionId,reason),this.reaper.cancel(senpiSessionId,entry2.generation),transitionToClosing(entry2),entry2.inputController.close();try{entry2.query.close()}finally{transitionToClosed(entry2),this.reaper.cancel(senpiSessionId,entry2.generation),this.entries.delete(senpiSessionId)}}}isCurrentGeneration(senpiSessionId,generation2){return this.entries.get(senpiSessionId)?.generation===generation2}evictExpired(){let now2=activeSessionRegistryBoundary.now();for(let entry2 of[...this.entries.values()])evictable(entry2)&&now2-entry2.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS&&this.closeSession(entry2.senpiSessionId,"idle_ttl")}recordUse(entry2,scheduleReap){this.entries.get(entry2.senpiSessionId)===entry2&&(entry2.lastUsedAt=activeSessionRegistryBoundary.now(),this.reaper.cancel(entry2.senpiSessionId,entry2.generation),scheduleReap&&this.reaper.arm(entry2.senpiSessionId,entry2.generation))}ensureCapacity(){if(this.entries.size<SESSION_REGISTRY_MAX_ENTRIES)return;let oldest=[...this.entries.values()].filter(evictable).sort((left,right)=>left.lastUsedAt-right.lastUsedAt)[0];if(!oldest)throw new SessionRegistryResourceLimitError;this.closeSession(oldest.senpiSessionId,"capacity")}},sessionRegistry=new AnthropicSubscriptionSessionRegistry;function getOrCreateSession(input){return sessionRegistry.getOrCreate(input)}function getSession(senpiSessionId){return sessionRegistry.get(senpiSessionId)}function closeSession(senpiSessionId,reason){sessionRegistry.closeSession(senpiSessionId,reason)}function isIdleExpired(entry2){return activeSessionRegistryBoundary.now()-entry2.lastUsedAt>=SESSION_REGISTRY_IDLE_TTL_MS}async function switchSessionModel(senpiSessionId,modelId,sdkModel){return switchEntryModel(sessionRegistry,senpiSessionId,modelId,sdkModel)}function recordPendingFork(senpiSessionId,reason,divergedPath){annotatePendingFork(sessionRegistry,senpiSessionId,reason,divergedPath)}function recordBranchInfo(senpiSessionId,info){annotateBranchInfo(sessionRegistry,senpiSessionId,info)}function isCurrentGeneration(senpiSessionId,generation2){return sessionRegistry.isCurrentGeneration(senpiSessionId,generation2)}var bindings=new Map;function cloneBinding(binding){return{...binding,sentHashes:[...binding.sentHashes],assistantUuidByIndex:binding.assistantUuidByIndex?.map(([index,uuid])=>[index,uuid])}}function evaluateAbortOutcome(receipt){if(!receipt||typeof receipt!="object")return"reattach";let queued=receipt.still_queued;return Array.isArray(queued)&&queued.length===0?"keep":"reattach"}function rememberBinding(binding){bindings.set(binding.senpiSessionId,cloneBinding(binding))}function getBinding(senpiSessionId){let binding=bindings.get(senpiSessionId);return binding?cloneBinding(binding):void 0}function forgetBinding(senpiSessionId){bindings.delete(senpiSessionId)}var bindingInvalidations=new Map;function rememberBindingInvalidation(senpiSessionId,reason){reason===void 0?bindingInvalidations.delete(senpiSessionId):bindingInvalidations.set(senpiSessionId,reason)}function bindingInvalidationReason(senpiSessionId){return bindingInvalidations.get(senpiSessionId)}function bindingFromEntry(entry2,sentHashes){return{senpiSessionId:entry2.senpiSessionId,sdkSessionId:entry2.sdkSessionId,sdkSessionIdConfirmed:entry2.sdkSessionIdConfirmed,sentCount:entry2.sentCount,sentHashes:[...sentHashes],lastAssistantUuid:entry2.assistantUuidByIndex.get(entry2.sentCount)??null,assistantUuidByIndex:[...entry2.assistantUuidByIndex.entries()],accountName:entry2.accountName,modelId:entry2.modelId,systemPromptHash:entry2.systemPromptHash,toolsetHash:entry2.toolsetHash}}async function verifyRestoredTranscript(binding,cwd,authLane){if(authLane==="config-dir")return!1;let messages;try{messages=await getSdkBoundary().getSessionMessages(binding.sdkSessionId,{dir:cwd})}catch(error2){if(error2 instanceof Error)return!1;throw error2}if(messages.length===0||messages.some(message=>message.session_id!==binding.sdkSessionId)||binding.lastAssistantUuid===null)return!1;let anchorIndex=messages.findIndex(message=>message.type==="assistant"&&message.uuid===binding.lastAssistantUuid&&message.parent_tool_use_id===null);if(anchorIndex<0)return!1;let orphanUserMessages=messages.slice(anchorIndex+1).filter(message=>message.type==="user"&&message.parent_tool_use_id===null).length;return orphanUserMessages>0?(logContinuityEvent("claude_sdk_oauth_restored_transcript_orphan_tail",{orphanUserMessages}),!1):!0}async function awaitInitialization(entry2,signal){let initialize=entry2.query.initializationResult;if(!initialize)return;if(!signal){await initialize.call(entry2.query);return}let rejectAborted=()=>{},aborted=new Promise((_,reject)=>{rejectAborted=reject}),onAbort=()=>{closeSession(entry2.senpiSessionId,"resume_initialization_aborted"),rejectAborted(new Error("Anthropic Subscription reattach aborted"))};signal.aborted?onAbort():signal.addEventListener("abort",onAbort,{once:!0});try{await Promise.race([initialize.call(entry2.query),aborted])}finally{signal.removeEventListener("abort",onAbort)}}async function reattachSession(input){await loadClaudeAgentSdk();let{binding,atUuid}=input;closeSession(binding.senpiSessionId,"reattach");let entry2=getOrCreateSession({senpiSessionId:binding.senpiSessionId,accountName:binding.accountName,modelId:binding.modelId,systemPromptHash:binding.systemPromptHash,toolsetHash:binding.toolsetHash,options:input.options,resume:atUuid?{sdkSessionId:binding.sdkSessionId,atUuid}:{sdkSessionId:binding.sdkSessionId}});try{await awaitInitialization(entry2,input.signal)}catch(error2){throw closeSession(binding.senpiSessionId,"resume_initialization_failed"),error2}recordSyncedStream(entry2,binding.sentHashes);for(let[index,uuid]of binding.assistantUuidByIndex??[])entry2.assistantUuidByIndex.set(index,uuid);return binding.lastAssistantUuid&&entry2.assistantUuidByIndex.set(binding.sentCount,binding.lastAssistantUuid),rememberBinding({...binding,sdkSessionId:entry2.sdkSessionId}),entry2}var commitBoundary=new AssistantCommitBoundary;function persistBindingInvalidation(pi,sessionId,reason,divergedPath){pi.appendEntry?.(BINDING_ENTRY_TYPE,{schemaVersion:1,invalidated:!0,reason,...divergedPath===void 0?{}:{divergedPath}}),rememberBindingInvalidation(sessionId,reason)}async function invalidateBinding(pi,ctx,reason,divergedPath){let sessionId=ctx.sessionManager.getSessionId();forgetBinding(sessionId);let sessionFile=ctx.sessionManager.getSessionFile?.();sessionFile&&await deleteStoredBinding(sessionFile),persistBindingInvalidation(pi,sessionId,reason,divergedPath)}function keepBindingThenClose(sessionId,reason){let entry2=getSession(sessionId);entry2&&rememberBinding(bindingFromEntry(entry2,sentHashesForEntry(entry2)??[])),closeSession(sessionId,reason)}function residentEntryFor(sessionId,message){let entry2=getSession(sessionId);if(!(!entry2||!isResidentAssistant(message,entry2.modelId)))return entry2}function registerSessionRegistry(pi){pi.on("session_start",async(event,ctx)=>{if(event.reason==="reload")return;let sessionId=ctx.sessionManager.getSessionId();forgetBinding(sessionId),rememberBindingInvalidation(sessionId,void 0);let sessionFile=ctx.sessionManager.getSessionFile?.();if(event.reason==="new")return;if(event.reason==="fork"){sessionFile&&await deleteStoredBinding(sessionFile),persistBindingInvalidation(pi,sessionId,"fork");return}if(!sessionFile)return;let branch=ctx.sessionManager.getBranch();rememberBindingInvalidation(sessionId,invalidationReasonFromBranch(branch)),restoreColdSeedCalibration(sessionId,branch);let stored=await readStoredBinding(sessionFile);if(!stored)return;if(stored.sessionId!==sessionId){await deleteStoredBinding(sessionFile);return}let binding=bindingFromStoredBranch(branch,stored);if(!binding){await deleteStoredBinding(sessionFile);return}rememberBinding(binding)}),pi.on("session_compact",async(event,ctx)=>{event.accepted&&(recordPendingFork(ctx.sessionManager.getSessionId(),"compaction"),await invalidateBinding(pi,ctx,"compaction"))}),pi.on("session_tree",async(event,ctx)=>{event.oldLeafId===null||event.newLeafId===null||(recordBranchInfo(ctx.sessionManager.getSessionId(),{oldLeafId:event.oldLeafId,newLeafId:event.newLeafId}),await invalidateBinding(pi,ctx,"tree_changed"))}),pi.on("model_select",async(event,ctx)=>{let sessionId=ctx.sessionManager.getSessionId();if(event.model?.provider!==ANTHROPIC_SUBSCRIPTION_PROVIDER_ID){keepBindingThenClose(sessionId,"model_selected");return}await switchSessionModel(sessionId,event.model.id,sdkModelId(event.model))||keepBindingThenClose(sessionId,"model_selected")}),pi.on("thinking_level_select",(_event,ctx)=>{let sessionId=ctx.sessionManager.getSessionId();getSession(sessionId)?.activeTurn||keepBindingThenClose(sessionId,"thinking_level_selected")}),pi.on("message_update",(event,ctx)=>{if(event.message.role!=="assistant")return;let sessionId=ctx.sessionManager.getSessionId();residentEntryFor(sessionId,event.message)&&commitBoundary.captureProviderFinal(sessionId,event.message)}),pi.on("message_end",async(event,ctx)=>{if(event.message.role!=="assistant")return;let sessionId=ctx.sessionManager.getSessionId(),entry2=getSession(sessionId),binding=getBinding(sessionId),modelId=entry2?.modelId??binding?.modelId;if(!modelId)return;if(isTerminalFailure(event.message)){commitBoundary.forget(sessionId);return}let{outcome,divergedPath}=commitBoundary.commit(sessionId,event.message,modelId);if(outcome==="rewritten"){recordPendingFork(sessionId,"assistant_rewritten",divergedPath),await invalidateBinding(pi,ctx,"assistant_rewritten",divergedPath);return}if(outcome!=="clean")return;let sessionFile=ctx.sessionManager.getSessionFile?.();if(!sessionFile||!pi.appendEntry)return;let context=ctx.sessionManager.buildSessionContext(),hashes=sentMessageHashes(sentMessages({...context,messages:convertToLlm(context.messages)})),committedAssistantHash=assistantContentHash(event.message),recordFor=markerEntryId2=>{let anchor={sessionPath:sessionFile,sessionId,markerEntryId:markerEntryId2,assistantContentHash:committedAssistantHash};return entry2?storedBindingFromEntry(entry2,hashes,anchor):binding?storedBindingFromBinding(binding,hashes,anchor):void 0};if(!recordFor("pending"))return;pi.appendEntry(BINDING_ENTRY_TYPE,BINDING_MARKER),rememberBindingInvalidation(sessionId,void 0);let markerEntryId=ctx.sessionManager.getLeafId();if(!markerEntryId)return;let stored=recordFor(markerEntryId);stored&&await writeStoredBinding(sessionFile,stored)}),pi.on("session_shutdown",(event,ctx)=>{closeSession(ctx.sessionManager.getSessionId(),event.reason)}),pi.on("session_extensions_removed",async(_event,ctx)=>{closeSession(ctx.sessionManager.getSessionId(),"extensions_removed"),await invalidateBinding(pi,ctx,"extensions_removed")})}function schemaToZod(schema){let converted;if(schema.const!==void 0)converted=schema.const===null?external_exports.null():external_exports.literal(schema.const);else if(schema.enum&&schema.enum.length>0){let values=schema.enum.filter(value=>["string","number","boolean"].includes(typeof value));if(values.length===1)converted=external_exports.literal(values[0]);else if(values.length>1){let[first,second,...rest]=values.map(value=>external_exports.literal(value));converted=external_exports.union([first,second,...rest])}}if(converted===void 0){let variants=schema.anyOf??schema.oneOf;if(variants&&variants.length>0){let variantsConverted=variants.map(variant=>schemaToZod(variant));if(variantsConverted.length===1)converted=variantsConverted[0];else{let[first,second,...rest]=variantsConverted;converted=external_exports.union([first,second,...rest])}}else switch(Array.isArray(schema.type)?schema.type[0]:schema.type){case"string":converted=external_exports.string();break;case"number":converted=external_exports.number();break;case"integer":converted=external_exports.number().int();break;case"boolean":converted=external_exports.boolean();break;case"null":converted=external_exports.null();break;case"array":converted=external_exports.array(schema.items?schemaToZod(schema.items):external_exports.unknown());break;case"object":converted=objectToShape(schema);break;default:converted=external_exports.unknown();break}}if(converted===void 0)throw new Error("schema conversion did not produce a Zod type");return typeof schema.description=="string"?converted.describe(schema.description):converted}function objectToShape(schema){return external_exports.object(jsonSchemaToZodShape(schema))}function jsonSchemaToZodShape(schema){let object2=schema??{},properties=object2.properties??{},required=new Set(object2.required??[]),shape={};for(let[key,value]of Object.entries(properties)){let converted=schemaToZod(value);shape[key]=required.has(key)?converted:converted.optional()}return shape}async function denyCustomToolExecution(){return{content:[{type:"text",text:TOOL_EXECUTION_DENIED_MESSAGE}],isError:!0}}async function buildCustomToolServers(customTools){if(customTools.length===0)return;await loadClaudeAgentSdk();let server=getSdkBoundary().createSdkMcpServer({name:CUSTOM_TOOLS_MCP_SERVER_NAME,version:"1.0.0",tools:customTools.map(tool=>({name:tool.name,description:tool.description,inputSchema:jsonSchemaToZodShape(tool.parameters),handler:denyCustomToolExecution}))});return{[CUSTOM_TOOLS_MCP_SERVER_NAME]:server}}import{existsSync as existsSync14,readFileSync as readFileSync17}from"node:fs";import{dirname as dirname36,join as join36,relative as relative5,resolve as resolve14}from"node:path";var PROVIDER2="anthropic-subscription";function allAccountsBlockedGuidance(soonestUnblockAt3,blockReason){if(blockReason==="auth_error"){let recheck=soonestUnblockAt3!==void 0&&Number.isFinite(soonestUnblockAt3)?[` Next automatic re-check: ${new Date(soonestUnblockAt3).toISOString()}.`]:[];return[`All Claude accounts for ${PROVIDER2} are currently blocked (authentication error).`,...recheck,` /login ${PROVIDER2} - re-authenticate to refresh the blocked account`," /claude-account list - inspect account states",ACCOUNT_POOL_REFUSAL_NOTE].join(`
|
|
339
339
|
`)}let eta=soonestUnblockAt3!==void 0&&Number.isFinite(soonestUnblockAt3)?new Date(soonestUnblockAt3).toISOString():"after re-login";return[`All Claude accounts for ${PROVIDER2} are currently blocked (rate limit or auth errors).`,` Soonest automatic retry: ${eta}.`," /claude-account list - inspect account states",` /login ${PROVIDER2} - add another account`,ACCOUNT_POOL_REFUSAL_NOTE].join(`
|
|
340
340
|
`)}var ENABLE_ACCOUNT_FALLBACK=" Set anthropicSubscriptionProvider.accountFallback: true (or SENPI_CLAUDE_SDK_OAUTH_ACCOUNT_FALLBACK=1) to switch accounts automatically.";function switchAccountLine(pinnedBy){switch(pinnedBy){case"cli":return" This session was started with --claude-account; start a new session with another --claude-account to switch.";case"settings":return" The pin comes from anthropicSubscriptionProvider.pinnedAccount (or SENPI_CLAUDE_SDK_OAUTH_PINNED_ACCOUNT); change it there to switch accounts.";case"stored":case void 0:return" /claude-account pin <name> - switch to another account"}}function singleAccountUnavailableGuidance(account,soonestUnblockAt3,blockReason){if(!account.configured)return[`Claude account '${account.name}' for ${PROVIDER2} is not configured, and account fallback is off, so no other account is used.`," /claude-account list - see the configured accounts",account.pinnedBy==="cli"||account.pinnedBy==="settings"?switchAccountLine(account.pinnedBy):" /claude-account pin <name> - pin a configured account (or /claude-account unpin)"," Start a new session if this session's account was removed.",ENABLE_ACCOUNT_FALLBACK,ACCOUNT_POOL_REFUSAL_NOTE].join(`
|
|
341
341
|
`);let until=soonestUnblockAt3!==void 0&&Number.isFinite(soonestUnblockAt3)?new Date(soonestUnblockAt3).toISOString():void 0;return blockReason==="auth_error"?[`Claude account '${account.name}' for ${PROVIDER2} is blocked (authentication error), and account fallback is off, so no other account is tried.`,` /login ${PROVIDER2} - re-authenticate this account`,...until===void 0?[]:[` Next automatic re-check: ${until}.`],switchAccountLine(account.pinnedBy),ENABLE_ACCOUNT_FALLBACK,ACCOUNT_POOL_REFUSAL_NOTE].join(`
|
|
@@ -628,7 +628,7 @@ This thread does not currently have a goal.`,cleared?"info":"warning");return}}}
|
|
|
628
628
|
${formatGoalForTool(goal)}`,"info"),deps.queueGoalContinuation(pi,ctx,goal)}async function confirmReplaceGoal(ctx,objective){return ctx.hasUI?await ctx.ui.select(`Replace goal?
|
|
629
629
|
New objective: ${objective}`,[REPLACE_GOAL_CHOICE,CANCEL_REPLACE_GOAL_CHOICE])===REPLACE_GOAL_CHOICE:!0}var GoalDirectInputLifecycle=class{#dependencies;#candidates=new Map;#suppressedLoadResumeArmed=!1;constructor(dependencies){this.#dependencies=dependencies}reset(){this.#candidates.clear(),this.#suppressedLoadResumeArmed=!1}armSuppressedLoadResume(){this.#suppressedLoadResumeArmed=!0}async onInput(event,ctx){if(event.source==="extension")return;this.#dependencies.monitor.holdDirectInput(event.inputId),this.#candidates.set(event.inputId,{goalId:null});let goal=await readGoal(this.#dependencies.goalStoreRef(ctx));this.#candidates.set(event.inputId,{goalId:goal?.id??null})}async onDisposition(event,ctx){let candidate=this.#candidates.get(event.inputId);if(candidate===void 0)return;this.#candidates.delete(event.inputId);let accepted=event.disposition==="started"||event.disposition==="queued";if(this.#dependencies.monitor.resolveDirectInput(event.inputId,accepted),accepted&&this.#dependencies.onAcceptedDirectInput?.(),!accepted||candidate.goalId===null)return;let ref=this.#dependencies.goalStoreRef(ctx),currentGoal=await readGoal(ref);if(currentGoal?.id!==candidate.goalId)return;if(currentGoal.status==="blocked"&&isMechanicalContinuationBlock(currentGoal.blockedReason)){await resetContinuationStreak(ref,{unattended:!0});let reactivated=await updateGoal(ref,{status:"active"},"user");this.#dependencies.beginAgentGoalAccounting(reactivated),this.#dependencies.refreshGoalUi(ctx,reactivated);return}if(currentGoal.status!=="active")return;let reset=await resetContinuationStreak(ref,{unattended:!0});reset!==null&&(this.#dependencies.beginAgentGoalAccounting(reset),this.#dependencies.refreshGoalUi(ctx,reset)),this.#suppressedLoadResumeArmed&&(this.#suppressedLoadResumeArmed=!1,await this.#dependencies.resumeAfterSuppressedLoad?.(ctx,reset??currentGoal))}};var GOAL_ELAPSED_TICK_INTERVAL_MS=1e3;function goalLiveElapsedSeconds(goal,measuredFromMilliseconds,nowMilliseconds){if(goal.continuationStoppedAt!==void 0)return goal.timeUsedSeconds;let elapsedSeconds=Math.max(0,Math.round((nowMilliseconds-measuredFromMilliseconds)/1e3));return goal.timeUsedSeconds+elapsedSeconds}var GoalElapsedTicker=class{constructor(options){this.measuredFromMilliseconds=0,this.render=options.render,this.now=options.now??Date.now}get running(){return this.intervalId!==void 0}sync(ctx,goal,measuredFromMilliseconds){if(this.ctx=ctx,this.goal=goal,this.measuredFromMilliseconds=measuredFromMilliseconds,this.lastRenderedElapsedLabel=void 0,this.tick(),this.ctx===void 0||this.intervalId!==void 0)return;let handle=setInterval(()=>this.tick(),GOAL_ELAPSED_TICK_INTERVAL_MS);handle.unref(),this.intervalId=handle}stop(){this.intervalId!==void 0&&(clearInterval(this.intervalId),this.intervalId=void 0),this.ctx=void 0,this.goal=void 0,this.lastRenderedElapsedLabel=void 0}tick(){if(this.ctx===void 0||this.goal===void 0)return;let liveElapsedSeconds=goalLiveElapsedSeconds(this.goal,this.measuredFromMilliseconds,this.now()),elapsedLabel=formatGoalElapsedSeconds(liveElapsedSeconds);if(elapsedLabel!==this.lastRenderedElapsedLabel){this.lastRenderedElapsedLabel=elapsedLabel;try{this.render(this.ctx,this.goal,liveElapsedSeconds)}catch(error2){if(isStaleExtensionContextError(error2)){this.stop();return}throw error2}}}};function subscribeGoalChannelState(events,callbacks){return[events.on(TERMINAL_MONITOR_STATE_EVENT,data=>{isTerminalMonitorStateEvent(data)&&callbacks.onWakeSource("terminal-monitors",data.activeCount)}),events.on(WAKE_SOURCE_STATE_EVENT,data=>{isWakeSourceStateEvent(data)&&callbacks.onWakeSource(data.source,data.activeCount,data)}),events.on(CONTINUATION_HOLD_STATE_EVENT,data=>{isContinuationHoldStateEvent(data)&&callbacks.onContinuationHold(data.source,data.active)})]}function findParkedGoalWait(entries,goalId){for(let index=entries.length-1;index>=0;index--){let entry2=entries[index];if(entry2!==void 0){if(entry2.type==="message"||entry2.type==="custom_message")return;if(!(entry2.type!=="custom"||entry2.customType!==GOAL_CACHE_WARMUP_ENTRY_TYPE))return parseParkedWait(entry2.data,goalId)}}}function parseParkedWait(data,goalId){if(typeof data!="object"||data===null)return;let phase=Reflect.get(data,"phase"),entryGoalId=Reflect.get(data,"goalId"),iteration=Reflect.get(data,"iteration"),delayMs=Reflect.get(data,"delayMs"),dueAtMs=Reflect.get(data,"dueAtMs");if(phase!=="scheduled"||entryGoalId!==goalId||typeof iteration!="number"||!Number.isInteger(iteration)||iteration<1||typeof delayMs!="number"||!Number.isFinite(delayMs)||delayMs<=0||typeof dueAtMs!="number"||!Number.isFinite(dueAtMs))return;let cache=parseCache(Reflect.get(data,"cache"));return{iteration,delayMs,dueAtMs,...cache!==void 0?{cache}:{}}}function parseCache(value){if(typeof value!="object"||value===null)return;let cachedTokens=Reflect.get(value,"cachedTokens");if(typeof cachedTokens!="number"||!Number.isFinite(cachedTokens))return;let ttlSeconds=Reflect.get(value,"ttlSeconds"),estimatedSavedUsd=Reflect.get(value,"estimatedSavedUsd"),cacheLifetime=Reflect.get(value,"cacheLifetime");return{cachedTokens,...cacheLifetime==="best-effort"?{cacheLifetime}:{},...typeof ttlSeconds=="number"&&Number.isFinite(ttlSeconds)?{ttlSeconds}:{},...typeof estimatedSavedUsd=="number"&&Number.isFinite(estimatedSavedUsd)?{estimatedSavedUsd}:{}}}var USAGE_FIELDS=["input","output","cacheRead","cacheWrite","totalTokens"];function emptyUsage(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0}}function collectAssistantUsage(messages){let usage3=emptyUsage();for(let message of messages)addAssistantMessageUsage(usage3,message);return usage3}var TurnUsageTracker=class{constructor(){this.pending=emptyUsage(),this.flushed=emptyUsage()}reset(){this.pending=emptyUsage(),this.flushed=emptyUsage()}noteMessageEnd(message){addAssistantMessageUsage(this.pending,message)}takePending(){let taken=this.pending;this.pending=emptyUsage();for(let field3 of USAGE_FIELDS)this.flushed[field3]+=taken[field3];return taken}discardPending(){this.takePending()}takeRemaining(agentRunMessages){let collected=collectAssistantUsage(agentRunMessages),remaining=emptyUsage();for(let field3 of USAGE_FIELDS)remaining[field3]=Math.max(0,collected[field3]-this.flushed[field3]),this.flushed[field3]=Math.max(this.flushed[field3],collected[field3]);return this.pending=emptyUsage(),remaining}};function addAssistantMessageUsage(target,message){if(!(!isRecord2(message)||message.role!=="assistant"||!isRecord2(message.usage)))for(let field3 of USAGE_FIELDS){let value=message.usage[field3];typeof value=="number"&&Number.isFinite(value)&&(target[field3]+=value)}}var ASK_USER_WAKE_SOURCE="ask-user",ASK_USER_DEFAULT_TIMEOUT_MINUTES=30,GOAL_CONTINUATION_SCHEDULED_EVENT="goal_continuation_scheduled",GOAL_CONTINUATION_RESUMED_EVENT="goal_continuation_resumed",GOAL_CONTINUATION_TIMER_STATE_EVENT="goal_continuation_timer_state",GOAL_MONITOR_STALL_EVENT="goal_monitor_continuation_stall",MonitorAwareGoalContinuation=class{#pi;#isContinuationPending;#markContinuationPending;#waitTicker;#wakeSources=new Map;#hasStarted=!1;#ctx;#goal=null;#timer;#scheduledContinuationKind;#armedDrainFire=!1;#channelStateUnsubscribers=[];#lastAgentEndMessages=[];#consecutiveLengthRecoveries=new Map;#recentNormalizedOutputHashes=[];#toollessContinuationStreak=0;#recentToolEffects=[];#toollessStreakGoalId=null;#endedTurnWasUserInitiated=!1;#lastTurnUsage;#scheduledAtMs;#scheduledDueAtMs;#scheduledCache;#scheduledDelayMs;#askUserDeadlineAtMs;#cacheWarmIteration=0;#scheduledCacheWarmIteration;#heldTimer;#directInputHolds=new Set;#pendingSystemRecovery;#pendingProviderRecovery;#providerRetryAttempts=0;#providerRetryDelayMs;constructor(pi,isContinuationPending=()=>!1,markContinuationPending=()=>{},waitTicker){this.#pi=pi,this.#isContinuationPending=isContinuationPending,this.#markContinuationPending=markContinuationPending,this.#waitTicker=waitTicker,this.#subscribeToChannelState()}start(ctx){this.#cancelTimer(),this.#ctx=ctx,this.#hasStarted?this.#clearWakeSources():this.#hasStarted=!0,this.#goal=null,this.#lastAgentEndMessages=[],this.#directInputHolds.clear(),this.#resetContinuationState()}async afterAgentEnd(options){options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#providerRetryAttempts=0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),this.#resetLengthRecoveryAfterCleanStop(options.goal,options.messages);let turnUsedTools=continuationTurnUsedTools(options.messages),humanInput=options.messages.some(isHumanInputMonitorNotification);if(this.#recordAssistantOutput(options.messages,turnUsedTools||humanInput),options.goal?.status!=="active")return this.#cancelTimer(),this.#resetContinuationState(),options.goal;this.#recordToollessContinuationTurn(options.goal,turnUsedTools||humanInput);let immediateInput=this.#buildVerdictInput(options.ctx,options.goal,"immediate",options.messages),madeProgress=this.#recordToolEffect(options.messages)||humanInput||hasGoalTodoProgress(immediateInput),goal=!this.#endedTurnWasUserInitiated&&(madeProgress||hasGoalContinuationProgress(immediateInput))?await resetContinuationStreak(goalStoreRef(options.ctx.sessionManager,options.ctx.cwd),{progress:madeProgress,unattended:humanInput})??options.goal:options.goal;this.#goal=goal;let immediateVerdict=evaluateGoalContinuation({goal,...this.#buildVerdictInput(options.ctx,goal,"immediate",options.messages)});if(this.#endedTurnWasUserInitiated){if(this.#endedTurnWasUserInitiated=!1,this.#cancelTimer(),immediateVerdict.kind==="continue")return this.#schedule(goal,"userGrace"),goal;switch(immediateVerdict.reason){case"not-eligible":case"single-flight":return goal;case"stale":case"context-overflow":case"cap":case"repetition":case"length-exhausted":case"no-progress":return(await this.#admitAndQueue(options.ctx,goal,"immediate",options.messages)).goal}}return immediateVerdict.kind==="deny"&&immediateVerdict.reason==="not-eligible"?goal:this.#activeWakeSourceCount()===0?(this.#cancelTimer(),(await this.#admitAndQueue(options.ctx,goal,"immediate",options.messages)).goal):(this.#schedule(goal,"monitor"),goal)}async afterSystemAbort(options){return this.noteContinuationStarted(),options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#pendingSystemRecovery=void 0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),options.goal?.status!=="active"?(this.#resetContinuationState(),options.goal):(options.willRetry||deadlineStopPendingSinceLastTurn(options.ctx.sessionManager.getBranch())!==void 0||(this.#activeWakeSourceCount()>0?this.#schedule(options.goal,"monitor"):lastAssistantMessage(options.messages)?.stopReason==="error"&&(this.#pendingSystemRecovery=options)),options.goal)}async afterProviderFailure(options){return this.noteContinuationStarted(),options.goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#pendingProviderRecovery=void 0,this.#ctx=options.ctx,this.#goal=options.goal,this.#lastAgentEndMessages=options.messages,this.#lastTurnUsage=collectAssistantUsage([...options.messages]),options.goal?.status!=="active"?(this.#resetContinuationState(),options.goal):(options.willRetry||(this.#pendingProviderRecovery=options),options.goal)}async afterAgentSettled(){let pendingSystem=this.#pendingSystemRecovery,pendingProvider=this.#pendingProviderRecovery;if(this.#pendingSystemRecovery=void 0,this.#pendingProviderRecovery=void 0,pendingSystem!==void 0&&pendingSystem.goal!==null&&pendingSystem.event.abortSource!=="user")return(await this.#admitAndQueue(pendingSystem.ctx,pendingSystem.goal,"systemRecovery",pendingSystem.messages)).goal;if(pendingProvider===void 0||pendingProvider.goal===null||pendingProvider.event.abortSource==="user")return;this.#providerRetryAttempts+=1;let now2=Date.now(),delayMs=providerRetryDelayMs(this.#providerRetryAttempts,providerRetryAt(pendingProvider.messages,now2),now2);return delayMs>0?(this.#cancelTimer(),this.#providerRetryDelayMs=delayMs,this.#schedule(pendingProvider.goal,"providerRetry"),pendingProvider.goal):(await this.#admitAndQueue(pendingProvider.ctx,pendingProvider.goal,"providerRecovery",pendingProvider.messages)).goal}syncGoal(goal){goal?.id!==this.#goal?.id&&this.#resetContinuationState(),this.#goal=goal,goal?.status!=="active"&&(this.#cancelTimer(),this.#resetContinuationState())}scheduledContinuation(){return this.#scheduledContinuationKind}hasStagedRecovery(){return this.#pendingSystemRecovery!==void 0||this.#pendingProviderRecovery!==void 0}hasActiveWakeSources(){return this.#activeWakeSourceCount()>0}rearmMonitorBackstop(goal){goal.status!=="active"||this.#activeWakeSourceCount()===0||(this.#goal=goal,this.#schedule(goal,"monitor",!1,this.#parkedWait(goal.id)))}#parkedWait(goalId){try{return findParkedGoalWait(this.#ctx?.sessionManager?.getBranch()??[],goalId)}catch(error2){if(isStaleExtensionContextError(error2))return;throw error2}}holdDirectInput(inputId){if(this.#directInputHolds.has(inputId)||(this.#directInputHolds.add(inputId),this.#directInputHolds.size!==1||this.#timer===void 0||this.#scheduledContinuationKind===void 0))return;let heldAtMs=Date.now();this.#heldTimer={kind:this.#scheduledContinuationKind,remainingMs:Math.max(0,(this.#scheduledDueAtMs??heldAtMs)-heldAtMs),heldAtMs,totalMs:this.#scheduledDelayMs??GOAL_USER_GRACE_DELAY_MS,drainFire:!1},clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#waitTicker?.stop()}resolveDirectInput(inputId,accepted){if(!this.#directInputHolds.delete(inputId))return;if(accepted){this.#heldTimer=void 0,this.noteUserPrompt();return}if(this.#directInputHolds.size>0||this.#heldTimer===void 0)return;let held=this.#heldTimer;this.#heldTimer=void 0;let elapsedWhileHeldMs=Math.max(0,Date.now()-held.heldAtMs);this.#armTimer(held.kind,Math.max(0,held.remainingMs-elapsedWhileHeldMs),held.totalMs,held.drainFire)}noteUserPrompt(){this.#cancelTimer(),this.#pendingProviderRecovery=void 0,this.#endedTurnWasUserInitiated=!0,this.#resetContinuationState()}noteContinuationStarted(){this.#endedTurnWasUserInitiated=!1}dispose(){this.#cancelTimer();for(let unsubscribe of this.#channelStateUnsubscribers)unsubscribe();this.#channelStateUnsubscribers=[],this.#ctx=void 0,this.#goal=null,this.#clearWakeSources(),this.#lastAgentEndMessages=[],this.#directInputHolds.clear(),this.#resetContinuationState()}#schedule(goal,kind,repark=!1,parked){if(this.#scheduledContinuationKind!==void 0)return;let askUserWaitMs=kind==="monitor"?this.#askUserWaitMs():void 0,delayMs=kind==="monitor"?parked?.delayMs??askUserWaitMs??resolveGoalMonitorContinuationDelayMs(resolveGoalBackstopMaxSecondsForCache(this.#ctx?.getPromptCacheGoalBackstopMaxSeconds?.(),resolveGoalPromptCacheLifetime(this.#ctx?.model,process.env))):kind==="providerRetry"?this.#providerRetryDelayMs??PROVIDER_RETRY_BASE_MS:GOAL_USER_GRACE_DELAY_MS;this.#scheduledDelayMs=delayMs;let remainingMs2=delayMs;if(kind==="monitor"){parked!==void 0?this.#cacheWarmIteration=parked.iteration:repark||(this.#cacheWarmIteration+=1),this.#scheduledCacheWarmIteration=this.#cacheWarmIteration;let iteration=this.#scheduledCacheWarmIteration,cache=parked!==void 0?parked.cache:estimateCacheWarmMetrics(this.#ctx?.model,process.env,this.#lastTurnUsage),wakeSources=this.#wakeSourceSnapshot();this.#scheduledCache=cache,this.#scheduledAtMs=parked!==void 0?parked.dueAtMs-delayMs:Date.now(),parked!==void 0&&(remainingMs2=Math.max(0,parked.dueAtMs-Date.now()));let scheduleData=createGoalCacheWarmScheduleData({goalId:goal.id,delayMs,scheduledAtMs:this.#scheduledAtMs,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,...cache!==void 0?{cache}:{}});this.#publish(GOAL_CONTINUATION_SCHEDULED_EVENT,scheduleData),!repark&&parked===void 0&&this.#appendWarmupEntry({phase:"scheduled",...scheduleData})}else this.#scheduledAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledCacheWarmIteration=void 0;if(this.#scheduledContinuationKind=kind,this.#publish(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!0,kind,dueAtMs:Date.now()+remainingMs2}),this.#directInputHolds.size>0){this.#heldTimer={kind,remainingMs:remainingMs2,heldAtMs:Date.now(),totalMs:delayMs,drainFire:!1};return}this.#armTimer(kind,remainingMs2,delayMs)}#ctxHasUI(ctx=this.#ctx){try{return ctx?.hasUI===!0}catch(error2){if(isStaleExtensionContextError(error2))return!1;throw error2}}#armTimer(kind,delayMs,totalMs,drainFire=!1){this.#scheduledDueAtMs=Date.now()+delayMs,this.#armedDrainFire=drainFire;let ctx=this.#ctx;ctx!==void 0&&this.#ctxHasUI(ctx)&&this.#waitTicker?.sync(ctx,{kind,remainingMs:delayMs,totalMs,channelCounts:this.#wakeSourceSnapshot()}),this.#timer=setTimeout(()=>{this.#continueIfEligible(kind,drainFire).catch(error2=>{if(isStaleExtensionContextError(error2)||!this.#ctxHasUI())return;let message=error2 instanceof Error?error2.message:String(error2);this.#ctx?.ui.notify(`Goal continuation delivery failed: ${message}`,"error")})},delayMs)}async#continueIfEligible(kind,drainFire=!1){this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#scheduledContinuationKind=void 0,this.#publish(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!1,kind}),this.#waitTicker?.stop();let delayMs=this.#scheduledDelayMs??(kind==="monitor"?GOAL_MONITOR_CONTINUATION_FALLBACK_DELAY_MS:kind==="providerRetry"?PROVIDER_RETRY_BASE_MS:GOAL_USER_GRACE_DELAY_MS),waitedMs=this.#scheduledAtMs===void 0?delayMs:Math.max(0,Date.now()-this.#scheduledAtMs),dueAtMs=this.#scheduledAtMs===void 0?void 0:this.#scheduledAtMs+delayMs,wakeCause=drainFire?"sources-drained":"timer",cache=this.#scheduledCache,iteration=this.#scheduledCacheWarmIteration;this.#scheduledAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledDelayMs=void 0,this.#scheduledCacheWarmIteration=void 0;let ctx=this.#ctx,goal=this.#goal;if(ctx===void 0||goal?.status!=="active"||!ctx.isIdle()||ctx.hasPendingMessages()||deadlineStopPendingSinceLastTurn(ctx.sessionManager.getBranch())!==void 0||kind==="monitor"&&this.#activeWakeSourceCount()===0&&!drainFire)return;let admission=await this.#admitAndQueue(ctx,goal,kind==="monitor"?"monitorDelayed":kind==="providerRetry"?"providerRecovery":"userGrace",this.#lastAgentEndMessages);if(kind!=="monitor"||!admission.admitted||iteration===void 0)return;let wakeSources=this.#wakeSourceSnapshot();this.#publish(GOAL_CONTINUATION_RESUMED_EVENT,{goalId:goal.id,delayMs,dueAtMs,waitedMs,wakeCause,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,cache}),this.#appendWarmupEntry({phase:"resumed",goalId:goal.id,delayMs,dueAtMs,waitedMs,wakeCause,iteration,activeMonitorCount:this.#activeWakeSourceCount(),wakeSources,...cache!==void 0?{cache}:{}}),(drainFire||admission.goal.status!=="active")&&this.#resetCacheWarmIteration()}async#admitAndQueue(ctx,goal,path14,messages){let input=this.#buildVerdictInput(ctx,goal,path14,messages),verdict=evaluateGoalContinuation({goal,...input}),admittedGoal=await admitAndQueueGoalContinuation(this.#pi,ctx,goal,{input,content:continuationVerdict=>this.#buildContinuationContent(ctx,goal,continuationVerdict),markContinuationPending:this.#markContinuationPending});return admittedGoal===null?(this.#goal=null,this.#cancelTimer(),this.#resetToollessContinuationStreak(),{goal,admitted:!1}):(verdict.kind==="continue"&&input.lastStopReason==="length"&&this.#consecutiveLengthRecoveries.set(goal.id,input.consecutiveLengthRecoveries+1),this.#goal=admittedGoal,admittedGoal.status!=="active"&&(this.#cancelTimer(),this.#resetToollessContinuationStreak()),{goal:admittedGoal,admitted:verdict.kind==="continue"})}#appendWarmupEntry(data){this.#pi.appendEntry?.(GOAL_CACHE_WARMUP_ENTRY_TYPE,data)}#buildVerdictInput(ctx,goal,path14,messages){let lastAssistant=lastAssistantMessage(messages);return{isIdle:ctx.isIdle(),hasPendingMessages:ctx.hasPendingMessages(),path:path14,lastStopReason:lastAssistant?.stopReason,lastTurnWasMalformedToolUse:lastAssistant?.role==="assistant"&&isMalformedToolUseTurn(lastAssistant),consecutiveContinuations:goal.consecutiveContinuations??0,lastContinuationSignature:goal.lastContinuationSignature,currentSignature:buildCurrentGoalContinuationSignature(ctx,goal,lastAssistantText(messages)),consecutiveLengthRecoveries:this.#consecutiveLengthRecoveries.get(goal.id)??0,recentNormalizedOutputHashes:this.#recentNormalizedOutputHashes,toollessContinuationStreak:this.#toollessContinuationStreak,continuationPending:this.#isContinuationPending(),lastTurnStuckOnContextOverflow:isLastTurnStuckOnContextOverflow(ctx,lastAssistant)}}#buildContinuationContent(ctx,goal,verdict){let content=verdict.prompt==="minimal"?buildTruncationRecoveryPrompt():buildContinuationPrompt(goal,{modelId:ctx.model?.id});if(!verdict.stallNotice)return content;let liveSources=this.liveWakeSources();if(this.#pi.events?.emit(GOAL_MONITOR_STALL_EVENT,{goalId:goal.id,consecutiveContinuations:this.#toollessContinuationStreak,toolless:!0}),this.#ctxHasUI(ctx)){let context=liveSources.length>0?`while ${liveSources.join(", ")} channels stayed active`:"without tool use";ctx.ui.notify(`Goal continuation repeated ${this.#toollessContinuationStreak} toolless turns ${context} - injected a stall check.`,"info")}return content=`${buildGoalStallNotice(this.#toollessContinuationStreak,{liveSources})}
|
|
630
630
|
|
|
631
|
-
${content}`,content}#recordAssistantOutput(messages,turnUsedTools){if(turnUsedTools){this.#recentNormalizedOutputHashes=[];return}let text3=lastAssistantText(messages);normalizeAssistantText(text3).length!==0&&(this.#recentNormalizedOutputHashes=[...this.#recentNormalizedOutputHashes,hashAssistantText(text3)].slice(-3))}#recordToolEffect(messages){let fingerprint=toolEffectFingerprint(messages);if(fingerprint===void 0)return!1;let repeated=this.#recentToolEffects.length===0||this.#recentToolEffects.includes(fingerprint);return this.#recentToolEffects=[...this.#recentToolEffects,fingerprint].slice(-GOAL_TOOL_EFFECT_WINDOW),!repeated}#recordToollessContinuationTurn(goal,turnUsedTools){if(goal.id!==this.#toollessStreakGoalId&&(this.#toollessStreakGoalId=goal.id,this.#toollessContinuationStreak=0),!this.#endedTurnWasUserInitiated){if(turnUsedTools){this.#toollessContinuationStreak=0;return}this.#toollessContinuationStreak+=1}}#resetLengthRecoveryAfterCleanStop(goal,messages){goal===null||lastAssistantMessage(messages)?.stopReason!=="stop"||this.#consecutiveLengthRecoveries.delete(goal.id)}#subscribeToChannelState(){let events=this.#pi.events;events!==void 0&&this.#channelStateUnsubscribers.push(...subscribeGoalChannelState(events,{onWakeSource:(source2,activeCount,event)=>this.#setWakeSourceCount(source2,activeCount,event?.items),onContinuationHold:(source2,active)=>{let inputId=`external:${source2}`;active?this.holdDirectInput(inputId):this.resolveDirectInput(inputId,!1)}}))}#askUserWaitMs(){if((this.#wakeSources.get(ASK_USER_WAKE_SOURCE)??0)<=0)return;let remainingMs2=(this.#askUserDeadlineAtMs??0)-Date.now(),waitMs=remainingMs2>0?remainingMs2:this.#askUserIdleTimeoutMs();return resolveGoalMonitorContinuationDelayMs(waitMs/1e3)}#askUserIdleTimeoutMs(){let minutes=this.#ctx?.getAskUserSettings?.().timeoutMinutes;return(typeof minutes=="number"&&Number.isFinite(minutes)&&minutes>0?minutes:ASK_USER_DEFAULT_TIMEOUT_MINUTES)*6e4}#noteAskUserWait(activeCount,items){if(activeCount<=0){this.#askUserDeadlineAtMs=void 0;return}let deadlines=items?.flatMap(item=>item.deadlineAtMs===void 0?[]:[item.deadlineAtMs])??[];if(deadlines.length>0){this.#askUserDeadlineAtMs=Math.min(...deadlines);return}let previousCount=this.#wakeSources.get(ASK_USER_WAKE_SOURCE)??0;(activeCount>previousCount||this.#askUserDeadlineAtMs===void 0)&&(this.#askUserDeadlineAtMs=Date.now()+this.#askUserIdleTimeoutMs())}#clearWakeSources(){this.#wakeSources.clear(),this.#askUserDeadlineAtMs=void 0}#setWakeSourceCount(source2,activeCount,items){let previousTotal=this.#activeWakeSourceCount(),previousDeadline=this.#askUserDeadlineAtMs;source2===ASK_USER_WAKE_SOURCE&&this.#noteAskUserWait(activeCount,items),this.#wakeSources.set(source2,activeCount);let nextTotal=this.#activeWakeSourceCount();if(previousTotal>0&&nextTotal===0){this.#scheduledContinuationKind==="monitor"?this.#armDrainFire():this.#resetCacheWarmIteration(),this.#resetToollessContinuationStreak();return}if(this.#scheduledContinuationKind==="monitor"){if(previousDeadline!==this.#askUserDeadlineAtMs&&this.#goal!==null){this.#cancelTimer(),this.#schedule(this.#goal,"monitor",!0);return}this.#waitTicker?.setChannelCounts(this.#wakeSourceSnapshot())}}#armDrainFire(){if(this.#directInputHolds.size>0){this.#heldTimer={kind:"monitor",remainingMs:1e3,heldAtMs:Date.now(),totalMs:1e3,drainFire:!0};return}this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#waitTicker?.stop(),this.#armTimer("monitor",1e3,1e3,!0)}#activeWakeSourceCount(){let total=0;for(let count2 of this.#wakeSources.values())total+=count2;return total}#wakeSourceSnapshot(){return Object.fromEntries([...this.#wakeSources.entries()].sort(([left],[right])=>left.localeCompare(right)))}liveWakeSources(){return[...this.#wakeSources.entries()].filter(([,count2])=>count2>0).map(([source2])=>source2).sort()}#resetContinuationState(){this.#pendingSystemRecovery=void 0,this.#pendingProviderRecovery=void 0,this.#providerRetryAttempts=0,this.#consecutiveLengthRecoveries.clear(),this.#recentNormalizedOutputHashes=[],this.#recentToolEffects=[],this.#resetToollessContinuationStreak(),this.#resetCacheWarmIteration()}#resetCacheWarmIteration(){this.#cacheWarmIteration=0,this.#scheduledCacheWarmIteration=void 0}#resetToollessContinuationStreak(){this.#toollessContinuationStreak=0,this.#toollessStreakGoalId=null}async fireNow(){if(this.#heldTimer!==void 0)return{fired:!1,reason:"held"};let kind=this.#scheduledContinuationKind;return this.#timer===void 0||kind===void 0?{fired:!1,reason:"not_armed"}:(clearTimeout(this.#timer),await this.#continueIfEligible(kind,this.#armedDrainFire),{fired:!0,kind})}#publish(name,data){publishGoalContinuationEvent(this.#pi,name,data)}#cancelTimer(){let kind=this.#scheduledContinuationKind;this.#scheduledAtMs=void 0,this.#scheduledDueAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledDelayMs=void 0,this.#scheduledCacheWarmIteration=void 0,this.#heldTimer=void 0,this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledContinuationKind=void 0,kind!==void 0&&this.#publish(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!1,kind}),this.#waitTicker?.stop()}};async function reengageGoalAfterReload(options){let{ctx,goal,monitor}=options;if(goal.status!=="active"||deadlineStopPendingSinceLastTurn(ctx.sessionManager.getBranch())!==void 0)return"skipped-inactive";if(monitor.hasActiveWakeSources())return monitor.rearmMonitorBackstop(goal),"backstop-rearmed";let trailingContinuations=options.countTrailingContinuations();return trailingContinuations>=GOAL_CONTINUATION_CAP?(ctx.ui.notify(`Goal auto-continuation suppressed for this resumed session (${trailingContinuations} historical continuations). Send a message to resume.`,"info"),"suppressed-flood"):(await options.queueContinuation(),"continuation-queued")}var GOAL_STOP_PAUSED_ENTRY="goal-stop-paused",GOAL_STOP_RESUMED_ENTRY="goal-stop-resumed";function stopHoldLive(ctx){return ctx.getPauseState?.().holds.some(hold=>hold.kind==="session_hold")===!0}function markStopPaused(pi,goalId){pi.appendEntry(GOAL_STOP_PAUSED_ENTRY,{goalId})}function markStopResumed(pi,goalId){pi.appendEntry(GOAL_STOP_RESUMED_ENTRY,{goalId})}var stopPausedGoals={initial:()=>new Map,add:(goals,entry2)=>{if(entry2.type!=="custom")return goals;let goalId=entry2.data?.goalId;return typeof goalId!="string"||(entry2.customType===GOAL_STOP_PAUSED_ENTRY?goals.set(goalId,!0):entry2.customType===GOAL_STOP_RESUMED_ENTRY&&goals.set(goalId,!1)),goals}};function pausedByStop(ctx,goalId){return ctx.sessionManager.reduceHistory(stopPausedGoals).get(goalId)===!0}var GOAL_STORE_CHANGED_EVENT="goal_store_changed";function isGoalStoreChangedEvent(data){return typeof data=="object"&&data!==null&&"threadId"in data&&typeof data.threadId=="string"&&data.threadId.length>0}var OBJECTIVE_PREVIEW_WIDTH=120,COLLAPSED_OBJECTIVE_LINES=2,CALL_OBJECTIVE_BUDGET=80,CALL_REASON_BUDGET=60;function renderGoalToolCall(toolName,args,theme2){let title=theme2.fg("toolTitle",theme2.bold(toolName)),params=isRecord2(args)?args:{};if(toolName==="create_goal"&&typeof params.objective=="string"){let preview=objectiveCallPreview(params.objective);return new Text(preview===""?title:`${title} ${theme2.fg("muted",preview)}`,0,0)}if(toolName==="update_goal"&&typeof params.status=="string"){let statusColor2=params.status==="complete"?"success":"error",line=`${title} ${theme2.fg("muted","\u2192")} ${theme2.fg(statusColor2,params.status)}`;return typeof params.reason=="string"&¶ms.reason.trim().length>0&&(line+=theme2.fg("muted",` - ${shorten(params.reason.trim(),CALL_REASON_BUDGET)}`)),new Text(line,0,0)}return new Text(title,0,0)}function renderGoalToolResult(result3,options,theme2){let text3=result3.content.find(block=>block.type==="text")?.text??"",details=resolveRenderDetails(result3.details,text3);if(details===void 0)return new Text(theme2.fg("toolOutput",text3),0,0);if(details.goal===null){let lines2=[theme2.fg("dim","No active goal is set.")];return appendNotice2(lines2,details.notice,theme2),new Text(lines2.join(`
|
|
631
|
+
${content}`,content}#recordAssistantOutput(messages,turnUsedTools){if(turnUsedTools){this.#recentNormalizedOutputHashes=[];return}let text3=lastAssistantText(messages);normalizeAssistantText(text3).length!==0&&(this.#recentNormalizedOutputHashes=[...this.#recentNormalizedOutputHashes,hashAssistantText(text3)].slice(-3))}#recordToolEffect(messages){let fingerprint=toolEffectFingerprint(messages);if(fingerprint===void 0)return!1;let repeated=this.#recentToolEffects.length===0||this.#recentToolEffects.includes(fingerprint);return this.#recentToolEffects=[...this.#recentToolEffects,fingerprint].slice(-GOAL_TOOL_EFFECT_WINDOW),!repeated}#recordToollessContinuationTurn(goal,turnUsedTools){if(goal.id!==this.#toollessStreakGoalId&&(this.#toollessStreakGoalId=goal.id,this.#toollessContinuationStreak=0),!this.#endedTurnWasUserInitiated){if(turnUsedTools){this.#toollessContinuationStreak=0;return}this.#toollessContinuationStreak+=1}}#resetLengthRecoveryAfterCleanStop(goal,messages){goal===null||lastAssistantMessage(messages)?.stopReason!=="stop"||this.#consecutiveLengthRecoveries.delete(goal.id)}#subscribeToChannelState(){let events=this.#pi.events;events!==void 0&&this.#channelStateUnsubscribers.push(...subscribeGoalChannelState(events,{onWakeSource:(source2,activeCount,event)=>this.#setWakeSourceCount(source2,activeCount,event?.items),onContinuationHold:(source2,active)=>{let inputId=`external:${source2}`;active?this.holdDirectInput(inputId):this.resolveDirectInput(inputId,!1)}}))}#askUserWaitMs(){if((this.#wakeSources.get(ASK_USER_WAKE_SOURCE)??0)<=0)return;let remainingMs2=(this.#askUserDeadlineAtMs??0)-Date.now(),waitMs=remainingMs2>0?remainingMs2:this.#askUserIdleTimeoutMs();return resolveGoalMonitorContinuationDelayMs(waitMs/1e3)}#askUserIdleTimeoutMs(){let minutes=this.#ctx?.getAskUserSettings?.().timeoutMinutes;return(typeof minutes=="number"&&Number.isFinite(minutes)&&minutes>0?minutes:ASK_USER_DEFAULT_TIMEOUT_MINUTES)*6e4}#noteAskUserWait(activeCount,items){if(activeCount<=0){this.#askUserDeadlineAtMs=void 0;return}let deadlines=items?.flatMap(item=>item.deadlineAtMs===void 0?[]:[item.deadlineAtMs])??[];if(deadlines.length>0){this.#askUserDeadlineAtMs=Math.min(...deadlines);return}let previousCount=this.#wakeSources.get(ASK_USER_WAKE_SOURCE)??0;(activeCount>previousCount||this.#askUserDeadlineAtMs===void 0)&&(this.#askUserDeadlineAtMs=Date.now()+this.#askUserIdleTimeoutMs())}#clearWakeSources(){this.#wakeSources.clear(),this.#askUserDeadlineAtMs=void 0}#setWakeSourceCount(source2,activeCount,items){let previousTotal=this.#activeWakeSourceCount(),previousDeadline=this.#askUserDeadlineAtMs;source2===ASK_USER_WAKE_SOURCE&&this.#noteAskUserWait(activeCount,items),this.#wakeSources.set(source2,activeCount);let nextTotal=this.#activeWakeSourceCount();if(previousTotal>0&&nextTotal===0){this.#scheduledContinuationKind==="monitor"?this.#armDrainFire():this.#resetCacheWarmIteration(),this.#resetToollessContinuationStreak();return}if(this.#scheduledContinuationKind==="monitor"){if(previousDeadline!==this.#askUserDeadlineAtMs&&this.#goal!==null){this.#cancelTimer(),this.#schedule(this.#goal,"monitor",!0);return}this.#waitTicker?.setChannelCounts(this.#wakeSourceSnapshot())}}#armDrainFire(){if(this.#directInputHolds.size>0){this.#heldTimer={kind:"monitor",remainingMs:1e3,heldAtMs:Date.now(),totalMs:1e3,drainFire:!0};return}this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledDueAtMs=void 0,this.#waitTicker?.stop(),this.#armTimer("monitor",1e3,1e3,!0)}#activeWakeSourceCount(){let total=0;for(let count2 of this.#wakeSources.values())total+=count2;return total}#wakeSourceSnapshot(){return Object.fromEntries([...this.#wakeSources.entries()].sort(([left],[right])=>left.localeCompare(right)))}liveWakeSources(){return[...this.#wakeSources.entries()].filter(([,count2])=>count2>0).map(([source2])=>source2).sort()}#resetContinuationState(){this.#pendingSystemRecovery=void 0,this.#pendingProviderRecovery=void 0,this.#providerRetryAttempts=0,this.#consecutiveLengthRecoveries.clear(),this.#recentNormalizedOutputHashes=[],this.#recentToolEffects=[],this.#resetToollessContinuationStreak(),this.#resetCacheWarmIteration()}#resetCacheWarmIteration(){this.#cacheWarmIteration=0,this.#scheduledCacheWarmIteration=void 0}#resetToollessContinuationStreak(){this.#toollessContinuationStreak=0,this.#toollessStreakGoalId=null}async fireNow(){if(this.#heldTimer!==void 0)return{fired:!1,reason:"held"};let kind=this.#scheduledContinuationKind;return this.#timer===void 0||kind===void 0?{fired:!1,reason:"not_armed"}:(clearTimeout(this.#timer),await this.#continueIfEligible(kind,this.#armedDrainFire),{fired:!0,kind})}#publish(name,data){publishGoalContinuationEvent(this.#pi,name,data)}#cancelTimer(){let kind=this.#scheduledContinuationKind;this.#scheduledAtMs=void 0,this.#scheduledDueAtMs=void 0,this.#scheduledCache=void 0,this.#scheduledDelayMs=void 0,this.#scheduledCacheWarmIteration=void 0,this.#heldTimer=void 0,this.#timer!==void 0&&clearTimeout(this.#timer),this.#timer=void 0,this.#scheduledContinuationKind=void 0,kind!==void 0&&this.#publish(GOAL_CONTINUATION_TIMER_STATE_EVENT,{armed:!1,kind}),this.#waitTicker?.stop()}};async function reengageGoalAfterReload(options){let{ctx,goal,monitor}=options;if(goal.status!=="active"||deadlineStopPendingSinceLastTurn(ctx.sessionManager.getBranch())!==void 0)return"skipped-inactive";if(monitor.hasActiveWakeSources())return monitor.rearmMonitorBackstop(goal),"backstop-rearmed";let trailingContinuations=options.countTrailingContinuations();return trailingContinuations>=GOAL_CONTINUATION_CAP?(ctx.ui.notify(`Goal auto-continuation suppressed for this resumed session (${trailingContinuations} historical continuations). Send a message to resume.`,"info"),"suppressed-flood"):(await options.queueContinuation(),"continuation-queued")}var GOAL_STOP_PAUSED_ENTRY="goal-stop-paused",GOAL_STOP_RESUMED_ENTRY="goal-stop-resumed";function stopHoldLive(ctx){return ctx.getPauseState?.().holds.some(hold=>hold.kind==="session_hold"&&hold.key!=="interrupted-run")===!0}function markStopPaused(pi,goalId){pi.appendEntry(GOAL_STOP_PAUSED_ENTRY,{goalId})}function markStopResumed(pi,goalId){pi.appendEntry(GOAL_STOP_RESUMED_ENTRY,{goalId})}var stopPausedGoals={initial:()=>new Map,add:(goals,entry2)=>{if(entry2.type!=="custom")return goals;let goalId=entry2.data?.goalId;return typeof goalId!="string"||(entry2.customType===GOAL_STOP_PAUSED_ENTRY?goals.set(goalId,!0):entry2.customType===GOAL_STOP_RESUMED_ENTRY&&goals.set(goalId,!1)),goals}};function pausedByStop(ctx,goalId){return ctx.sessionManager.reduceHistory(stopPausedGoals).get(goalId)===!0}var GOAL_STORE_CHANGED_EVENT="goal_store_changed";function isGoalStoreChangedEvent(data){return typeof data=="object"&&data!==null&&"threadId"in data&&typeof data.threadId=="string"&&data.threadId.length>0}var OBJECTIVE_PREVIEW_WIDTH=120,COLLAPSED_OBJECTIVE_LINES=2,CALL_OBJECTIVE_BUDGET=80,CALL_REASON_BUDGET=60;function renderGoalToolCall(toolName,args,theme2){let title=theme2.fg("toolTitle",theme2.bold(toolName)),params=isRecord2(args)?args:{};if(toolName==="create_goal"&&typeof params.objective=="string"){let preview=objectiveCallPreview(params.objective);return new Text(preview===""?title:`${title} ${theme2.fg("muted",preview)}`,0,0)}if(toolName==="update_goal"&&typeof params.status=="string"){let statusColor2=params.status==="complete"?"success":"error",line=`${title} ${theme2.fg("muted","\u2192")} ${theme2.fg(statusColor2,params.status)}`;return typeof params.reason=="string"&¶ms.reason.trim().length>0&&(line+=theme2.fg("muted",` - ${shorten(params.reason.trim(),CALL_REASON_BUDGET)}`)),new Text(line,0,0)}return new Text(title,0,0)}function renderGoalToolResult(result3,options,theme2){let text3=result3.content.find(block=>block.type==="text")?.text??"",details=resolveRenderDetails(result3.details,text3);if(details===void 0)return new Text(theme2.fg("toolOutput",text3),0,0);if(details.goal===null){let lines2=[theme2.fg("dim","No active goal is set.")];return appendNotice2(lines2,details.notice,theme2),new Text(lines2.join(`
|
|
632
632
|
`),0,0)}let lines=goalWidgetLines(details.goal,options.expanded,theme2);return appendNotice2(lines,details.notice,theme2),new Text(lines.join(`
|
|
633
633
|
`),0,0)}function goalWidgetLines(goal,expanded,theme2){let displayStatus=goalDisplayStatus(goal),status=theme2.fg(statusColor(displayStatus),theme2.bold(`${statusGlyph(displayStatus)} ${goalStatusLabel(goal.status,goal.continuationStoppedAt)}`)),usage3=` \u2022 ${formatTokensCompact(goal.tokensUsed)} tokens \u2022 ${formatGoalElapsedSeconds(goal.timeUsedSeconds)}`,lines=[`${status}${theme2.fg("muted",usage3)}`],objectiveLines=goal.objective.split(`
|
|
634
634
|
`).map(line=>line.trim()).filter(line=>line.length>0);if(expanded)for(let line of objectiveLines)lines.push(theme2.fg("toolOutput",` ${line}`));else{for(let line of objectiveLines.slice(0,COLLAPSED_OBJECTIVE_LINES))lines.push(theme2.fg("toolOutput",` ${shorten(line,OBJECTIVE_PREVIEW_WIDTH)}`));let hidden=objectiveLines.length-COLLAPSED_OBJECTIVE_LINES;hidden>0&&lines.push(theme2.fg("dim",` \u2026 +${hidden} more lines`))}if(goal.blockedReason!==void 0&&goal.blockedReason.length>0&&lines.push(theme2.fg("warning",` \u26A0 ${goal.blockedReason}`)),expanded){let created=isoTimestamp(goal.createdAt),updated=isoTimestamp(goal.updatedAt);lines.push(theme2.fg("dim",` created ${created} \u2022 updated ${updated}`))}return lines}function appendNotice2(lines,notice2,theme2){notice2!==void 0&¬ice2.length>0&&lines.push(theme2.fg("dim",` ${notice2}`))}function resolveRenderDetails(details,text3){let direct=parseRenderDetails(details);if(direct!==void 0)return direct;let trimmed=text3.trim();if(trimmed.startsWith("{"))try{return parseRenderDetails(JSON.parse(trimmed))}catch{return}}function parseRenderDetails(value){if(!isRecord2(value)||!("goal"in value))return;let goal=value.goal,notice2=typeof value.notice=="string"?value.notice:void 0;if(goal===null)return{goal:null,...notice2===void 0?{}:{notice:notice2}};if(isGoalSnapshotLike(goal))return{goal,...notice2===void 0?{}:{notice:notice2}}}function isGoalSnapshotLike(value){return isRecord2(value)&&typeof value.objective=="string"&&typeof value.status=="string"&&GOAL_STATUS_VALUES.includes(value.status)&&typeof value.tokensUsed=="number"&&typeof value.timeUsedSeconds=="number"&&typeof value.createdAt=="number"&&typeof value.updatedAt=="number"&&(value.continuationStoppedAt===void 0||typeof value.continuationStoppedAt=="number"&&Number.isSafeInteger(value.continuationStoppedAt)&&value.continuationStoppedAt>=0)}function statusGlyph(status){switch(status){case"active":return"\u25CF";case"paused":return"\u25CC";case"blocked":return"\u25A0";case"complete":return"\u2713"}}function statusColor(status){switch(status){case"active":return"accent";case"paused":return"muted";case"blocked":return"error";case"complete":return"success"}}function objectiveCallPreview(objective){let lines=objective.split(`
|
|
@@ -716,7 +716,7 @@ Examples:
|
|
|
716
716
|
`),"warning")}function notifyUnknownId(ctx,id,state3){let ids=activeLoopIds(state3),lines=[`No active loop with id "${id}".`];ids.length>0&&lines.push(`Active loops: ${ids.join(", ")}.`),ctx.ui.notify(lines.join(`
|
|
717
717
|
`),"warning")}async function runStop(ctx,deps,target){let resolution=resolveCommandTarget(target,deps.controller.getState());if(resolution.action==="none"){ctx.ui.notify("No active loops.","warning");return}if(resolution.action==="ambiguous"){notifyAmbiguous(ctx,"stop",resolution.ids);return}let affected=await deps.controller.stop(resolution.value,"user-stop");if(resolution.value==="all"){if(affected.length===0){ctx.ui.notify("No active loops.","warning");return}let noun=affected.length===1?"loop":"loops";ctx.ui.notify(`Stopped ${affected.length} ${noun}: ${affected.join(", ")}.`,"info");return}if(affected.length===0){notifyUnknownId(ctx,resolution.value,deps.controller.getState());return}ctx.ui.notify(`Stopped loop ${resolution.value}.`,"info")}async function runPause(ctx,deps,target){let resolution=resolveCommandTarget(target,deps.controller.getState());if(resolution.action==="none"){ctx.ui.notify("No active loops.","warning");return}if(resolution.action==="ambiguous"){notifyAmbiguous(ctx,"pause",resolution.ids);return}let affected=await deps.controller.pause(resolution.value);if(resolution.value==="all"){if(affected.length===0){ctx.ui.notify("No pausable loops.","warning");return}let noun=affected.length===1?"loop":"loops";ctx.ui.notify(`Paused ${affected.length} ${noun}: ${affected.join(", ")}.`,"info");return}if(affected.length===0){ctx.ui.notify(`Loop ${resolution.value} is not pausable (already paused or ended).`,"warning");return}ctx.ui.notify(`Paused loop ${resolution.value}.`,"info")}async function runResume(ctx,deps,target){let resolution=resolveCommandTarget(target,deps.controller.getState());if(resolution.action==="none"){ctx.ui.notify("No active loops.","warning");return}if(resolution.action==="ambiguous"){notifyAmbiguous(ctx,"resume",resolution.ids);return}let affected=await deps.controller.resume(resolution.value);if(resolution.value==="all"){if(affected.length===0){ctx.ui.notify("No paused loops to resume.","warning");return}let noun=affected.length===1?"loop":"loops";ctx.ui.notify(`Resumed ${affected.length} ${noun}: ${affected.join(", ")}.`,"info");return}if(affected.length===0){ctx.ui.notify(`Loop ${resolution.value} is not paused.`,"warning");return}ctx.ui.notify(`Resumed loop ${resolution.value}.`,"info")}async function reportCreateOutcome(ctx,deps,outcome,format2){let entry2=deps.controller.getState().entries[outcome.loopId];ctx.ui.notify(format2(entry2),"info")}async function runLoopCommand(rawArgs,ctx,deps){if(isHeadlessMode(ctx.mode)){ctx.ui.notify(LOOP_HEADLESS_REJECTION,"warning"),process.stderr.write(`${LOOP_HEADLESS_REJECTION}
|
|
718
718
|
`);return}let parsed=parseLoopArgs(rawArgs);try{switch(parsed.kind){case"invalid":{ctx.ui.notify(parsed.usage,"warning");return}case"fixed":{let outcome=await deps.controller.startFixed({originalArgs:parsed.originalArgs,prompt:parsed.prompt,requestedInterval:parsed.interval});if(!outcome.ok){ctx.ui.notify(outcome.message,"error");return}await reportCreateOutcome(ctx,deps,outcome,()=>formatFixedLoopConfirmation(outcome,parsed.interval.raw));return}case"dynamic":{let outcome=await deps.controller.startDynamic({originalArgs:parsed.originalArgs,prompt:parsed.prompt});if(!outcome.ok){ctx.ui.notify(outcome.message,"error");return}await reportCreateOutcome(ctx,deps,outcome,()=>formatDynamicLoopConfirmation(outcome));return}case"bare":{let outcome=await deps.controller.startBare({originalArgs:parsed.originalArgs,...parsed.interval===void 0?{}:{interval:parsed.interval}});if(!outcome.ok){ctx.ui.notify(outcome.message,"error");return}await reportCreateOutcome(ctx,deps,outcome,entry2=>formatBareLoopConfirmation(outcome,entry2));return}case"stop":{await runStop(ctx,deps,parsed.target);return}case"pause":{await runPause(ctx,deps,parsed.target);return}case"resume":{await runResume(ctx,deps,parsed.target);return}case"status":{ctx.ui.notify(formatLoopStatusListing(deps.controller.statusLine(),deps.controller.getState()),"info");return}}}catch(error2){ctx.ui.notify(`/loop command failed: ${error2 instanceof Error?error2.message:String(error2)}`,"error")}}function registerLoopCommand(pi,deps){pi.registerCommand("loop",{description:LOOP_COMMAND_DESCRIPTION,argumentHint:LOOP_ARGUMENT_HINT,requiresArguments:!1,getArgumentCompletions:completeLoopArguments,handler:(rawArgs,ctx)=>runLoopCommand(rawArgs,ctx,deps)})}function pluralize(count2,singular,plural2){return count2===1?`${count2} ${singular}`:`${count2} ${plural2}`}function normalizeInterval(requested){let value,unit,rounded;switch(requested.unit){case"s":{value=Math.max(1,Math.ceil(requested.value/60)),unit="m",rounded=!0;break}case"m":{requested.value>=60?(value=Math.round(requested.value/60),unit="h",rounded=!0):(value=requested.value,unit="m",rounded=!1);break}case"h":{requested.value>=24?(value=Math.round(requested.value/24),unit="d",rounded=!0):(value=requested.value,unit="h",rounded=!1);break}case"d":{value=requested.value,unit="d",rounded=!1;break}}let human=unit==="m"?pluralize(value,"minute","minutes"):unit==="h"?pluralize(value,"hour","hours"):pluralize(value,"day","days"),intervalMs=unit==="m"?value*6e4:unit==="h"?value*36e5:value*864e5,roundingNotice=rounded?`Requested ${requested.raw} rounds to ${human}.`:void 0;return{value,unit,human,rounded,roundingNotice,intervalMs}}function describeCron(effective){switch(effective.unit){case"m":return`*/${effective.value} * * * *`;case"h":return`0 */${effective.value} * * *`;case"d":return`0 0 */${effective.value} * *`}}import{createHash as createHash18}from"node:crypto";import*as fsPromises from"node:fs/promises";var LoopFileError=class extends Error{constructor(message,code,path14,options){super(message,options),this.name="LoopFileError",this.code=code,this.path=path14}},MAX_MODEL_BYTES=25e3,READ_LIMIT=MAX_MODEL_BYTES+1,TRUNCATION_WARNING="[loop.md truncated to the first 25000 bytes]";function isEnoentError(err){return typeof err=="object"&&err!==null&&err.code==="ENOENT"}function sha2562(text3){return createHash18("sha256").update(text3).digest("hex")}function safeUtf8Truncate(buf,maxBytes){let decoder=new TextDecoder("utf-8",{fatal:!0}),slice=buf.subarray(0,maxBytes);for(;slice.length>0;)try{return decoder.decode(slice)}catch{slice=slice.subarray(0,slice.length-1)}return""}async function tryResolveOne(path14,fs8){let stat19;try{stat19=await fs8.stat(path14)}catch(err){return isEnoentError(err)?{found:!1}:{error:new LoopFileError(`Failed to stat loop file ${path14}`,"stat_failed",path14,{cause:err})}}let raw;try{raw=await fs8.readBytes(path14,READ_LIMIT)}catch(err){return isEnoentError(err)?{found:!1}:{error:new LoopFileError(`Failed to read loop file ${path14}`,"read_failed",path14,{cause:err})}}let modelVisible=raw.length>MAX_MODEL_BYTES?`${safeUtf8Truncate(raw,MAX_MODEL_BYTES)}
|
|
719
|
-
${TRUNCATION_WARNING}`:raw.toString("utf-8");return{found:!0,path:path14,content:modelVisible,fingerprint:{path:path14,mtimeMs:stat19.mtimeMs,size:stat19.size,contentHash:sha2562(modelVisible)}}}async function resolveLoopFile(deps){let{cwd,homeDir,fs:fs8,path:path14}=deps,candidates=[path14.join(cwd,CONFIG_DIR_NAME,"loop.md"),path14.join(resolveAgentDir(cwd,homeDir),"loop.md")];for(let candidate of candidates){let outcome=await tryResolveOne(candidate,fs8);if("error"in outcome)throw outcome.error;if(outcome.found)return outcome}return{found:!1}}var nodeFs={stat:path14=>fsPromises.stat(path14),readFile:path14=>fsPromises.readFile(path14),readBytes:async(path14,maxBytes)=>{let handle=await fsPromises.open(path14,"r");try{let buf=Buffer.alloc(maxBytes),{bytesRead}=await handle.read(buf,0,maxBytes,0);return buf.subarray(0,bytesRead)}finally{await handle.close()}}};var LOOP_SENTINELS=["<<autonomous-loop>>","<<autonomous-loop-dynamic>>","<<loop.md>>","<<loop.md-dynamic>>"],LOOP_PHASES=["starting","waiting","queued","running","suspended","ended"],LOOP_END_REASONS=["stopped","keepalive_exhausted","expired","tick_budget_exhausted","error"],REQUESTED_INTERVAL_UNITS=["s","m","h","d"],EFFECTIVE_INTERVAL_UNITS=["m","h","d"],LOOP_WAKE_SOURCE_KINDS=["terminal-monitor","terminal-background-session","task","other"];function isRecord34(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var LOOP_EXPIRY_MS=10080*60*1e3,MAX_ACTIVE_LOOPS=5,DEFAULT_KEEPALIVE_SECONDS=1200,MIN_KEEPALIVE_SECONDS=60,MAX_KEEPALIVE_SECONDS=3600,KEEPALIVE_SECONDS_ENV="SENPI_LOOP_KEEPALIVE_SECONDS",DEFAULT_MAX_TICKS=2e3,MIN_MAX_TICKS=1,MAX_TICKS_ENV="SENPI_LOOP_MAX_TICKS";function isInFlight(entry2){return entry2.phase==="queued"||entry2.phase==="running"}function isActive(entry2){return entry2.phase!=="ended"}function isArmable(entry2){return entry2.phase!=="ended"&&entry2.phase!=="suspended"}function nextOccurrenceAfter(nowMs,intervalMs){return nowMs+intervalMs}function withPhase(entry2,phase,patch={}){let{endedAt:_endedAt,endReason:_endReason,endDetail:_endDetail,...rest}=entry2;return rest.kind==="fixed"?{...rest,...patch,kind:"fixed",phase}:{...rest,...patch,kind:"dynamic",phase}}function fixedWithPhase(entry2,phase,patch={}){let{endedAt:_endedAt,endReason:_endReason,endDetail:_endDetail,...rest}=entry2;return{...rest,...patch,kind:"fixed",phase}}function dynamicWithPhase(entry2,phase,patch={}){let{endedAt:_endedAt,endReason:_endReason,endDetail:_endDetail,...rest}=entry2;return{...rest,...patch,kind:"dynamic",phase}}function readIntEnv(env,name,fallback,min,max){let raw=env[name];if(raw===void 0||raw.trim().length===0)return fallback;let parsed=Number(raw.trim());return Number.isInteger(parsed)?Math.min(max,Math.max(min,parsed)):fallback}function createLoopScheduler(deps){let env=deps.env??process.env,keepaliveSeconds=readIntEnv(env,KEEPALIVE_SECONDS_ENV,DEFAULT_KEEPALIVE_SECONDS,MIN_KEEPALIVE_SECONDS,MAX_KEEPALIVE_SECONDS),maxTicks=readIntEnv(env,MAX_TICKS_ENV,DEFAULT_MAX_TICKS,MIN_MAX_TICKS,Number.MAX_SAFE_INTEGER),state3=deps.initialState??{version:1,sessionId:deps.sessionId,entries:{},activeDynamicId:null,updatedAt:0},mutationCount=0,inFlightDeliveries=new Map;function commit(update2){let entries={...state3.entries},nextDynamicId=update2(entries);state3={version:1,sessionId:state3.sessionId,entries,activeDynamicId:nextDynamicId===void 0?state3.activeDynamicId:nextDynamicId,updatedAt:deps.clock.now()},mutationCount+=1,deps.onStateChanged?.(state3)}function entryOf(loopId){return state3.entries[loopId]}function activeIds(){return Object.values(state3.entries).filter(isActive).map(entry2=>entry2.id)}function endEntry(entries,entry2,nowMs,endReason,endDetail){deps.timers.cancel(entry2.id),inFlightDeliveries.delete(entry2.id);let terminal2={phase:"ended",endedAt:nowMs,endReason,...endDetail===void 0?{}:{endDetail}};entries[entry2.id]=entry2.kind==="fixed"?{...entry2,...terminal2}:{...entry2,...terminal2,pendingWakeup:null}}function armEntry(entries,entry2,nowMs,onFire2){if(nowMs>=entry2.expiresAt)return endEntry(entries,entry2,nowMs,"expired"),"expired";let dueAt=entry2.kind==="fixed"?entry2.nextFireAt:entry2.pendingWakeup?.dueAt;if(dueAt===void 0){deps.timers.cancel(entry2.id);return}if(dueAt>=entry2.expiresAt)return endEntry(entries,entry2,nowMs,"expired"),"expired";deps.timers.arm(entry2.id,dueAt,()=>onFire2(entry2.id))}let fireHandler=()=>{};function onFire(loopId){fireHandler(loopId)}function baseFields(nowMs,id,request2){return{id,originalArgs:request2.originalArgs,reentryPrompt:request2.reentryPrompt,payload:request2.payload,createdAt:nowMs,lastFiredAt:null,expiresAt:nowMs+LOOP_EXPIRY_MS,lastScheduledForAt:null,coalescedFirePending:!1,queuedForAt:null,noopStreak:0,tickCount:0,sentinelDelivery:{autonomousPreambleDelivered:!1,lastLoopFileDelivered:null,forceFullDelivery:!1},wakeSources:[]}}function capRejection(){let active=activeIds();return{ok:!1,reason:"active_loop_cap",cap:MAX_ACTIVE_LOOPS,activeLoopIds:active,message:`At most ${MAX_ACTIVE_LOOPS} loops can be active at once. Active: ${active.join(", ")}. Stop one with \`/loop stop <id>\` or \`/loop stop all\` first.`}}function createFixed(request2){if(activeIds().length>=MAX_ACTIVE_LOOPS)return capRejection();let nowMs=deps.clock.now(),id=deps.ids.loopId();return commit(entries=>{let entry2={...baseFields(nowMs,id,request2),kind:"fixed",phase:"waiting",requestedInterval:request2.requestedInterval,effectiveInterval:request2.effectiveInterval,cronExpression:request2.cronExpression,nextFireAt:nextOccurrenceAfter(nowMs,request2.intervalMs),intervalMs:request2.intervalMs};entries[id]=entry2,armEntry(entries,entry2,nowMs,onFire)}),{ok:!0,loopId:id}}function createDynamic(request2){let existingDynamicId=state3.activeDynamicId,existing2=existingDynamicId===null?void 0:entryOf(existingDynamicId),supersedes=existing2!==void 0&&isActive(existing2);if(activeIds().filter(id2=>!(supersedes&&id2===existingDynamicId)).length>=MAX_ACTIVE_LOOPS)return capRejection();let nowMs=deps.clock.now(),id=deps.ids.loopId();return commit(entries=>{supersedes&&existing2!==void 0&&endEntry(entries,existing2,nowMs,"stopped","superseded");let entry2={...baseFields(nowMs,id,request2),kind:"dynamic",phase:"waiting",pendingWakeup:null,keepaliveCredit:1};return entries[id]=entry2,id}),supersedes&&existingDynamicId!==null?{ok:!0,loopId:id,supersededLoopId:existingDynamicId}:{ok:!0,loopId:id}}function onDue(loopId,nowMs,sessionBusy,held=!1){let entry2=entryOf(loopId);if(entry2===void 0)return{action:"coalesce"};if(nowMs>=entry2.expiresAt)return entry2.phase==="ended"?{action:"coalesce"}:(commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{action:"expire"});if(entry2.phase==="ended"||entry2.phase==="suspended")return{action:"coalesce"};if(entry2.tickCount>=maxTicks)return{action:"coalesce"};if(isInFlight(entry2))return commit(entries=>{let coalesced=entry2.kind==="fixed"?fixedWithPhase(entry2,entry2.phase,{coalescedFirePending:!0,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,entry2.phase,{coalescedFirePending:!0});entries[loopId]=coalesced,armEntry(entries,coalesced,nowMs,onFire)}),{action:"coalesce"};let deliveryId=deps.ids.deliveryId(),tick={loopId,deliveryId,scheduledForAt:nowMs,deliverAs:"steer",coalesced:entry2.coalescedFirePending},expired=!1;return commit(entries=>{let dispatched={lastFiredAt:nowMs,lastScheduledForAt:nowMs,queuedForAt:nowMs,coalescedFirePending:!1,tickCount:entry2.tickCount+(held?0:1)},phase=sessionBusy?"queued":"running",next=entry2.kind==="fixed"?fixedWithPhase(entry2,phase,{...dispatched,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,phase,{...dispatched,pendingWakeup:null});entries[loopId]=next,next.kind==="fixed"?expired=armEntry(entries,next,nowMs,onFire)==="expired":deps.timers.cancel(loopId)}),expired||inFlightDeliveries.set(loopId,deliveryId),{action:"dispatch",tick}}function onTickSettled(input){let entry2=entryOf(input.loopId);if(entry2===void 0)return{action:"ignored"};if(input.outcome==="retrying")return{action:"in_progress"};if(inFlightDeliveries.get(input.loopId)!==input.deliveryId)return{action:"ignored"};if(inFlightDeliveries.delete(input.loopId),entry2.phase==="ended")return{action:"ignored"};if(entry2.phase==="suspended")return{action:"idle"};let nowMs=deps.clock.now();if(nowMs>=entry2.expiresAt)return commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{action:"ended",endReason:"expired"};if(entry2.tickCount>=maxTicks)return commit(entries=>{endEntry(entries,entry2,nowMs,"tick_budget_exhausted")}),{action:"ended",endReason:"tick_budget_exhausted"};if(entry2.coalescedFirePending)return commit(entries=>{entries[input.loopId]=withPhase(entry2,"waiting",{coalescedFirePending:!1,queuedForAt:null})}),onDue(input.loopId,nowMs,!1);let expired=!1;return commit(entries=>{let settled2=withPhase(entry2,"waiting",{queuedForAt:null});entries[input.loopId]=settled2,settled2.kind==="fixed"&&(expired=armEntry(entries,settled2,nowMs,onFire)==="expired")}),expired?{action:"ended",endReason:"expired"}:{action:"idle"}}function onScheduleWakeup(request2){let entry2=entryOf(request2.loopId);if(entry2===void 0)return{ok:!1,reason:"unknown_loop"};if(entry2.kind!=="dynamic")return{ok:!1,reason:"not_dynamic"};if(entry2.phase==="ended")return{ok:!1,reason:"ended"};let nowMs=deps.clock.now();if(nowMs>=entry2.expiresAt)return commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{ok:!1,reason:"expired"};let wakeupId=deps.ids.wakeupId(),replacedWakeupId=entry2.pendingWakeup?.id,dueAt=nowMs+request2.delaySeconds*1e3,wakeup={id:wakeupId,loopId:entry2.id,kind:"dynamic",source:"model",requestedDelaySeconds:request2.requestedDelaySeconds,delaySeconds:request2.delaySeconds,dueAt,reason:request2.reason,prompt:request2.prompt,noop:request2.noop,createdAt:nowMs},noopStreak=request2.noop?entry2.noopStreak+1:0;return commit(entries=>{let scheduled=dynamicWithPhase(entry2,"waiting",{queuedForAt:null,pendingWakeup:wakeup,keepaliveCredit:1,noopStreak});entries[entry2.id]=scheduled,armEntry(entries,scheduled,nowMs,onFire)}),replacedWakeupId===void 0?{ok:!0,wakeupId,dueAt,noopStreak}:{ok:!0,wakeupId,replacedWakeupId,dueAt,noopStreak}}function onTurnEndedWithoutSchedule(loopId,options){let chargeCredit=options?.chargeCredit??!0,entry2=entryOf(loopId);if(entry2===void 0||entry2.kind!=="dynamic")return{action:"ignored"};if(entry2.phase==="ended"||entry2.phase==="suspended")return{action:"ignored"};let nowMs=deps.clock.now();if(nowMs>=entry2.expiresAt)return commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{action:"ended",endReason:"expired"};if(chargeCredit&&entry2.keepaliveCredit===0)return commit(entries=>{endEntry(entries,entry2,nowMs,"keepalive_exhausted")}),{action:"ended",endReason:"keepalive_exhausted"};let wakeupId=deps.ids.wakeupId(),dueAt=nowMs+keepaliveSeconds*1e3,wakeup={id:wakeupId,loopId:entry2.id,kind:"dynamic",source:"keepalive",requestedDelaySeconds:keepaliveSeconds,delaySeconds:keepaliveSeconds,dueAt,reason:"keepalive armed (model did not reschedule)",prompt:entry2.reentryPrompt,noop:!1,createdAt:nowMs},expired=!1;return commit(entries=>{let armed=dynamicWithPhase(entry2,"waiting",{queuedForAt:null,pendingWakeup:wakeup,keepaliveCredit:chargeCredit?0:entry2.keepaliveCredit});entries[entry2.id]=armed,expired=armEntry(entries,armed,nowMs,onFire)==="expired"}),expired?{action:"ended",endReason:"expired"}:{action:"keepalive_armed",wakeupId,delaySeconds:keepaliveSeconds,dueAt}}function pauseEntries(ids){let affected=[],pausable=ids.map(id=>entryOf(id)).filter(entry2=>entry2!==void 0&&isArmable(entry2));return pausable.length===0||commit(entries=>{for(let entry2 of pausable)deps.timers.cancel(entry2.id),inFlightDeliveries.delete(entry2.id),entries[entry2.id]=withPhase(entry2,"suspended",{queuedForAt:null}),affected.push(entry2.id)}),affected}function resolveTargets2(target){return target!=="all"?[target]:Object.values(state3.entries).map(entry2=>entry2.id)}function pause(target){return{affectedLoopIds:pauseEntries(resolveTargets2(target))}}function onUserAbort(loopId){return{action:pauseEntries([loopId]).length>0?"paused":"ignored"}}function resume(target){let nowMs=deps.clock.now(),resumable=resolveTargets2(target).map(id=>entryOf(id)).filter(entry2=>entry2!==void 0&&entry2.phase==="suspended");if(resumable.length===0)return{affectedLoopIds:[]};let affected=[];return commit(entries=>{for(let entry2 of resumable){let rearmed=entry2.kind==="fixed"?fixedWithPhase(entry2,"waiting",{queuedForAt:null,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,"waiting",{queuedForAt:null,pendingWakeup:entry2.pendingWakeup===null?null:{...entry2.pendingWakeup,dueAt:Math.max(entry2.pendingWakeup.dueAt,nowMs)}});entries[entry2.id]=rearmed,armEntry(entries,rearmed,nowMs,onFire),affected.push(entry2.id)}}),{affectedLoopIds:affected}}function stop(target,detail){let nowMs=deps.clock.now(),stoppable=resolveTargets2(target).map(id=>entryOf(id)).filter(entry2=>entry2!==void 0&&isActive(entry2));if(stoppable.length===0)return{affectedLoopIds:[]};let affected=[],clearDynamic=!1;return commit(entries=>{for(let entry2 of stoppable)endEntry(entries,entry2,nowMs,"stopped",detail),entry2.id===state3.activeDynamicId&&(clearDynamic=!0),affected.push(entry2.id);return clearDynamic?null:void 0}),{affectedLoopIds:affected}}function onShutdown(){let suspendable=Object.values(state3.entries).filter(isArmable);if(deps.timers.cancelAll(),suspendable.length===0)return{suspendedLoopIds:[]};let suspended=[];return commit(entries=>{for(let entry2 of suspendable)entries[entry2.id]=withPhase(entry2,"suspended",{queuedForAt:null}),suspended.push(entry2.id)}),inFlightDeliveries.clear(),{suspendedLoopIds:suspended}}function restore(nowMs,options={}){let recoveryTicks=[],expiredLoopIds=[],rearmedLoopIds=[],stillPausedLoopIds=[],userPaused=new Set(options.userPausedLoopIds??[]),liveDeliveries=new Set(inFlightDeliveries.keys());return deps.timers.cancelAll(),commit(entries=>{for(let entry2 of Object.values(state3.entries)){if(entry2.phase==="ended"||liveDeliveries.has(entry2.id))continue;if(userPaused.has(entry2.id)){entries[entry2.id]=withPhase(entry2,"suspended",{queuedForAt:null}),stillPausedLoopIds.push(entry2.id);continue}if(nowMs>=entry2.expiresAt){endEntry(entries,entry2,nowMs,"expired"),expiredLoopIds.push(entry2.id);continue}let dueAt=entry2.kind==="fixed"?entry2.nextFireAt:entry2.pendingWakeup?.dueAt,overdue=dueAt!==void 0&&dueAt<=nowMs,crashRemnant=isInFlight(entry2)||entry2.phase==="starting",needsRecovery=(overdue||crashRemnant||entry2.coalescedFirePending)&&entry2.tickCount<maxTicks,recovered2=entry2.kind==="fixed"?fixedWithPhase(entry2,"waiting",{queuedForAt:null,coalescedFirePending:!1,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,"waiting",{queuedForAt:null,coalescedFirePending:!1,pendingWakeup:overdue?null:entry2.pendingWakeup});if(entries[entry2.id]=recovered2,armEntry(entries,recovered2,nowMs,onFire)==="expired"){expiredLoopIds.push(entry2.id);continue}if(needsRecovery){let deliveryId=deps.ids.deliveryId();recoveryTicks.push({loopId:entry2.id,deliveryId,scheduledForAt:nowMs,deliverAs:"steer",coalesced:!0})}rearmedLoopIds.push(entry2.id)}}),recoveryTicks.length>0&&commit(entries=>{for(let tick of recoveryTicks){let entry2=entries[tick.loopId];entry2===void 0||entry2.phase==="ended"||(entries[tick.loopId]=withPhase(entry2,"queued",{lastFiredAt:nowMs,lastScheduledForAt:nowMs,queuedForAt:nowMs,tickCount:entry2.tickCount+1}),inFlightDeliveries.set(tick.loopId,tick.deliveryId))}}),{recoveryTicks,expiredLoopIds,rearmedLoopIds,stillPausedLoopIds}}let scheduler={getState:()=>state3,get mutationCount(){return mutationCount},maxTicks,keepaliveSeconds,currentDeliveryId:loopId=>inFlightDeliveries.get(loopId),createFixed,createDynamic,onDue,onTickSettled,onScheduleWakeup,onTurnEndedWithoutSchedule,onUserAbort,pause,resume,stop,onShutdown,restore};return fireHandler=loopId=>{let owner=deps.onFire;if(owner!==void 0){owner(loopId);return}scheduler.onDue(loopId,deps.clock.now(),!1)},scheduler}function sessionHeld(ctx){return ctx.getPauseState?.().holds.some(hold=>hold.kind!=="run_fence")===!0}function userStopped(ctx){return ctx.getPauseState?.().holds.some(hold=>hold.kind==="session_hold")===!0}var LOOP_STATUS_KEY="loop";function isArmed(entry2){return entry2.phase!=="ended"}function formatDuration2(ms){let totalSeconds=Math.max(0,Math.floor(ms/1e3));if(totalSeconds<60)return`${totalSeconds}s`;let minutes=Math.floor(totalSeconds/60);if(minutes<60){let seconds2=totalSeconds%60;return seconds2>0?`${minutes}m${seconds2}s`:`${minutes}m`}let hours=Math.floor(minutes/60);if(hours<24){let mins=minutes%60;return mins>0?`${hours}h${mins}m`:`${hours}h`}let days=Math.floor(hours/24),hrs=hours%24;return hrs>0?`${days}d${hrs}h`:`${days}d`}function nextDueAt(entry2){if(!(entry2.phase==="suspended"||entry2.phase==="ended"))return entry2.kind==="fixed"?entry2.nextFireAt:entry2.pendingWakeup?.dueAt}function formatLoopStatus(state3,nowMs){let armed=Object.values(state3.entries).filter(isArmed);if(armed.length===0)return;if(armed.some(entry2=>entry2.phase==="suspended"))return"Loop paused - /loop resume or /loop stop";let nearest;for(let entry2 of armed){if(entry2.phase==="suspended")continue;let dueAt=nextDueAt(entry2);dueAt!==void 0&&(nearest===void 0||dueAt<nearest.dueAt)&&(nearest={entry:entry2,dueAt})}if(nearest===void 0)return"Loop active - /loop stop";let remainingMs2=Math.max(0,nearest.dueAt-nowMs);return`Loop (${nearest.entry.kind==="fixed"?"fixed":"dynamic"}): next in ${formatDuration2(remainingMs2)} - /loop stop`}function formatNoopFold(noopStreak){return noopStreak<2?"":`\u21BB ${noopStreak} loop ticks with no actionable change`}var LoopStatusTicker=class{constructor(options){this.render=options.render,this.now=options.now??Date.now}get running(){return this.timeoutId!==void 0}sync(state3){this.state=state3,this.lastRendered=void 0,this.tick(),this.scheduleNext()}dispose(){this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0),this.state=void 0,this.lastRendered=void 0,this.render(LOOP_STATUS_KEY,void 0)}scheduleNext(){this.timeoutId!==void 0&&clearTimeout(this.timeoutId);let handle=setTimeout(()=>{this.timeoutId=void 0,this.tick(),this.state!==void 0&&this.scheduleNext()},1e3);handle.unref(),this.timeoutId=handle}tick(){if(this.state===void 0)return;let text3=formatLoopStatus(this.state,this.now());text3!==this.lastRendered&&(this.lastRendered=text3,this.render(LOOP_STATUS_KEY,text3))}};var InvalidLoopStoreError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidLoopStoreError"}},UnsupportedLoopStoreVersionError=class extends UnsupportedSidecarStoreVersionError{constructor(message){super(message),this.name="UnsupportedLoopStoreVersionError"}},stores=new Map;function loopStateFilePath(ref){return sidecarFilePath(ref)}function storeFor(ref){let filePath=loopStateFilePath(ref),existing2=stores.get(filePath);if(existing2!==void 0)return existing2;let store=createSidecarStore({baseDir:ref.baseDir,sessionId:ref.sessionId,version:1,tempPrefix:"loop",parse:parseLoopPayload});return stores.set(filePath,store),store}function remapLoopStoreError(error2){throw error2 instanceof InvalidLoopStoreError||error2 instanceof UnsupportedLoopStoreVersionError?error2:error2 instanceof UnsupportedSidecarStoreVersionError?new UnsupportedLoopStoreVersionError(error2.message.replaceAll("sidecar store","loop store")):error2 instanceof InvalidSidecarStoreError?new InvalidLoopStoreError(error2.message.replaceAll("sidecar store","loop store"),{cause:error2}):error2}async function readLoopState(ref){try{return await storeFor(ref).read()}catch(error2){remapLoopStoreError(error2)}}async function writeLoopState(ref,state3){await storeFor(ref).write(state3)}function parseLoopPayload(raw,ref){if(!isRecord34(raw))throw new InvalidLoopStoreError("loop store must be a JSON object");if(!isEpochMs(raw.updatedAt))throw new InvalidLoopStoreError("loop store has an invalid updatedAt");if(!isRecord34(raw.entries))throw new InvalidLoopStoreError("loop store entries must be an object");let entries={};for(let[id,value]of Object.entries(raw.entries)){let entry2=parseEntry(id,value);entries[id]=entry2}let activeDynamicId=raw.activeDynamicId;if(activeDynamicId!==null){if(typeof activeDynamicId!="string")throw new InvalidLoopStoreError("loop store activeDynamicId must be a string or null");let active=entries[activeDynamicId];if(active===void 0||active.kind!=="dynamic")throw new InvalidLoopStoreError(`loop store activeDynamicId ${activeDynamicId} does not name a dynamic loop`)}return{version:1,sessionId:ref.sessionId,entries,activeDynamicId,updatedAt:raw.updatedAt}}function parseEntry(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} is not an object`);if(value.id!==id)throw new InvalidLoopStoreError(`loop entry ${id} carries a mismatched id`);let kind=value.kind;if(kind!=="fixed"&&kind!=="dynamic")throw new InvalidLoopStoreError(`loop entry ${id} has an unknown kind`);let base=parseEntryFields(id,value);if(kind==="fixed")return{...base,kind:"fixed",requestedInterval:parseRequestedInterval(id,value.requestedInterval),effectiveInterval:parseEffectiveInterval(id,value.effectiveInterval),cronExpression:requireString(id,"cronExpression",value.cronExpression),nextFireAt:requireEpochMs(id,"nextFireAt",value.nextFireAt),intervalMs:requirePositiveInteger(id,"intervalMs",value.intervalMs)};let keepaliveCredit=value.keepaliveCredit;if(keepaliveCredit!==0&&keepaliveCredit!==1)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid keepaliveCredit`);return{...base,kind:"dynamic",pendingWakeup:parsePendingWakeup(id,value.pendingWakeup),keepaliveCredit}}function parseEntryFields(id,value){return{...{id,originalArgs:requireString(id,"originalArgs",value.originalArgs,{allowEmpty:!0}),reentryPrompt:requireString(id,"reentryPrompt",value.reentryPrompt),payload:parsePayload2(id,value.payload),createdAt:requireEpochMs(id,"createdAt",value.createdAt),lastFiredAt:parseNullableEpochMs(id,"lastFiredAt",value.lastFiredAt),expiresAt:requireEpochMs(id,"expiresAt",value.expiresAt),lastScheduledForAt:parseNullableEpochMs(id,"lastScheduledForAt",value.lastScheduledForAt),coalescedFirePending:requireBoolean(id,"coalescedFirePending",value.coalescedFirePending),queuedForAt:parseNullableEpochMs(id,"queuedForAt",value.queuedForAt),noopStreak:requireNonNegativeInteger(id,"noopStreak",value.noopStreak),tickCount:requireNonNegativeInteger(id,"tickCount",value.tickCount),sentinelDelivery:parseSentinelDelivery(id,value.sentinelDelivery),wakeSources:parseWakeSources(id,value.wakeSources)},...parseLifecycle(id,value)}}function parseLifecycle(id,value){let phase=value.phase;if(typeof phase!="string"||!isLoopPhase(phase))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid phase`);if(phase!=="ended"){if(value.endedAt!==void 0||value.endReason!==void 0||value.endDetail!==void 0)throw new InvalidLoopStoreError(`loop entry ${id} carries terminal fields while not ended`);return{phase}}let endReason=value.endReason;if(typeof endReason!="string"||!isLoopEndReason(endReason))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid endReason`);let endDetail=value.endDetail;if(endDetail!==void 0&&typeof endDetail!="string")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid endDetail`);return{phase:"ended",endedAt:requireEpochMs(id,"endedAt",value.endedAt),endReason,...endDetail===void 0?{}:{endDetail}}}function parsePayload2(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid payload`);if(value.type==="prompt")return{type:"prompt",prompt:requireString(id,"payload.prompt",value.prompt)};if(value.type==="sentinel"){let sentinel=value.sentinel;if(typeof sentinel!="string"||!isLoopSentinel(sentinel))throw new InvalidLoopStoreError(`loop entry ${id} has an unknown payload sentinel`);return{type:"sentinel",sentinel}}throw new InvalidLoopStoreError(`loop entry ${id} has an unknown payload type`)}function parseSentinelDelivery(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid sentinelDelivery`);return{autonomousPreambleDelivered:requireBoolean(id,"sentinelDelivery.autonomousPreambleDelivered",value.autonomousPreambleDelivered),lastLoopFileDelivered:parseFingerprint(id,value.lastLoopFileDelivered),forceFullDelivery:requireBoolean(id,"sentinelDelivery.forceFullDelivery",value.forceFullDelivery)}}function parseFingerprint(id,value){if(value===null)return null;if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid loop-file fingerprint`);return{path:requireString(id,"fingerprint.path",value.path),mtimeMs:requireFiniteNumber(id,"fingerprint.mtimeMs",value.mtimeMs),size:requireNonNegativeInteger(id,"fingerprint.size",value.size),contentHash:requireString(id,"fingerprint.contentHash",value.contentHash),anchorDeliveryId:requireString(id,"fingerprint.anchorDeliveryId",value.anchorDeliveryId)}}function parseWakeSources(id,value){if(!Array.isArray(value))throw new InvalidLoopStoreError(`loop entry ${id} has invalid wakeSources`);return value.map(candidate=>{if(!isRecord34(candidate))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source`);let source2=candidate.source;if(typeof source2!="string"||!isWakeSourceKind(source2))throw new InvalidLoopStoreError(`loop entry ${id} has an unknown wake source kind`);let description=candidate.description;if(description!==void 0&&typeof description!="string")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source description`);return{source:source2,id:requireString(id,"wakeSource.id",candidate.id),createdAt:requireEpochMs(id,"wakeSource.createdAt",candidate.createdAt),...description===void 0?{}:{description}}})}function parsePendingWakeup(id,value){if(value==null)return null;if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup`);let source2=value.source;if(source2!=="model"&&source2!=="keepalive")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup source`);if(value.kind!=="dynamic")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup kind`);return{id:requireString(id,"pendingWakeup.id",value.id),loopId:requireString(id,"pendingWakeup.loopId",value.loopId),kind:"dynamic",source:source2,requestedDelaySeconds:requireFiniteNumber(id,"pendingWakeup.requestedDelaySeconds",value.requestedDelaySeconds),delaySeconds:requirePositiveInteger(id,"pendingWakeup.delaySeconds",value.delaySeconds),dueAt:requireEpochMs(id,"pendingWakeup.dueAt",value.dueAt),reason:requireString(id,"pendingWakeup.reason",value.reason),prompt:requireString(id,"pendingWakeup.prompt",value.prompt),noop:requireBoolean(id,"pendingWakeup.noop",value.noop),createdAt:requireEpochMs(id,"pendingWakeup.createdAt",value.createdAt)}}function parseRequestedInterval(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval`);let unit=value.unit;if(typeof unit!="string"||!isRequestedIntervalUnit(unit))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval unit`);return{value:requirePositiveInteger(id,"requestedInterval.value",value.value),unit,raw:requireString(id,"requestedInterval.raw",value.raw)}}function parseEffectiveInterval(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval`);let unit=value.unit;if(typeof unit!="string"||!isEffectiveIntervalUnit(unit))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval unit`);let roundingNotice=value.roundingNotice;if(roundingNotice!==void 0&&typeof roundingNotice!="string")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval roundingNotice`);return{value:requirePositiveInteger(id,"effectiveInterval.value",value.value),unit,human:requireString(id,"effectiveInterval.human",value.human),rounded:requireBoolean(id,"effectiveInterval.rounded",value.rounded),...roundingNotice===void 0?{}:{roundingNotice}}}function requireString(id,field3,value,options){if(typeof value!="string"||options?.allowEmpty!==!0&&value.length===0)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireBoolean(id,field3,value){if(typeof value!="boolean")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireFiniteNumber(id,field3,value){if(typeof value!="number"||!Number.isFinite(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireNonNegativeInteger(id,field3,value){if(!Number.isSafeInteger(value)||value<0)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requirePositiveInteger(id,field3,value){if(!Number.isSafeInteger(value)||value<=0)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireEpochMs(id,field3,value){if(!isEpochMs(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function parseNullableEpochMs(id,field3,value){return value==null?null:requireEpochMs(id,field3,value)}function isEpochMs(value){return Number.isSafeInteger(value)&&value>=0}function isLoopPhase(value){return LOOP_PHASES.includes(value)}function isLoopEndReason(value){return LOOP_END_REASONS.includes(value)}function isLoopSentinel(value){return LOOP_SENTINELS.includes(value)}function isWakeSourceKind(value){return LOOP_WAKE_SOURCE_KINDS.includes(value)}function isRequestedIntervalUnit(value){return REQUESTED_INTERVAL_UNITS.includes(value)}function isEffectiveIntervalUnit(value){return EFFECTIVE_INTERVAL_UNITS.includes(value)}var LOOP_FILE_HEADER="# /loop tick - loop.md tasks",AUTONOMOUS_HEADER="# Autonomous loop tick",DYNAMIC_PACING_SUFFIX=" (dynamic pacing)",FIXED_RESCHEDULE_RULE=["The fixed recurring schedule fires the next tick automatically - do not call `schedule_wakeup` from this tick.","If this tick errors, the schedule stays armed and the next occurrence still fires."].join(`
|
|
719
|
+
${TRUNCATION_WARNING}`:raw.toString("utf-8");return{found:!0,path:path14,content:modelVisible,fingerprint:{path:path14,mtimeMs:stat19.mtimeMs,size:stat19.size,contentHash:sha2562(modelVisible)}}}async function resolveLoopFile(deps){let{cwd,homeDir,fs:fs8,path:path14}=deps,candidates=[path14.join(cwd,CONFIG_DIR_NAME,"loop.md"),path14.join(resolveAgentDir(cwd,homeDir),"loop.md")];for(let candidate of candidates){let outcome=await tryResolveOne(candidate,fs8);if("error"in outcome)throw outcome.error;if(outcome.found)return outcome}return{found:!1}}var nodeFs={stat:path14=>fsPromises.stat(path14),readFile:path14=>fsPromises.readFile(path14),readBytes:async(path14,maxBytes)=>{let handle=await fsPromises.open(path14,"r");try{let buf=Buffer.alloc(maxBytes),{bytesRead}=await handle.read(buf,0,maxBytes,0);return buf.subarray(0,bytesRead)}finally{await handle.close()}}};var LOOP_SENTINELS=["<<autonomous-loop>>","<<autonomous-loop-dynamic>>","<<loop.md>>","<<loop.md-dynamic>>"],LOOP_PHASES=["starting","waiting","queued","running","suspended","ended"],LOOP_END_REASONS=["stopped","keepalive_exhausted","expired","tick_budget_exhausted","error"],REQUESTED_INTERVAL_UNITS=["s","m","h","d"],EFFECTIVE_INTERVAL_UNITS=["m","h","d"],LOOP_WAKE_SOURCE_KINDS=["terminal-monitor","terminal-background-session","task","other"];function isRecord34(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var LOOP_EXPIRY_MS=10080*60*1e3,MAX_ACTIVE_LOOPS=5,DEFAULT_KEEPALIVE_SECONDS=1200,MIN_KEEPALIVE_SECONDS=60,MAX_KEEPALIVE_SECONDS=3600,KEEPALIVE_SECONDS_ENV="SENPI_LOOP_KEEPALIVE_SECONDS",DEFAULT_MAX_TICKS=2e3,MIN_MAX_TICKS=1,MAX_TICKS_ENV="SENPI_LOOP_MAX_TICKS";function isInFlight(entry2){return entry2.phase==="queued"||entry2.phase==="running"}function isActive(entry2){return entry2.phase!=="ended"}function isArmable(entry2){return entry2.phase!=="ended"&&entry2.phase!=="suspended"}function nextOccurrenceAfter(nowMs,intervalMs){return nowMs+intervalMs}function withPhase(entry2,phase,patch={}){let{endedAt:_endedAt,endReason:_endReason,endDetail:_endDetail,...rest}=entry2;return rest.kind==="fixed"?{...rest,...patch,kind:"fixed",phase}:{...rest,...patch,kind:"dynamic",phase}}function fixedWithPhase(entry2,phase,patch={}){let{endedAt:_endedAt,endReason:_endReason,endDetail:_endDetail,...rest}=entry2;return{...rest,...patch,kind:"fixed",phase}}function dynamicWithPhase(entry2,phase,patch={}){let{endedAt:_endedAt,endReason:_endReason,endDetail:_endDetail,...rest}=entry2;return{...rest,...patch,kind:"dynamic",phase}}function readIntEnv(env,name,fallback,min,max){let raw=env[name];if(raw===void 0||raw.trim().length===0)return fallback;let parsed=Number(raw.trim());return Number.isInteger(parsed)?Math.min(max,Math.max(min,parsed)):fallback}function createLoopScheduler(deps){let env=deps.env??process.env,keepaliveSeconds=readIntEnv(env,KEEPALIVE_SECONDS_ENV,DEFAULT_KEEPALIVE_SECONDS,MIN_KEEPALIVE_SECONDS,MAX_KEEPALIVE_SECONDS),maxTicks=readIntEnv(env,MAX_TICKS_ENV,DEFAULT_MAX_TICKS,MIN_MAX_TICKS,Number.MAX_SAFE_INTEGER),state3=deps.initialState??{version:1,sessionId:deps.sessionId,entries:{},activeDynamicId:null,updatedAt:0},mutationCount=0,inFlightDeliveries=new Map;function commit(update2){let entries={...state3.entries},nextDynamicId=update2(entries);state3={version:1,sessionId:state3.sessionId,entries,activeDynamicId:nextDynamicId===void 0?state3.activeDynamicId:nextDynamicId,updatedAt:deps.clock.now()},mutationCount+=1,deps.onStateChanged?.(state3)}function entryOf(loopId){return state3.entries[loopId]}function activeIds(){return Object.values(state3.entries).filter(isActive).map(entry2=>entry2.id)}function endEntry(entries,entry2,nowMs,endReason,endDetail){deps.timers.cancel(entry2.id),inFlightDeliveries.delete(entry2.id);let terminal2={phase:"ended",endedAt:nowMs,endReason,...endDetail===void 0?{}:{endDetail}};entries[entry2.id]=entry2.kind==="fixed"?{...entry2,...terminal2}:{...entry2,...terminal2,pendingWakeup:null}}function armEntry(entries,entry2,nowMs,onFire2){if(nowMs>=entry2.expiresAt)return endEntry(entries,entry2,nowMs,"expired"),"expired";let dueAt=entry2.kind==="fixed"?entry2.nextFireAt:entry2.pendingWakeup?.dueAt;if(dueAt===void 0){deps.timers.cancel(entry2.id);return}if(dueAt>=entry2.expiresAt)return endEntry(entries,entry2,nowMs,"expired"),"expired";deps.timers.arm(entry2.id,dueAt,()=>onFire2(entry2.id))}let fireHandler=()=>{};function onFire(loopId){fireHandler(loopId)}function baseFields(nowMs,id,request2){return{id,originalArgs:request2.originalArgs,reentryPrompt:request2.reentryPrompt,payload:request2.payload,createdAt:nowMs,lastFiredAt:null,expiresAt:nowMs+LOOP_EXPIRY_MS,lastScheduledForAt:null,coalescedFirePending:!1,queuedForAt:null,noopStreak:0,tickCount:0,sentinelDelivery:{autonomousPreambleDelivered:!1,lastLoopFileDelivered:null,forceFullDelivery:!1},wakeSources:[]}}function capRejection(){let active=activeIds();return{ok:!1,reason:"active_loop_cap",cap:MAX_ACTIVE_LOOPS,activeLoopIds:active,message:`At most ${MAX_ACTIVE_LOOPS} loops can be active at once. Active: ${active.join(", ")}. Stop one with \`/loop stop <id>\` or \`/loop stop all\` first.`}}function createFixed(request2){if(activeIds().length>=MAX_ACTIVE_LOOPS)return capRejection();let nowMs=deps.clock.now(),id=deps.ids.loopId();return commit(entries=>{let entry2={...baseFields(nowMs,id,request2),kind:"fixed",phase:"waiting",requestedInterval:request2.requestedInterval,effectiveInterval:request2.effectiveInterval,cronExpression:request2.cronExpression,nextFireAt:nextOccurrenceAfter(nowMs,request2.intervalMs),intervalMs:request2.intervalMs};entries[id]=entry2,armEntry(entries,entry2,nowMs,onFire)}),{ok:!0,loopId:id}}function createDynamic(request2){let existingDynamicId=state3.activeDynamicId,existing2=existingDynamicId===null?void 0:entryOf(existingDynamicId),supersedes=existing2!==void 0&&isActive(existing2);if(activeIds().filter(id2=>!(supersedes&&id2===existingDynamicId)).length>=MAX_ACTIVE_LOOPS)return capRejection();let nowMs=deps.clock.now(),id=deps.ids.loopId();return commit(entries=>{supersedes&&existing2!==void 0&&endEntry(entries,existing2,nowMs,"stopped","superseded");let entry2={...baseFields(nowMs,id,request2),kind:"dynamic",phase:"waiting",pendingWakeup:null,keepaliveCredit:1};return entries[id]=entry2,id}),supersedes&&existingDynamicId!==null?{ok:!0,loopId:id,supersededLoopId:existingDynamicId}:{ok:!0,loopId:id}}function onDue(loopId,nowMs,sessionBusy,held=!1){let entry2=entryOf(loopId);if(entry2===void 0)return{action:"coalesce"};if(nowMs>=entry2.expiresAt)return entry2.phase==="ended"?{action:"coalesce"}:(commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{action:"expire"});if(entry2.phase==="ended"||entry2.phase==="suspended")return{action:"coalesce"};if(entry2.tickCount>=maxTicks)return{action:"coalesce"};if(isInFlight(entry2))return commit(entries=>{let coalesced=entry2.kind==="fixed"?fixedWithPhase(entry2,entry2.phase,{coalescedFirePending:!0,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,entry2.phase,{coalescedFirePending:!0});entries[loopId]=coalesced,armEntry(entries,coalesced,nowMs,onFire)}),{action:"coalesce"};let deliveryId=deps.ids.deliveryId(),tick={loopId,deliveryId,scheduledForAt:nowMs,deliverAs:"steer",coalesced:entry2.coalescedFirePending},expired=!1;return commit(entries=>{let dispatched={lastFiredAt:nowMs,lastScheduledForAt:nowMs,queuedForAt:nowMs,coalescedFirePending:!1,tickCount:entry2.tickCount+(held?0:1)},phase=sessionBusy?"queued":"running",next=entry2.kind==="fixed"?fixedWithPhase(entry2,phase,{...dispatched,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,phase,{...dispatched,pendingWakeup:null});entries[loopId]=next,next.kind==="fixed"?expired=armEntry(entries,next,nowMs,onFire)==="expired":deps.timers.cancel(loopId)}),expired||inFlightDeliveries.set(loopId,deliveryId),{action:"dispatch",tick}}function onTickSettled(input){let entry2=entryOf(input.loopId);if(entry2===void 0)return{action:"ignored"};if(input.outcome==="retrying")return{action:"in_progress"};if(inFlightDeliveries.get(input.loopId)!==input.deliveryId)return{action:"ignored"};if(inFlightDeliveries.delete(input.loopId),entry2.phase==="ended")return{action:"ignored"};if(entry2.phase==="suspended")return{action:"idle"};let nowMs=deps.clock.now();if(nowMs>=entry2.expiresAt)return commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{action:"ended",endReason:"expired"};if(entry2.tickCount>=maxTicks)return commit(entries=>{endEntry(entries,entry2,nowMs,"tick_budget_exhausted")}),{action:"ended",endReason:"tick_budget_exhausted"};if(entry2.coalescedFirePending)return commit(entries=>{entries[input.loopId]=withPhase(entry2,"waiting",{coalescedFirePending:!1,queuedForAt:null})}),onDue(input.loopId,nowMs,!1);let expired=!1;return commit(entries=>{let settled2=withPhase(entry2,"waiting",{queuedForAt:null});entries[input.loopId]=settled2,settled2.kind==="fixed"&&(expired=armEntry(entries,settled2,nowMs,onFire)==="expired")}),expired?{action:"ended",endReason:"expired"}:{action:"idle"}}function onScheduleWakeup(request2){let entry2=entryOf(request2.loopId);if(entry2===void 0)return{ok:!1,reason:"unknown_loop"};if(entry2.kind!=="dynamic")return{ok:!1,reason:"not_dynamic"};if(entry2.phase==="ended")return{ok:!1,reason:"ended"};let nowMs=deps.clock.now();if(nowMs>=entry2.expiresAt)return commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{ok:!1,reason:"expired"};let wakeupId=deps.ids.wakeupId(),replacedWakeupId=entry2.pendingWakeup?.id,dueAt=nowMs+request2.delaySeconds*1e3,wakeup={id:wakeupId,loopId:entry2.id,kind:"dynamic",source:"model",requestedDelaySeconds:request2.requestedDelaySeconds,delaySeconds:request2.delaySeconds,dueAt,reason:request2.reason,prompt:request2.prompt,noop:request2.noop,createdAt:nowMs},noopStreak=request2.noop?entry2.noopStreak+1:0;return commit(entries=>{let scheduled=dynamicWithPhase(entry2,"waiting",{queuedForAt:null,pendingWakeup:wakeup,keepaliveCredit:1,noopStreak});entries[entry2.id]=scheduled,armEntry(entries,scheduled,nowMs,onFire)}),replacedWakeupId===void 0?{ok:!0,wakeupId,dueAt,noopStreak}:{ok:!0,wakeupId,replacedWakeupId,dueAt,noopStreak}}function onTurnEndedWithoutSchedule(loopId,options){let chargeCredit=options?.chargeCredit??!0,entry2=entryOf(loopId);if(entry2===void 0||entry2.kind!=="dynamic")return{action:"ignored"};if(entry2.phase==="ended"||entry2.phase==="suspended")return{action:"ignored"};let nowMs=deps.clock.now();if(nowMs>=entry2.expiresAt)return commit(entries=>{endEntry(entries,entry2,nowMs,"expired")}),{action:"ended",endReason:"expired"};if(chargeCredit&&entry2.keepaliveCredit===0)return commit(entries=>{endEntry(entries,entry2,nowMs,"keepalive_exhausted")}),{action:"ended",endReason:"keepalive_exhausted"};let wakeupId=deps.ids.wakeupId(),dueAt=nowMs+keepaliveSeconds*1e3,wakeup={id:wakeupId,loopId:entry2.id,kind:"dynamic",source:"keepalive",requestedDelaySeconds:keepaliveSeconds,delaySeconds:keepaliveSeconds,dueAt,reason:"keepalive armed (model did not reschedule)",prompt:entry2.reentryPrompt,noop:!1,createdAt:nowMs},expired=!1;return commit(entries=>{let armed=dynamicWithPhase(entry2,"waiting",{queuedForAt:null,pendingWakeup:wakeup,keepaliveCredit:chargeCredit?0:entry2.keepaliveCredit});entries[entry2.id]=armed,expired=armEntry(entries,armed,nowMs,onFire)==="expired"}),expired?{action:"ended",endReason:"expired"}:{action:"keepalive_armed",wakeupId,delaySeconds:keepaliveSeconds,dueAt}}function pauseEntries(ids){let affected=[],pausable=ids.map(id=>entryOf(id)).filter(entry2=>entry2!==void 0&&isArmable(entry2));return pausable.length===0||commit(entries=>{for(let entry2 of pausable)deps.timers.cancel(entry2.id),inFlightDeliveries.delete(entry2.id),entries[entry2.id]=withPhase(entry2,"suspended",{queuedForAt:null}),affected.push(entry2.id)}),affected}function resolveTargets2(target){return target!=="all"?[target]:Object.values(state3.entries).map(entry2=>entry2.id)}function pause(target){return{affectedLoopIds:pauseEntries(resolveTargets2(target))}}function onUserAbort(loopId){return{action:pauseEntries([loopId]).length>0?"paused":"ignored"}}function resume(target){let nowMs=deps.clock.now(),resumable=resolveTargets2(target).map(id=>entryOf(id)).filter(entry2=>entry2!==void 0&&entry2.phase==="suspended");if(resumable.length===0)return{affectedLoopIds:[]};let affected=[];return commit(entries=>{for(let entry2 of resumable){let rearmed=entry2.kind==="fixed"?fixedWithPhase(entry2,"waiting",{queuedForAt:null,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,"waiting",{queuedForAt:null,pendingWakeup:entry2.pendingWakeup===null?null:{...entry2.pendingWakeup,dueAt:Math.max(entry2.pendingWakeup.dueAt,nowMs)}});entries[entry2.id]=rearmed,armEntry(entries,rearmed,nowMs,onFire),affected.push(entry2.id)}}),{affectedLoopIds:affected}}function stop(target,detail){let nowMs=deps.clock.now(),stoppable=resolveTargets2(target).map(id=>entryOf(id)).filter(entry2=>entry2!==void 0&&isActive(entry2));if(stoppable.length===0)return{affectedLoopIds:[]};let affected=[],clearDynamic=!1;return commit(entries=>{for(let entry2 of stoppable)endEntry(entries,entry2,nowMs,"stopped",detail),entry2.id===state3.activeDynamicId&&(clearDynamic=!0),affected.push(entry2.id);return clearDynamic?null:void 0}),{affectedLoopIds:affected}}function onShutdown(){let suspendable=Object.values(state3.entries).filter(isArmable);if(deps.timers.cancelAll(),suspendable.length===0)return{suspendedLoopIds:[]};let suspended=[];return commit(entries=>{for(let entry2 of suspendable)entries[entry2.id]=withPhase(entry2,"suspended",{queuedForAt:null}),suspended.push(entry2.id)}),inFlightDeliveries.clear(),{suspendedLoopIds:suspended}}function restore(nowMs,options={}){let recoveryTicks=[],expiredLoopIds=[],rearmedLoopIds=[],stillPausedLoopIds=[],userPaused=new Set(options.userPausedLoopIds??[]),liveDeliveries=new Set(inFlightDeliveries.keys());return deps.timers.cancelAll(),commit(entries=>{for(let entry2 of Object.values(state3.entries)){if(entry2.phase==="ended"||liveDeliveries.has(entry2.id))continue;if(userPaused.has(entry2.id)){entries[entry2.id]=withPhase(entry2,"suspended",{queuedForAt:null}),stillPausedLoopIds.push(entry2.id);continue}if(nowMs>=entry2.expiresAt){endEntry(entries,entry2,nowMs,"expired"),expiredLoopIds.push(entry2.id);continue}let dueAt=entry2.kind==="fixed"?entry2.nextFireAt:entry2.pendingWakeup?.dueAt,overdue=dueAt!==void 0&&dueAt<=nowMs,crashRemnant=isInFlight(entry2)||entry2.phase==="starting",needsRecovery=(overdue||crashRemnant||entry2.coalescedFirePending)&&entry2.tickCount<maxTicks,recovered2=entry2.kind==="fixed"?fixedWithPhase(entry2,"waiting",{queuedForAt:null,coalescedFirePending:!1,nextFireAt:nextOccurrenceAfter(nowMs,entry2.intervalMs)}):dynamicWithPhase(entry2,"waiting",{queuedForAt:null,coalescedFirePending:!1,pendingWakeup:overdue?null:entry2.pendingWakeup});if(entries[entry2.id]=recovered2,armEntry(entries,recovered2,nowMs,onFire)==="expired"){expiredLoopIds.push(entry2.id);continue}if(needsRecovery){let deliveryId=deps.ids.deliveryId();recoveryTicks.push({loopId:entry2.id,deliveryId,scheduledForAt:nowMs,deliverAs:"steer",coalesced:!0})}rearmedLoopIds.push(entry2.id)}}),recoveryTicks.length>0&&commit(entries=>{for(let tick of recoveryTicks){let entry2=entries[tick.loopId];entry2===void 0||entry2.phase==="ended"||(entries[tick.loopId]=withPhase(entry2,"queued",{lastFiredAt:nowMs,lastScheduledForAt:nowMs,queuedForAt:nowMs,tickCount:entry2.tickCount+1}),inFlightDeliveries.set(tick.loopId,tick.deliveryId))}}),{recoveryTicks,expiredLoopIds,rearmedLoopIds,stillPausedLoopIds}}let scheduler={getState:()=>state3,get mutationCount(){return mutationCount},maxTicks,keepaliveSeconds,currentDeliveryId:loopId=>inFlightDeliveries.get(loopId),createFixed,createDynamic,onDue,onTickSettled,onScheduleWakeup,onTurnEndedWithoutSchedule,onUserAbort,pause,resume,stop,onShutdown,restore};return fireHandler=loopId=>{let owner=deps.onFire;if(owner!==void 0){owner(loopId);return}scheduler.onDue(loopId,deps.clock.now(),!1)},scheduler}function sessionHeld(ctx){return ctx.getPauseState?.().holds.some(hold=>hold.kind!=="run_fence")===!0}function userStopped(ctx){return ctx.getPauseState?.().holds.some(hold=>hold.kind==="session_hold"&&hold.key!=="interrupted-run")===!0}var LOOP_STATUS_KEY="loop";function isArmed(entry2){return entry2.phase!=="ended"}function formatDuration2(ms){let totalSeconds=Math.max(0,Math.floor(ms/1e3));if(totalSeconds<60)return`${totalSeconds}s`;let minutes=Math.floor(totalSeconds/60);if(minutes<60){let seconds2=totalSeconds%60;return seconds2>0?`${minutes}m${seconds2}s`:`${minutes}m`}let hours=Math.floor(minutes/60);if(hours<24){let mins=minutes%60;return mins>0?`${hours}h${mins}m`:`${hours}h`}let days=Math.floor(hours/24),hrs=hours%24;return hrs>0?`${days}d${hrs}h`:`${days}d`}function nextDueAt(entry2){if(!(entry2.phase==="suspended"||entry2.phase==="ended"))return entry2.kind==="fixed"?entry2.nextFireAt:entry2.pendingWakeup?.dueAt}function formatLoopStatus(state3,nowMs){let armed=Object.values(state3.entries).filter(isArmed);if(armed.length===0)return;if(armed.some(entry2=>entry2.phase==="suspended"))return"Loop paused - /loop resume or /loop stop";let nearest;for(let entry2 of armed){if(entry2.phase==="suspended")continue;let dueAt=nextDueAt(entry2);dueAt!==void 0&&(nearest===void 0||dueAt<nearest.dueAt)&&(nearest={entry:entry2,dueAt})}if(nearest===void 0)return"Loop active - /loop stop";let remainingMs2=Math.max(0,nearest.dueAt-nowMs);return`Loop (${nearest.entry.kind==="fixed"?"fixed":"dynamic"}): next in ${formatDuration2(remainingMs2)} - /loop stop`}function formatNoopFold(noopStreak){return noopStreak<2?"":`\u21BB ${noopStreak} loop ticks with no actionable change`}var LoopStatusTicker=class{constructor(options){this.render=options.render,this.now=options.now??Date.now}get running(){return this.timeoutId!==void 0}sync(state3){this.state=state3,this.lastRendered=void 0,this.tick(),this.scheduleNext()}dispose(){this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0),this.state=void 0,this.lastRendered=void 0,this.render(LOOP_STATUS_KEY,void 0)}scheduleNext(){this.timeoutId!==void 0&&clearTimeout(this.timeoutId);let handle=setTimeout(()=>{this.timeoutId=void 0,this.tick(),this.state!==void 0&&this.scheduleNext()},1e3);handle.unref(),this.timeoutId=handle}tick(){if(this.state===void 0)return;let text3=formatLoopStatus(this.state,this.now());text3!==this.lastRendered&&(this.lastRendered=text3,this.render(LOOP_STATUS_KEY,text3))}};var InvalidLoopStoreError=class extends InvalidSidecarStoreError{constructor(message,options){super(message,options),this.name="InvalidLoopStoreError"}},UnsupportedLoopStoreVersionError=class extends UnsupportedSidecarStoreVersionError{constructor(message){super(message),this.name="UnsupportedLoopStoreVersionError"}},stores=new Map;function loopStateFilePath(ref){return sidecarFilePath(ref)}function storeFor(ref){let filePath=loopStateFilePath(ref),existing2=stores.get(filePath);if(existing2!==void 0)return existing2;let store=createSidecarStore({baseDir:ref.baseDir,sessionId:ref.sessionId,version:1,tempPrefix:"loop",parse:parseLoopPayload});return stores.set(filePath,store),store}function remapLoopStoreError(error2){throw error2 instanceof InvalidLoopStoreError||error2 instanceof UnsupportedLoopStoreVersionError?error2:error2 instanceof UnsupportedSidecarStoreVersionError?new UnsupportedLoopStoreVersionError(error2.message.replaceAll("sidecar store","loop store")):error2 instanceof InvalidSidecarStoreError?new InvalidLoopStoreError(error2.message.replaceAll("sidecar store","loop store"),{cause:error2}):error2}async function readLoopState(ref){try{return await storeFor(ref).read()}catch(error2){remapLoopStoreError(error2)}}async function writeLoopState(ref,state3){await storeFor(ref).write(state3)}function parseLoopPayload(raw,ref){if(!isRecord34(raw))throw new InvalidLoopStoreError("loop store must be a JSON object");if(!isEpochMs(raw.updatedAt))throw new InvalidLoopStoreError("loop store has an invalid updatedAt");if(!isRecord34(raw.entries))throw new InvalidLoopStoreError("loop store entries must be an object");let entries={};for(let[id,value]of Object.entries(raw.entries)){let entry2=parseEntry(id,value);entries[id]=entry2}let activeDynamicId=raw.activeDynamicId;if(activeDynamicId!==null){if(typeof activeDynamicId!="string")throw new InvalidLoopStoreError("loop store activeDynamicId must be a string or null");let active=entries[activeDynamicId];if(active===void 0||active.kind!=="dynamic")throw new InvalidLoopStoreError(`loop store activeDynamicId ${activeDynamicId} does not name a dynamic loop`)}return{version:1,sessionId:ref.sessionId,entries,activeDynamicId,updatedAt:raw.updatedAt}}function parseEntry(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} is not an object`);if(value.id!==id)throw new InvalidLoopStoreError(`loop entry ${id} carries a mismatched id`);let kind=value.kind;if(kind!=="fixed"&&kind!=="dynamic")throw new InvalidLoopStoreError(`loop entry ${id} has an unknown kind`);let base=parseEntryFields(id,value);if(kind==="fixed")return{...base,kind:"fixed",requestedInterval:parseRequestedInterval(id,value.requestedInterval),effectiveInterval:parseEffectiveInterval(id,value.effectiveInterval),cronExpression:requireString(id,"cronExpression",value.cronExpression),nextFireAt:requireEpochMs(id,"nextFireAt",value.nextFireAt),intervalMs:requirePositiveInteger(id,"intervalMs",value.intervalMs)};let keepaliveCredit=value.keepaliveCredit;if(keepaliveCredit!==0&&keepaliveCredit!==1)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid keepaliveCredit`);return{...base,kind:"dynamic",pendingWakeup:parsePendingWakeup(id,value.pendingWakeup),keepaliveCredit}}function parseEntryFields(id,value){return{...{id,originalArgs:requireString(id,"originalArgs",value.originalArgs,{allowEmpty:!0}),reentryPrompt:requireString(id,"reentryPrompt",value.reentryPrompt),payload:parsePayload2(id,value.payload),createdAt:requireEpochMs(id,"createdAt",value.createdAt),lastFiredAt:parseNullableEpochMs(id,"lastFiredAt",value.lastFiredAt),expiresAt:requireEpochMs(id,"expiresAt",value.expiresAt),lastScheduledForAt:parseNullableEpochMs(id,"lastScheduledForAt",value.lastScheduledForAt),coalescedFirePending:requireBoolean(id,"coalescedFirePending",value.coalescedFirePending),queuedForAt:parseNullableEpochMs(id,"queuedForAt",value.queuedForAt),noopStreak:requireNonNegativeInteger(id,"noopStreak",value.noopStreak),tickCount:requireNonNegativeInteger(id,"tickCount",value.tickCount),sentinelDelivery:parseSentinelDelivery(id,value.sentinelDelivery),wakeSources:parseWakeSources(id,value.wakeSources)},...parseLifecycle(id,value)}}function parseLifecycle(id,value){let phase=value.phase;if(typeof phase!="string"||!isLoopPhase(phase))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid phase`);if(phase!=="ended"){if(value.endedAt!==void 0||value.endReason!==void 0||value.endDetail!==void 0)throw new InvalidLoopStoreError(`loop entry ${id} carries terminal fields while not ended`);return{phase}}let endReason=value.endReason;if(typeof endReason!="string"||!isLoopEndReason(endReason))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid endReason`);let endDetail=value.endDetail;if(endDetail!==void 0&&typeof endDetail!="string")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid endDetail`);return{phase:"ended",endedAt:requireEpochMs(id,"endedAt",value.endedAt),endReason,...endDetail===void 0?{}:{endDetail}}}function parsePayload2(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid payload`);if(value.type==="prompt")return{type:"prompt",prompt:requireString(id,"payload.prompt",value.prompt)};if(value.type==="sentinel"){let sentinel=value.sentinel;if(typeof sentinel!="string"||!isLoopSentinel(sentinel))throw new InvalidLoopStoreError(`loop entry ${id} has an unknown payload sentinel`);return{type:"sentinel",sentinel}}throw new InvalidLoopStoreError(`loop entry ${id} has an unknown payload type`)}function parseSentinelDelivery(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid sentinelDelivery`);return{autonomousPreambleDelivered:requireBoolean(id,"sentinelDelivery.autonomousPreambleDelivered",value.autonomousPreambleDelivered),lastLoopFileDelivered:parseFingerprint(id,value.lastLoopFileDelivered),forceFullDelivery:requireBoolean(id,"sentinelDelivery.forceFullDelivery",value.forceFullDelivery)}}function parseFingerprint(id,value){if(value===null)return null;if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid loop-file fingerprint`);return{path:requireString(id,"fingerprint.path",value.path),mtimeMs:requireFiniteNumber(id,"fingerprint.mtimeMs",value.mtimeMs),size:requireNonNegativeInteger(id,"fingerprint.size",value.size),contentHash:requireString(id,"fingerprint.contentHash",value.contentHash),anchorDeliveryId:requireString(id,"fingerprint.anchorDeliveryId",value.anchorDeliveryId)}}function parseWakeSources(id,value){if(!Array.isArray(value))throw new InvalidLoopStoreError(`loop entry ${id} has invalid wakeSources`);return value.map(candidate=>{if(!isRecord34(candidate))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source`);let source2=candidate.source;if(typeof source2!="string"||!isWakeSourceKind(source2))throw new InvalidLoopStoreError(`loop entry ${id} has an unknown wake source kind`);let description=candidate.description;if(description!==void 0&&typeof description!="string")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid wake source description`);return{source:source2,id:requireString(id,"wakeSource.id",candidate.id),createdAt:requireEpochMs(id,"wakeSource.createdAt",candidate.createdAt),...description===void 0?{}:{description}}})}function parsePendingWakeup(id,value){if(value==null)return null;if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup`);let source2=value.source;if(source2!=="model"&&source2!=="keepalive")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup source`);if(value.kind!=="dynamic")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid pendingWakeup kind`);return{id:requireString(id,"pendingWakeup.id",value.id),loopId:requireString(id,"pendingWakeup.loopId",value.loopId),kind:"dynamic",source:source2,requestedDelaySeconds:requireFiniteNumber(id,"pendingWakeup.requestedDelaySeconds",value.requestedDelaySeconds),delaySeconds:requirePositiveInteger(id,"pendingWakeup.delaySeconds",value.delaySeconds),dueAt:requireEpochMs(id,"pendingWakeup.dueAt",value.dueAt),reason:requireString(id,"pendingWakeup.reason",value.reason),prompt:requireString(id,"pendingWakeup.prompt",value.prompt),noop:requireBoolean(id,"pendingWakeup.noop",value.noop),createdAt:requireEpochMs(id,"pendingWakeup.createdAt",value.createdAt)}}function parseRequestedInterval(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval`);let unit=value.unit;if(typeof unit!="string"||!isRequestedIntervalUnit(unit))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid requestedInterval unit`);return{value:requirePositiveInteger(id,"requestedInterval.value",value.value),unit,raw:requireString(id,"requestedInterval.raw",value.raw)}}function parseEffectiveInterval(id,value){if(!isRecord34(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval`);let unit=value.unit;if(typeof unit!="string"||!isEffectiveIntervalUnit(unit))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval unit`);let roundingNotice=value.roundingNotice;if(roundingNotice!==void 0&&typeof roundingNotice!="string")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid effectiveInterval roundingNotice`);return{value:requirePositiveInteger(id,"effectiveInterval.value",value.value),unit,human:requireString(id,"effectiveInterval.human",value.human),rounded:requireBoolean(id,"effectiveInterval.rounded",value.rounded),...roundingNotice===void 0?{}:{roundingNotice}}}function requireString(id,field3,value,options){if(typeof value!="string"||options?.allowEmpty!==!0&&value.length===0)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireBoolean(id,field3,value){if(typeof value!="boolean")throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireFiniteNumber(id,field3,value){if(typeof value!="number"||!Number.isFinite(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireNonNegativeInteger(id,field3,value){if(!Number.isSafeInteger(value)||value<0)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requirePositiveInteger(id,field3,value){if(!Number.isSafeInteger(value)||value<=0)throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function requireEpochMs(id,field3,value){if(!isEpochMs(value))throw new InvalidLoopStoreError(`loop entry ${id} has an invalid ${field3}`);return value}function parseNullableEpochMs(id,field3,value){return value==null?null:requireEpochMs(id,field3,value)}function isEpochMs(value){return Number.isSafeInteger(value)&&value>=0}function isLoopPhase(value){return LOOP_PHASES.includes(value)}function isLoopEndReason(value){return LOOP_END_REASONS.includes(value)}function isLoopSentinel(value){return LOOP_SENTINELS.includes(value)}function isWakeSourceKind(value){return LOOP_WAKE_SOURCE_KINDS.includes(value)}function isRequestedIntervalUnit(value){return REQUESTED_INTERVAL_UNITS.includes(value)}function isEffectiveIntervalUnit(value){return EFFECTIVE_INTERVAL_UNITS.includes(value)}var LOOP_FILE_HEADER="# /loop tick - loop.md tasks",AUTONOMOUS_HEADER="# Autonomous loop tick",DYNAMIC_PACING_SUFFIX=" (dynamic pacing)",FIXED_RESCHEDULE_RULE=["The fixed recurring schedule fires the next tick automatically - do not call `schedule_wakeup` from this tick.","If this tick errors, the schedule stays armed and the next occurrence still fires."].join(`
|
|
720
720
|
`);function dynamicRescheduleRule(reentryPrompt){return[`As the last action of this turn, call \`schedule_wakeup\` with \`prompt: ${JSON.stringify(reentryPrompt)}\` so the loop stays alive; a turn that ends without it burns the single keepalive fallback and then the loop ends.`,"To end the loop instead, call `schedule_wakeup` with `{ stop: true }` and a reason.","When the next step is gated on observable state, do not sleep or poll: watch terminal output with `monitor`, inspect it with `bash_output`, stop the watcher with `kill_bash`, and let task-notification wakeups resume this loop. With one of those armed, the scheduled delay is only a fallback heartbeat (1200-1800s is the normal idle range).","Set `noop: true` only when this tick found no actionable change, and notify the user only on changes worth acting on - not once per tick."].join(`
|
|
721
721
|
`)}function modeRule(mode,reentryPrompt){return mode==="fixed"?FIXED_RESCHEDULE_RULE:dynamicRescheduleRule(reentryPrompt)}function header(base,mode){return mode==="dynamic"?`${base}${DYNAMIC_PACING_SUFFIX}`:base}var AUTONOMOUS_FULL_BODY=["No loop-tasks file is configured, so run the standard autonomous maintenance pass for this tick:","","1. Inspect current state: active tasks, running terminal commands and monitors, and any delegated child work.","2. Make concrete progress where progress is possible; do not merely narrate.","3. Avoid repeating unchanged status - stay silent when nothing moved.","4. Surface only actionable state changes to the user, once per state change."].join(`
|
|
722
722
|
`),AUTONOMOUS_REMINDER_BODY="Continue the autonomous maintenance pass established by the most recent full autonomous loop instruction message in this conversation. Re-read that anchored message and perform the next applicable work.",LOOP_FILE_REMINDER_BODY="Continue the loop.md tasks established by the most recent full loop.md instruction message in this conversation. Re-read that anchored message and perform the next applicable work.",LOOP_FILE_INTRO="The user configured a loop-tasks file. Work through the tasks defined below; these are the instructions for this tick and every subsequent tick (the reminder on later fires refers back to this message).",LOOP_FILE_ABSENT_BODY="The loop-tasks file used by this loop is currently absent. Perform the autonomous maintenance check for this tick. Keep the loop alive so a later tick can pick up the file if it reappears.";function joinBlocks(blocks){return blocks.filter(block=>block.length>0).join(`
|
|
@@ -1806,7 +1806,7 @@ ${truncatedRules.map(formatRule).join(`
|
|
|
1806
1806
|
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,state3){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} [${state3}] 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(record10=>record10.state==="pending");if(pending.length>=1e3)throw new Error(`the schedule already holds ${1e3} pending jobs; cancel some first.`);if(pending.filter(record10=>record10.job.sessionId===sessionId).length>=50)throw new Error(`this session already has ${50} pending jobs; cancel some first.`)}async function create(params,ctx,now2,liveDelivery){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 liveDelivery?.isLive()===!0?(await liveDelivery.replan(),lines.push("While this session stays open it delivers the prompt itself when due, steered into the current turn if one is running.",runnerAvailable?"After it closes, the active schedule runner delivers it.":"If it closes first, the job fires the next time a `senpi schedule run` runner runs.")):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(`
|
|
1807
1807
|
`)}],details:{action:"create",jobs:[{state:"pending",job}],runnerAvailable}}}async function list(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:state3,job})=>describeJob(job,state3)).join(`
|
|
1808
1808
|
`)}],details:{action:"list",jobs:own}}}async function cancel2(params,ctx,liveDelivery){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 await liveDelivery?.replan(),{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(),deps.liveDelivery);case"list":return list(ctx);case"cancel":return cancel2(params,ctx,deps.liveDelivery)}}})}function createScheduleExtension(deps={}){let now2=deps.now??(()=>Date.now());return pi=>{let liveDelivery=registerLiveDelivery(pi,{now:now2,timer:deps.timer??createNodeLiveTimer});registerScheduleTool(pi,{now:now2,liveDelivery})}}var schedule_default=createScheduleExtension();import{join as join77}from"node:path";function isEvalOnlyRouting(pi){return typeof pi.getAllTools!="function"?!1:pi.getAllTools().some(tool=>tool.name==="eval")}var MonitorLineBuffer=class{#tail="";append(chunk){let remaining=this.#tail+chunk,lines=[];for(;;){let newline=remaining.indexOf(`
|
|
1809
|
-
`);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 CommandMonitorSource=class{#records=new Map;#host;constructor(host){this.#host=host}get(id){return this.#records.get(id)}values(){return this.#records.values()}keys(){return this.#records.keys()}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record10={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,runaway:void 0,wakesPerHour:options.wakesPerHour,unsubscribeOutput:void 0,unsubscribeExit:void 0,humanInput:options.humanInput===!0};return this.#records.set(record10.id,record10),this.#host.changed(),this.#consume(record10,record10.runtime.fullOutput()),record10.unsubscribeOutput=record10.runtime.onOutput(chunk=>this.#consume(record10,chunk)),record10.unsubscribeExit=record10.runtime.session.onExit(()=>this.#settle(record10)),record10.runtime.exited&&this.#settle(record10),record10.monitorId}adoptFireWindow(monitorId,fireWindow2){for(let record10 of this.#records.values())if(record10.monitorId===monitorId)return record10.fireWindow={...fireWindow2},!0;return!1}dispose(){for(let record10 of[...this.#records.values()])this.#disposeRecord(record10);this.#records.clear()}#consume(record10,chunk){if(!(record10.settled||chunk.length===0)){for(let line of record10.lineBuffer.append(chunk))if(!record10.filter||record10.filter.test(line)){if(record10.paused){record10.mutedDropped+=1;continue}if(this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line,...record10.humanInput?{humanInput:!0}:{}}),record10.fireWindow!==void 0){let now2=Date.now();if(now2-record10.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record10.fireWindow={startMs:now2,count:0}),record10.fireWindow.count+=1,this.#floodsRunaway(record10,now2)){let guard=this.#host.runawayGuard();record10.paused=!0,this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:runawayPauseSummary(record10.id,guard.linesPerMinute,guard.minutes)}),this.#host.changed()}}}}}#floodsRunaway(record10,now2){let guard=this.#host.runawayGuard(),previous=record10.runaway,current=previous;if(current===void 0||now2-current.minuteStartMs>=6e4){let elapsedMinutes=previous===void 0?0:Math.floor((now2-previous.minuteStartMs)/6e4),previousFlooded=previous!==void 0&&elapsedMinutes===1&&previous.count>guard.linesPerMinute;current={minuteStartMs:previous===void 0?now2:previous.minuteStartMs+elapsedMinutes*6e4,count:0,floodMinutes:previous!==void 0&&previousFlooded?previous.floodMinutes+1:0},record10.runaway=current}return current.count+=1,current.count>guard.linesPerMinute&¤t.floodMinutes+1>=guard.minutes}#settle(record10){if(record10.settled)return;record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.changed();let exit=record10.runtime.exitResult,status=describeExit(record10.runtime)??"exited",code=exit?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:exit?.timedOut?`watcher killed at deadline (${status})`:`watcher ${status}${codeText}`}),this.#host.ended(record10,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record10){record10.settled||(record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.ended(record10,"disposed",null))}};import{watch as watch3}from"node:fs";import{basename as basename29,join as join71}from"node:path";import{lstat as lstat3,open as open8,stat as stat10}from"node:fs/promises";import{dirname as dirname58}from"node:path";import{createHash as createHash27}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash27("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")}`}async function checkFileOnce(record10,actions){if(record10.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname58(record10.path))!==record10.canonicalParent){actions.settle(`watcher error: monitored parent changed: ${dirname58(record10.path)}`);return}if((await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(realpathWithoutOpen(record10.canonicalPath)!==record10.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);handle=await open8(record10.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record10.path}`);if((opened.dev!==record10.device||opened.ino!==record10.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(current=opened,(await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);let reboundPath=await stat10(record10.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){actions.settle(`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await digestFileHandle(handle):"",present&&handle){let afterDigest=await stat10(record10.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}}finally{await handle?.close()}let changed=record10.event==="create"?!record10.present&&present:record10.present&&present&&(current.mtimeMs!==record10.mtimeMs||current.size!==record10.size||digest3!==record10.digest);record10.pendingChange||=changed,!record10.present&¤t&&(record10.device=current.dev,record10.inode=current.ino),record10.present=present,record10.mtimeMs=current?.mtimeMs??0,record10.size=current?.size??0,record10.digest=digest3,!(!record10.pendingChange||record10.paused||record10.settled)&&(record10.pendingChange=!1,!record10.settled&&actions.fire(`${record10.event} ${record10.path}`))}var RegistrationGuard=class{#pending=new Set;open(release4,timeoutMs){let pending={release:release4,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),timeoutMs),settled:!1};return this.#pending.add(pending),pending}finishAll(){for(let pending of[...this.#pending])this.finish(pending)}finish(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 await(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value=>lateCleanup?.(value),()=>{}),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(value=>(aborted&&lateCleanup?.(value),value),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}};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)}};function newFileRecord(input){let{id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4,digest:digest3,initial}=input,persistent=options.persistent??options.expiresAt!==void 0;return{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:path14,canonicalPath:canonicalPath2,canonicalParent:approvedParent,event:options.event,watcher,release:release4??(()=>{}),watch:new FileWatchLoop(input.check),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(input.timedOut,options.timeoutMs)}}import{access as access5,lstat as lstat4,open as open9,stat as stat11}from"node:fs/promises";import{basename as basename28,dirname as dirname59,join as join70,resolve as resolve42}from"node:path";async function proveWatchTarget(guard,pending,options,isDisposed){let path14=resolve42(options.cwd,options.path),parent=dirname59(path14),approvedParent;try{await guard.await(pending,access5(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(isDisposed())throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw 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 guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path14}`);if(initialHandle=await guard.await(pending,open9(path14,"r"),async handle=>{await handle.close()}),initial=await guard.await(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path14}`);if(realpathWithoutOpen(path14)!==join70(approvedParent,basename28(path14)))throw new Error(`Cannot watch file: target identity changed: ${path14}`);if((await guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path14}`);let reboundStat=await guard.await(pending,stat11(path14));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path14}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw error2}return{path:path14,parent,approvedParent,initial,initialHandle}}var FileMonitorSource=class{#files=new Map;#guard=new RegistrationGuard;#host;#reserve;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#lifecycle=0;constructor(host,reserve){this.#host=host,this.#reserve=reserve}get(id){return this.#files.get(id)}values(){return this.#files.values()}keys(){return this.#files.keys()}setParked(parked){this.#parked=parked;for(let record10 of this.#files.values())parked?record10.watch.pause():record10.paused||record10.watch.resume()}get parked(){return this.#parked}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record10 of this.#files.values())this.#settleFile(record10,"watcher disposed");this.#guard.finishAll()}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=this.#guard.open(release4??void 0,options.timeoutMs),target;try{target=await proveWatchTarget(this.#guard,pending,options,()=>this.#disposed)}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,error2}let{path:path14,parent,approvedParent,initial}=target,initialHandle=target.initialHandle;if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#guard.finish(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.#guard.await(pending,probeDirectoryOpenable(activationParent)),watcher=watch3(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename29(String(name))===basename29(path14))&&this.#checkFile(id)})}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path14}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record11=this.#files.get(id);record11&&this.#settleFile(record11,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#guard.finish(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath2=join71(approvedParent,basename29(path14)),digest3;try{digest3=initial&&initialHandle?await this.#guard.await(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#host.emitRaw({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#host.emitRaw({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 record10=newFileRecord({id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4??void 0,digest:digest3,initial,check:()=>{this.#checkFile(id)},timedOut:()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")}});if(this.#files.set(id,record10),this.#parked&&record10.watch.pause(),finishRegistration(),this.#guard.finish(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record10,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#host.changed(),{id,monitorId:record10.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}}async stopFile(id){let record10=this.#files.get(id);return record10?(this.#settleFile(record10,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record10 of records)this.#settleFile(record10,"watcher killed");return this.#guard.finishAll(),records.length}#settleFile(record10,summary){if(record10.settled)return;record10.settled=!0,record10.watch.stop(),clearTimeout(record10.deadline),record10.watcher.close(),record10.release(),this.#files.delete(record10.id),this.#host.changed(),this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#host.ended(record10,reason,null)}async#checkFile(id){let record10=this.#files.get(id);if(!(!record10||record10.settled||record10.paused||this.#parked)){if(record10.checking){record10.dirty=!0;return}return record10.checking=checkFileOnce(record10,{settle:summary=>this.#settleFile(record10,summary),fire:line=>{this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line}),this.#settleFile(record10,"watcher completed")}}).catch(error2=>{record10.settled||this.#settleFile(record10,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record10.checking=void 0;let now2=Date.now();now2-record10.dirtyWindowStartedAt>=1e3&&(record10.dirtyWindowStartedAt=now2,record10.dirtyPasses=0),record10.dirty&&!record10.settled&&record10.dirtyPasses<1?(record10.dirty=!1,record10.dirtyPasses+=1,this.#checkFile(id)):record10.dirty=!1}),record10.checking}}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}};function loadRpcMonitorSource(){return import("./rpc-monitor-source-OL5KU6NO.js")}var MonitorRegistry=class{#emit;#onChange;#onEnded;#onFire;#commands;#files;#host;#rpc;#parked=!1;#runawayGuard={linesPerMinute:DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,minutes:DEFAULT_MONITOR_RUNAWAY_MINUTES};constructor(emit2,options){this.#emit=emit2,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire;let host={emit:(record10,event)=>this.#emitForRecord(record10,event),emitRaw:event=>this.#emit(event),ended:(record10,reason,exitCode)=>this.#emitEnded(record10,reason,exitCode),changed:()=>this.#notifyChange(),runawayGuard:()=>this.#runawayGuard};this.#host=host,this.#commands=new CommandMonitorSource(host),this.#files=new FileMonitorSource(host,options?.reserve)}setRunawayGuard(guard){this.#runawayGuard=guard}wakePacing(id){let record10=this.#commands.get(id);if(!(record10===void 0||!record10.persistent))return{wakesPerHour:record10.wakesPerHour}}setParked(parked){this.#parked!==parked&&(this.#parked=parked,this.#files.setParked(parked))}snapshot(){return[...this.#commands.values(),...this.#files.values(),...this.#rpc?.values()??[]].map(record10=>({id:record10.id,monitorId:record10.monitorId,description:record10.description,paused:record10.paused,startedAtMs:record10.startedAtMs,command:record10.command,filter:record10.filter?.source??null,persistent:record10.persistent,deadlineMs:record10.deadlineMs,fireCount:record10.fireCount,lastFiredAtMs:record10.lastFiredAtMs,expiresAt:record10.expiresAt,fireWindow:"fireWindow"in record10?record10.fireWindow:void 0}))}registerFile(options){return this.#files.registerFile(options)}fileCheckpoint(id){return this.#files.fileCheckpoint(id)}emitFileLine(id,line){return this.#files.get(id)!==void 0&&this.emitLine(id,line)}emitLine(id,line){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return!record10||record10.settled?!1:(this.#emitForRecord(record10,{type:"line",id:record10.id,description:record10.description,line}),!0)}stopFile(id){return this.#files.stopFile(id)}stopAllFiles(){return this.#files.stopAllFiles()}register(options){return this.#commands.register(options)}async registerRpc(options){if(this.#rpc===void 0){let{RpcMonitorSource}=await loadRpcMonitorSource();this.#rpc??=new RpcMonitorSource(this.#host)}return this.#rpc.register(options)}stopRpc(id){return this.#rpc?.settle(id,"watcher killed")??!1}stopAllRpc(){return this.#rpc?.settleAll("watcher killed")??0}pause(ids){let paused=[];for(let id of ids){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);!record10||record10.paused||(record10.paused=!0,"watch"in record10&&record10.watch.pause(),paused.push(record10.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]])}resume(ids){let candidates=ids??[...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]],resumed=[];for(let id of candidates){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);if(!record10?.paused)continue;record10.paused=!1;let mutedDropped="mutedDropped"in record10?record10.mutedDropped:0;"mutedDropped"in record10&&(record10.mutedDropped=0),"fireWindow"in record10&&record10.fireWindow!==void 0&&(record10.fireWindow.count=0),"runaway"in record10&&(record10.runaway=void 0),resumed.push({id:record10.id,mutedDropped}),"watch"in record10&&!this.#files.parked&&record10.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#commands.get(id)?.mutedDropped??this.#rpc?.get(id)?.mutedDropped??0}rearm(id){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return record10?record10.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){return this.#commands.adoptFireWindow(monitorId,fireWindow2)}dispose(){this.#commands.dispose(),this.#files.dispose(),this.#rpc?.settleAll("watcher disposed"),this.#notifyChange()}#notifyChange(){this.#onChange?.(this.snapshot())}#emitForRecord(record10,event){record10.fireCount+=1,record10.lastFiredAtMs=Date.now(),this.#emit(event),record10.settled||this.#onFire?.(this.snapshot())}#emitEnded(record10,reason,exitCode){this.#onEnded?.({id:record10.id,description:record10.description,startedAtMs:record10.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record10.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(state3){return new TerminalSessionBundle({maxSessions:state3.settings.maxSessions,scrollback:state3.settings.scrollback})}function bundleSinks(pi,state3){return{onMonitorEvent:event=>state3.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(state3.ctx),monitorId=state3.bundle?.manager.monitorIdOf(event.id);dir===void 0||monitorId===void 0||removeMonitorStateDir(dir,monitorId).catch(error2=>{state3.ctx?.ui?.notify?.(`Could not remove the state dir of ${monitorId}: ${error2 instanceof Error?error2.message:String(error2)}`,"warning")})},onMonitorState:(snapshot,transition=!0)=>{state3.parked||state3.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry2=>({id:entry2.id,description:entry2.description,paused:entry2.paused,startedAtMs:entry2.startedAtMs,command:entry2.command,filter:entry2.filter,persistent:entry2.persistent,deadlineMs:entry2.deadlineMs,fireCount:entry2.fireCount,lastFiredAtMs:entry2.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(entry2=>({id:entry2.id,description:entry2.description,startedAtMs:entry2.startedAtMs}))}),state3.manifestWriter&&state3.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let record10=()=>{let writer=state3.manifestWriter;if(writer)for(let entry2 of snapshot){if(state3.recordedBackgroundIds.has(entry2.id))continue;state3.recordedBackgroundIds.add(entry2.id);let identity=state3.bundle?.manager.get(entry2.id)?.identity();writer.recordBackgroundStart(entry2.id,entry2.description??entry2.id,entry2.startedAtMs,identity)}};if(state3.manifestWriter===null&&state3.ensurePersistence!==null&&snapshot.length>0){state3.ensurePersistence().then(record10);return}record10()},onBackgroundExit:(id,runtime)=>{state3.recordedBackgroundIds.delete(id),state3.manifestWriter&&state3.manifestWriter.recordBackgroundExit(id),state3.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state3){let requireBundle=()=>(state3.bundle||(state3.bundle=createBundle(state3),state3.bundle.monitors.setParked(state3.parked),state3.bundle.bind(bundleSinks(pi,state3))),state3.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state3.ctx?.cwd??process.cwd()},get shellPath(){return state3.shellPath},get defaultCols(){return state3.settings.defaultCols},get defaultRows(){return state3.settings.defaultRows},get timeoutAction(){return state3.settings.timeoutAction},get maxDurableMonitors(){return state3.settings.maxDurableMonitors},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state3.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state3.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state3.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state3.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state3.monitorNotifier?.resume(ids),ensurePersistence:()=>state3.ensurePersistence?.()??Promise.resolve()}}import{randomUUID as randomUUID12}from"node:crypto";import{mkdir as mkdir13}from"node:fs/promises";import{join as join72}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 isFiniteNumber2=value=>typeof value=="number"&&Number.isFinite(value);function readLeaseRecord(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let candidate=parsed;return!isFiniteNumber2(candidate.pid)||!isFiniteNumber2(candidate.startedAtMs)?"unparseable":{pid:candidate.pid,startedAtMs:candidate.startedAtMs,...isFiniteNumber2(candidate.v)?{v:candidate.v}:{},...typeof candidate.token=="string"?{token:candidate.token}:{},...isFiniteNumber2(candidate.bootAtMs)?{bootAtMs:candidate.bootAtMs}:{},...isFiniteNumber2(candidate.processStartedAtMs)?{processStartedAtMs:candidate.processStartedAtMs}:{},...isFiniteNumber2(candidate.acquiredAtMs)?{acquiredAtMs:candidate.acquiredAtMs}:{}}}catch{return"unparseable"}}async function readLeaseFile(path14){let raw=await readLeaseText(path14);return raw===void 0?"missing":readLeaseRecord(raw)}async function classifyLease(existing2,self,probes){if(existing2.pid===self.pid)return existing2.token!==void 0&&(probes.liveTokens??liveTokens).has(existing2.token)?"live-foreign":"self";if(!probeAlive(existing2.pid,probes.isProcessAlive))return"dead";let observedStart;try{observedStart=await probes.readProcessStartMs(existing2.pid)}catch{observedStart=void 0}return observedStart===void 0?"live-foreign":existing2.processStartedAtMs===void 0?observedStart<=existing2.startedAtMs+PROCESS_START_TOLERANCE_MS?"live-foreign":"reused":sameProcessStartMs(existing2.processStartedAtMs,observedStart)?"live-foreign":"reused"}function holderOf(record10){return{pid:record10.pid,startedAtMs:record10.startedAtMs,...record10.bootAtMs!==void 0?{bootAtMs:record10.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,path14=join72(options.dir,`${options.encodedSessionId}.lease`);await mkdir13(options.dir,{recursive:!0});let token=randomUUID12(),record10={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:path14,pid,token}),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},content=JSON.stringify(record10);for(let attempt2=0;attempt2<3;attempt2+=1){try{return await publishExclusive(path14,content),acquired()}catch(error2){if(errorCode(error2)!=="EEXIST")throw error2}let raw2=await readLeaseText(path14);if(raw2===void 0)continue;let existing2=readLeaseRecord(raw2),verdict=existing2==="unparseable"?"dead":await classifyLease(existing2,{...self,pid},probes);if(verdict==="self")return await publishReplace(path14,content),acquired();if(verdict==="live-foreign"&&existing2!=="unparseable")return{acquired:!1,holder:holderOf(existing2)};let reclaim=await reclaimInspected(path14,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(path14),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 ${path14} kept changing while it was being acquired`)}async function releaseTerminalLease(handle){let existing2=await readLeaseFile(handle.path);if(!(existing2==="missing"||existing2==="unparseable")&&existing2.pid===handle.pid&&!(handle.token!==void 0&&existing2.token!==void 0&&existing2.token!==handle.token)&&(await unlinkIfPresent(handle.path),existing2.token!==void 0)){liveTokens.delete(existing2.token);for(let[sessionId,token]of generationTokens)token===existing2.token&&generationTokens.delete(sessionId)}}function monitorDetails(events,ids,overflowBook){return[...ids].map(id=>{let own=events.filter(event=>event.id===id),overflow=overflowBook.get(id),kinds=new Set(own.map(event=>event.type));for(let kind of overflow?.kinds??[])kinds.add(kind);let humanInput=own.some(event=>event.type==="line"&&event.humanInput===!0)||overflow?.humanInput===!0;return{id,description:own[0]?.description??overflow?.description??id,eventCount:own.length+(overflow?.count??0),kinds:[...kinds],...humanInput?{humanInput:!0}:{}}})}var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",WAKE_BUDGET_PAUSE_NOTICE="Monitor paused after repeated updates. Completion still wakes this session; peek bash_output or re-arm only for intermediate events.";function eventBody(event){let value=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value).replace(/[\r\n]+/g," ").trimEnd()}function renderedLength(event){return`Monitor event(${event.description}): ${eventBody(event)}`.length}function groupHeader(description){return`Monitor event(${description}): `}function monitorShareChars(events,notice2){let first=events[0];return(first===void 0?0:groupHeader(first.description).length+events.reduce((total,event)=>total+eventBody(event).length+1,0))+(notice2.length>0?notice2.length+1:0)}function clip(text3,maxChars){return text3.length<=maxChars?text3:maxChars<=3?text3.slice(0,maxChars):`${text3.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=>`${groupHeader(group.description)}${group.bodies.join(`
|
|
1809
|
+
`);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 CommandMonitorSource=class{#records=new Map;#host;constructor(host){this.#host=host}get(id){return this.#records.get(id)}values(){return this.#records.values()}keys(){return this.#records.keys()}register(options){let durable=options.durabilityClass!==void 0&&options.durabilityClass!=="ephemeral",record10={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,runaway:void 0,wakesPerHour:options.wakesPerHour,unsubscribeOutput:void 0,unsubscribeExit:void 0,humanInput:options.humanInput===!0};return this.#records.set(record10.id,record10),this.#host.changed(),this.#consume(record10,record10.runtime.fullOutput()),record10.unsubscribeOutput=record10.runtime.onOutput(chunk=>this.#consume(record10,chunk)),record10.unsubscribeExit=record10.runtime.session.onExit(()=>this.#settle(record10)),record10.runtime.exited&&this.#settle(record10),record10.monitorId}adoptFireWindow(monitorId,fireWindow2){for(let record10 of this.#records.values())if(record10.monitorId===monitorId)return record10.fireWindow={...fireWindow2},!0;return!1}dispose(){for(let record10 of[...this.#records.values()])this.#disposeRecord(record10);this.#records.clear()}#consume(record10,chunk){if(!(record10.settled||chunk.length===0)){for(let line of record10.lineBuffer.append(chunk))if(!record10.filter||record10.filter.test(line)){if(record10.paused){record10.mutedDropped+=1;continue}if(this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line,...record10.humanInput?{humanInput:!0}:{}}),record10.fireWindow!==void 0){let now2=Date.now();if(now2-record10.fireWindow.startMs>=FIRE_BUDGET_WINDOW_MS&&(record10.fireWindow={startMs:now2,count:0}),record10.fireWindow.count+=1,this.#floodsRunaway(record10,now2)){let guard=this.#host.runawayGuard();record10.paused=!0,this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:runawayPauseSummary(record10.id,guard.linesPerMinute,guard.minutes)}),this.#host.changed()}}}}}#floodsRunaway(record10,now2){let guard=this.#host.runawayGuard(),previous=record10.runaway,current=previous;if(current===void 0||now2-current.minuteStartMs>=6e4){let elapsedMinutes=previous===void 0?0:Math.floor((now2-previous.minuteStartMs)/6e4),previousFlooded=previous!==void 0&&elapsedMinutes===1&&previous.count>guard.linesPerMinute;current={minuteStartMs:previous===void 0?now2:previous.minuteStartMs+elapsedMinutes*6e4,count:0,floodMinutes:previous!==void 0&&previousFlooded?previous.floodMinutes+1:0},record10.runaway=current}return current.count+=1,current.count>guard.linesPerMinute&¤t.floodMinutes+1>=guard.minutes}#settle(record10){if(record10.settled)return;record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.changed();let exit=record10.runtime.exitResult,status=describeExit(record10.runtime)??"exited",code=exit?.exitCode,codeText=code==null?"":` (exit code ${code})`;this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary:exit?.timedOut?`watcher killed at deadline (${status})`:`watcher ${status}${codeText}`}),this.#host.ended(record10,exit?.timedOut?"timeout":exit?.cancelled?"killed":"exit",code??null)}#disposeRecord(record10){record10.settled||(record10.settled=!0,record10.unsubscribeOutput?.(),record10.unsubscribeExit?.(),this.#records.delete(record10.id),this.#host.ended(record10,"disposed",null))}};import{watch as watch3}from"node:fs";import{basename as basename29,join as join71}from"node:path";import{lstat as lstat3,open as open8,stat as stat10}from"node:fs/promises";import{dirname as dirname58}from"node:path";import{createHash as createHash27}from"node:crypto";async function digestFileHandle(handle,signal){if(signal?.aborted)throw new Error("file monitor registration cancelled");let metadata=await handle.stat(),hash=createHash27("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")}`}async function checkFileOnce(record10,actions){if(record10.settled)return;let current=null,handle;try{if(realpathWithoutOpen(dirname58(record10.path))!==record10.canonicalParent){actions.settle(`watcher error: monitored parent changed: ${dirname58(record10.path)}`);return}if((await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(realpathWithoutOpen(record10.canonicalPath)!==record10.canonicalPath)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);handle=await open8(record10.canonicalPath,"r");let opened=await handle.stat();if(!opened.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${record10.path}`);if((opened.dev!==record10.device||opened.ino!==record10.inode)&&opened.nlink>1)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);if(current=opened,(await lstat3(record10.canonicalPath)).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${record10.path}`);let reboundPath=await stat10(record10.canonicalPath);if(!reboundPath.isFile()||reboundPath.dev!==opened.dev||reboundPath.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}catch(error2){if(await handle?.close(),error2?.code!=="ENOENT"){actions.settle(`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`);return}}let present=current!==null,digest3="";try{if(digest3=present&&handle?await digestFileHandle(handle):"",present&&handle){let afterDigest=await stat10(record10.canonicalPath),opened=await handle.stat();if(afterDigest.dev!==opened.dev||afterDigest.ino!==opened.ino)throw new Error(`Cannot watch file: target identity changed: ${record10.path}`)}}finally{await handle?.close()}let changed=record10.event==="create"?!record10.present&&present:record10.present&&present&&(current.mtimeMs!==record10.mtimeMs||current.size!==record10.size||digest3!==record10.digest);record10.pendingChange||=changed,!record10.present&¤t&&(record10.device=current.dev,record10.inode=current.ino),record10.present=present,record10.mtimeMs=current?.mtimeMs??0,record10.size=current?.size??0,record10.digest=digest3,!(!record10.pendingChange||record10.paused||record10.settled)&&(record10.pendingChange=!1,!record10.settled&&actions.fire(`${record10.event} ${record10.path}`))}var RegistrationGuard=class{#pending=new Set;open(release4,timeoutMs){let pending={release:release4,abort:new AbortController,deadline:setTimeout(()=>pending.abort.abort(),timeoutMs),settled:!1};return this.#pending.add(pending),pending}finishAll(){for(let pending of[...this.#pending])this.finish(pending)}finish(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 await(pending,operation,lateCleanup){if(pending.abort.signal.aborted)throw operation.then(value=>lateCleanup?.(value),()=>{}),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(value=>(aborted&&lateCleanup?.(value),value),error2=>{if(!aborted)throw error2});return Promise.race([guarded,abort])}};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)}};function newFileRecord(input){let{id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4,digest:digest3,initial}=input,persistent=options.persistent??options.expiresAt!==void 0;return{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:path14,canonicalPath:canonicalPath2,canonicalParent:approvedParent,event:options.event,watcher,release:release4??(()=>{}),watch:new FileWatchLoop(input.check),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(input.timedOut,options.timeoutMs)}}import{access as access5,lstat as lstat4,open as open9,stat as stat11}from"node:fs/promises";import{basename as basename28,dirname as dirname59,join as join70,resolve as resolve42}from"node:path";async function proveWatchTarget(guard,pending,options,isDisposed){let path14=resolve42(options.cwd,options.path),parent=dirname59(path14),approvedParent;try{await guard.await(pending,access5(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(isDisposed())throw new Error("Cannot create file monitor: monitor registry is disposed.")}catch(error2){throw 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 guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target is a symbolic link: ${path14}`);if(initialHandle=await guard.await(pending,open9(path14,"r"),async handle=>{await handle.close()}),initial=await guard.await(pending,initialHandle.stat()),!initial.isFile())throw new Error(`Cannot watch file: target is not a regular file: ${path14}`);if(realpathWithoutOpen(path14)!==join70(approvedParent,basename28(path14)))throw new Error(`Cannot watch file: target identity changed: ${path14}`);if((await guard.await(pending,lstat4(path14))).isSymbolicLink())throw new Error(`Cannot watch file: target identity changed: ${path14}`);let reboundStat=await guard.await(pending,stat11(path14));if(!reboundStat.isFile()||reboundStat.dev!==initial.dev||reboundStat.ino!==initial.ino)throw new Error(`Cannot watch file: target identity changed: ${path14}`)}catch(error2){if(await initialHandle?.close(),initialHandle=void 0,error2?.code!=="ENOENT")throw error2}return{path:path14,parent,approvedParent,initial,initialHandle}}var FileMonitorSource=class{#files=new Map;#guard=new RegistrationGuard;#host;#reserve;#nextFileId=1;#disposed=!1;#parked=!1;#pendingRegistrations=0;#lifecycle=0;constructor(host,reserve){this.#host=host,this.#reserve=reserve}get(id){return this.#files.get(id)}values(){return this.#files.values()}keys(){return this.#files.keys()}setParked(parked){this.#parked=parked;for(let record10 of this.#files.values())parked?record10.watch.pause():record10.paused||record10.watch.resume()}get parked(){return this.#parked}dispose(){this.#disposed=!0,this.#lifecycle+=1;for(let record10 of this.#files.values())this.#settleFile(record10,"watcher disposed");this.#guard.finishAll()}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=this.#guard.open(release4??void 0,options.timeoutMs),target;try{target=await proveWatchTarget(this.#guard,pending,options,()=>this.#disposed)}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,error2}let{path:path14,parent,approvedParent,initial}=target,initialHandle=target.initialHandle;if(this.#disposed||lifecycle!==this.#lifecycle||this.#pendingRegistrations<1)throw this.#guard.finish(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.#guard.await(pending,probeDirectoryOpenable(activationParent)),watcher=watch3(canonicalWatchPath(activationParent),(_kind,name)=>{(!name||basename29(String(name))===basename29(path14))&&this.#checkFile(id)})}catch(error2){throw this.#guard.finish(pending),this.#pendingRegistrations-=1,new Error(`Cannot watch file ${path14}: ${error2 instanceof Error?error2.message:String(error2)}`)}let registrationError;watcher.on("error",error2=>{registrationError=`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`;let record11=this.#files.get(id);record11&&this.#settleFile(record11,registrationError)});let registrationCleaned=!1,finishRegistration=()=>{registrationCleaned||(registrationCleaned=!0,this.#pendingRegistrations-=1)},cleanupRegistration=()=>{registrationCleaned||(watcher.close(),finishRegistration(),this.#guard.finish(pending))};if(this.#disposed||lifecycle!==this.#lifecycle)throw cleanupRegistration(),new Error("Cannot create file monitor: monitor registry is disposed.");let canonicalPath2=join71(approvedParent,basename29(path14)),digest3;try{digest3=initial&&initialHandle?await this.#guard.await(pending,this.#digestHandle(initialHandle,pending.abort.signal)):""}catch(error2){throw cleanupRegistration(),await initialHandle?.close(),initialHandle=void 0,registrationError?(this.#host.emitRaw({type:"summary",id,description:options.description,summary:registrationError}),new Error(registrationError)):error2}if(await initialHandle?.close(),initialHandle=void 0,registrationError)throw cleanupRegistration(),this.#host.emitRaw({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 record10=newFileRecord({id,options,path:path14,canonicalPath:canonicalPath2,approvedParent,watcher,release:release4??void 0,digest:digest3,initial,check:()=>{this.#checkFile(id)},timedOut:()=>{let current=this.#files.get(id);current&&this.#settleFile(current,"watcher timed_out")}});if(this.#files.set(id,record10),this.#parked&&record10.watch.pause(),finishRegistration(),this.#guard.finish(pending,!0),registrationError||this.#disposed||lifecycle!==this.#lifecycle)throw this.#settleFile(record10,registrationError??"watcher killed"),new Error(registrationError??"Cannot create file monitor: monitor registry is disposed.");return this.#host.changed(),{id,monitorId:record10.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}}async stopFile(id){let record10=this.#files.get(id);return record10?(this.#settleFile(record10,"watcher killed"),!0):!1}async stopAllFiles(){this.#lifecycle+=1;let records=[...this.#files.values()];for(let record10 of records)this.#settleFile(record10,"watcher killed");return this.#guard.finishAll(),records.length}#settleFile(record10,summary){if(record10.settled)return;record10.settled=!0,record10.watch.stop(),clearTimeout(record10.deadline),record10.watcher.close(),record10.release(),this.#files.delete(record10.id),this.#host.changed(),this.#host.emit(record10,{type:"summary",id:record10.id,description:record10.description,summary});let reason=summary==="watcher timed_out"?"timeout":summary==="watcher killed"?"killed":summary==="watcher disposed"?"disposed":"exit";this.#host.ended(record10,reason,null)}async#checkFile(id){let record10=this.#files.get(id);if(!(!record10||record10.settled||record10.paused||this.#parked)){if(record10.checking){record10.dirty=!0;return}return record10.checking=checkFileOnce(record10,{settle:summary=>this.#settleFile(record10,summary),fire:line=>{this.#host.emit(record10,{type:"line",id:record10.id,description:record10.description,line}),this.#settleFile(record10,"watcher completed")}}).catch(error2=>{record10.settled||this.#settleFile(record10,`watcher error: ${error2 instanceof Error?error2.message:String(error2)}`)}).finally(()=>{record10.checking=void 0;let now2=Date.now();now2-record10.dirtyWindowStartedAt>=1e3&&(record10.dirtyWindowStartedAt=now2,record10.dirtyPasses=0),record10.dirty&&!record10.settled&&record10.dirtyPasses<1?(record10.dirty=!1,record10.dirtyPasses+=1,this.#checkFile(id)):record10.dirty=!1}),record10.checking}}async#digestHandle(handle,signal){return digestFileHandle(handle,signal)}};function loadRpcMonitorSource(){return import("./rpc-monitor-source-B5NQ4ZVH.js")}var MonitorRegistry=class{#emit;#onChange;#onEnded;#onFire;#commands;#files;#host;#rpc;#parked=!1;#runawayGuard={linesPerMinute:DEFAULT_MONITOR_RUNAWAY_LINES_PER_MINUTE,minutes:DEFAULT_MONITOR_RUNAWAY_MINUTES};constructor(emit2,options){this.#emit=emit2,this.#onChange=options?.onChange,this.#onEnded=options?.onEnded,this.#onFire=options?.onFire;let host={emit:(record10,event)=>this.#emitForRecord(record10,event),emitRaw:event=>this.#emit(event),ended:(record10,reason,exitCode)=>this.#emitEnded(record10,reason,exitCode),changed:()=>this.#notifyChange(),runawayGuard:()=>this.#runawayGuard};this.#host=host,this.#commands=new CommandMonitorSource(host),this.#files=new FileMonitorSource(host,options?.reserve)}setRunawayGuard(guard){this.#runawayGuard=guard}wakePacing(id){let record10=this.#commands.get(id);if(!(record10===void 0||!record10.persistent))return{wakesPerHour:record10.wakesPerHour}}setParked(parked){this.#parked!==parked&&(this.#parked=parked,this.#files.setParked(parked))}snapshot(){return[...this.#commands.values(),...this.#files.values(),...this.#rpc?.values()??[]].map(record10=>({id:record10.id,monitorId:record10.monitorId,description:record10.description,paused:record10.paused,startedAtMs:record10.startedAtMs,command:record10.command,filter:record10.filter?.source??null,persistent:record10.persistent,deadlineMs:record10.deadlineMs,fireCount:record10.fireCount,lastFiredAtMs:record10.lastFiredAtMs,expiresAt:record10.expiresAt,fireWindow:"fireWindow"in record10?record10.fireWindow:void 0}))}registerFile(options){return this.#files.registerFile(options)}fileCheckpoint(id){return this.#files.fileCheckpoint(id)}emitFileLine(id,line){return this.#files.get(id)!==void 0&&this.emitLine(id,line)}emitLine(id,line){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return!record10||record10.settled?!1:(this.#emitForRecord(record10,{type:"line",id:record10.id,description:record10.description,line}),!0)}stopFile(id){return this.#files.stopFile(id)}stopAllFiles(){return this.#files.stopAllFiles()}register(options){return this.#commands.register(options)}async registerRpc(options){if(this.#rpc===void 0){let{RpcMonitorSource}=await loadRpcMonitorSource();this.#rpc??=new RpcMonitorSource(this.#host)}return this.#rpc.register(options)}stopRpc(id){return this.#rpc?.settle(id,"watcher killed")??!1}stopAllRpc(){return this.#rpc?.settleAll("watcher killed")??0}pause(ids){let paused=[];for(let id of ids){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);!record10||record10.paused||(record10.paused=!0,"watch"in record10&&record10.watch.pause(),paused.push(record10.id))}return paused.length>0&&this.#notifyChange(),paused}pauseAll(){return this.pause([...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]])}resume(ids){let candidates=ids??[...this.#commands.keys(),...this.#files.keys(),...this.#rpc?.keys()??[]],resumed=[];for(let id of candidates){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);if(!record10?.paused)continue;record10.paused=!1;let mutedDropped="mutedDropped"in record10?record10.mutedDropped:0;"mutedDropped"in record10&&(record10.mutedDropped=0),"fireWindow"in record10&&record10.fireWindow!==void 0&&(record10.fireWindow.count=0),"runaway"in record10&&(record10.runaway=void 0),resumed.push({id:record10.id,mutedDropped}),"watch"in record10&&!this.#files.parked&&record10.watch.resume()}return resumed.length>0&&this.#notifyChange(),resumed}mutedDropped(id){return this.#commands.get(id)?.mutedDropped??this.#rpc?.get(id)?.mutedDropped??0}rearm(id){let record10=this.#commands.get(id)??this.#files.get(id)??this.#rpc?.get(id);return record10?record10.paused?(this.resume([id]),"rearmed"):"not_paused":"not_found"}adoptFireWindow(monitorId,fireWindow2){return this.#commands.adoptFireWindow(monitorId,fireWindow2)}dispose(){this.#commands.dispose(),this.#files.dispose(),this.#rpc?.settleAll("watcher disposed"),this.#notifyChange()}#notifyChange(){this.#onChange?.(this.snapshot())}#emitForRecord(record10,event){record10.fireCount+=1,record10.lastFiredAtMs=Date.now(),this.#emit(event),record10.settled||this.#onFire?.(this.snapshot())}#emitEnded(record10,reason,exitCode){this.#onEnded?.({id:record10.id,description:record10.description,startedAtMs:record10.startedAtMs,endedAtMs:Date.now(),reason,exitCode,fireCount:record10.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(state3){return new TerminalSessionBundle({maxSessions:state3.settings.maxSessions,scrollback:state3.settings.scrollback})}function bundleSinks(pi,state3){return{onMonitorEvent:event=>state3.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(state3.ctx),monitorId=state3.bundle?.manager.monitorIdOf(event.id);dir===void 0||monitorId===void 0||removeMonitorStateDir(dir,monitorId).catch(error2=>{state3.ctx?.ui?.notify?.(`Could not remove the state dir of ${monitorId}: ${error2 instanceof Error?error2.message:String(error2)}`,"warning")})},onMonitorState:(snapshot,transition=!0)=>{state3.parked||state3.statusTicker.sync(snapshot);let payload={activeCount:snapshot.length,monitors:snapshot.map(entry2=>({id:entry2.id,description:entry2.description,paused:entry2.paused,startedAtMs:entry2.startedAtMs,command:entry2.command,filter:entry2.filter,persistent:entry2.persistent,deadlineMs:entry2.deadlineMs,fireCount:entry2.fireCount,lastFiredAtMs:entry2.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(entry2=>({id:entry2.id,description:entry2.description,startedAtMs:entry2.startedAtMs}))}),state3.manifestWriter&&state3.manifestWriter.observeMonitorState(snapshot))},onBackgroundState:snapshot=>{pi.events?.emit(WAKE_SOURCE_STATE_EVENT,{source:"terminal-background-sessions",activeCount:snapshot.length,items:snapshot});let record10=()=>{let writer=state3.manifestWriter;if(writer)for(let entry2 of snapshot){if(state3.recordedBackgroundIds.has(entry2.id))continue;state3.recordedBackgroundIds.add(entry2.id);let identity=state3.bundle?.manager.get(entry2.id)?.identity();writer.recordBackgroundStart(entry2.id,entry2.description??entry2.id,entry2.startedAtMs,identity)}};if(state3.manifestWriter===null&&state3.ensurePersistence!==null&&snapshot.length>0){state3.ensurePersistence().then(record10);return}record10()},onBackgroundExit:(id,runtime)=>{state3.recordedBackgroundIds.delete(id),state3.manifestWriter&&state3.manifestWriter.recordBackgroundExit(id),state3.notifier?.notifyCompletion(id,runtime)}}}function buildToolContext(pi,state3){let requireBundle=()=>(state3.bundle||(state3.bundle=createBundle(state3),state3.bundle.monitors.setParked(state3.parked),state3.bundle.bind(bundleSinks(pi,state3))),state3.bundle);return{get manager(){return requireBundle().manager},get cwd(){return state3.ctx?.cwd??process.cwd()},get shellPath(){return state3.shellPath},get defaultCols(){return state3.settings.defaultCols},get defaultRows(){return state3.settings.defaultRows},get timeoutAction(){return state3.settings.timeoutAction},get maxDurableMonitors(){return state3.settings.maxDurableMonitors},get monitorRegistry(){return requireBundle().monitors},getEnv:()=>getShellEnv(),getSessionContext:()=>state3.ctx,onBackgroundStart:(id,description,startedAtMs)=>{state3.bundle?.notifyBackgroundStart(id,description,startedAtMs)},onBackgroundExit:(id,runtime)=>{state3.bundle?.notifyBackgroundExit(id,runtime)},onMonitorRearmed:id=>state3.monitorNotifier?.rearm(id),onMonitorsResumed:ids=>state3.monitorNotifier?.resume(ids),ensurePersistence:()=>state3.ensurePersistence?.()??Promise.resolve()}}import{randomUUID as randomUUID12}from"node:crypto";import{mkdir as mkdir13}from"node:fs/promises";import{join as join72}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 isFiniteNumber2=value=>typeof value=="number"&&Number.isFinite(value);function readLeaseRecord(raw){try{let parsed=JSON.parse(raw);if(typeof parsed!="object"||parsed===null)return"unparseable";let candidate=parsed;return!isFiniteNumber2(candidate.pid)||!isFiniteNumber2(candidate.startedAtMs)?"unparseable":{pid:candidate.pid,startedAtMs:candidate.startedAtMs,...isFiniteNumber2(candidate.v)?{v:candidate.v}:{},...typeof candidate.token=="string"?{token:candidate.token}:{},...isFiniteNumber2(candidate.bootAtMs)?{bootAtMs:candidate.bootAtMs}:{},...isFiniteNumber2(candidate.processStartedAtMs)?{processStartedAtMs:candidate.processStartedAtMs}:{},...isFiniteNumber2(candidate.acquiredAtMs)?{acquiredAtMs:candidate.acquiredAtMs}:{}}}catch{return"unparseable"}}async function readLeaseFile(path14){let raw=await readLeaseText(path14);return raw===void 0?"missing":readLeaseRecord(raw)}async function classifyLease(existing2,self,probes){if(existing2.pid===self.pid)return existing2.token!==void 0&&(probes.liveTokens??liveTokens).has(existing2.token)?"live-foreign":"self";if(!probeAlive(existing2.pid,probes.isProcessAlive))return"dead";let observedStart;try{observedStart=await probes.readProcessStartMs(existing2.pid)}catch{observedStart=void 0}return observedStart===void 0?"live-foreign":existing2.processStartedAtMs===void 0?observedStart<=existing2.startedAtMs+PROCESS_START_TOLERANCE_MS?"live-foreign":"reused":sameProcessStartMs(existing2.processStartedAtMs,observedStart)?"live-foreign":"reused"}function holderOf(record10){return{pid:record10.pid,startedAtMs:record10.startedAtMs,...record10.bootAtMs!==void 0?{bootAtMs:record10.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,path14=join72(options.dir,`${options.encodedSessionId}.lease`);await mkdir13(options.dir,{recursive:!0});let token=randomUUID12(),record10={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:path14,pid,token}),probes={isProcessAlive:options.isProcessAlive,readProcessStartMs:options.readProcessStartMs??readProcessStartMs},content=JSON.stringify(record10);for(let attempt2=0;attempt2<3;attempt2+=1){try{return await publishExclusive(path14,content),acquired()}catch(error2){if(errorCode(error2)!=="EEXIST")throw error2}let raw2=await readLeaseText(path14);if(raw2===void 0)continue;let existing2=readLeaseRecord(raw2),verdict=existing2==="unparseable"?"dead":await classifyLease(existing2,{...self,pid},probes);if(verdict==="self")return await publishReplace(path14,content),acquired();if(verdict==="live-foreign"&&existing2!=="unparseable")return{acquired:!1,holder:holderOf(existing2)};let reclaim=await reclaimInspected(path14,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(path14),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 ${path14} kept changing while it was being acquired`)}async function releaseTerminalLease(handle){let existing2=await readLeaseFile(handle.path);if(!(existing2==="missing"||existing2==="unparseable")&&existing2.pid===handle.pid&&!(handle.token!==void 0&&existing2.token!==void 0&&existing2.token!==handle.token)&&(await unlinkIfPresent(handle.path),existing2.token!==void 0)){liveTokens.delete(existing2.token);for(let[sessionId,token]of generationTokens)token===existing2.token&&generationTokens.delete(sessionId)}}function monitorDetails(events,ids,overflowBook){return[...ids].map(id=>{let own=events.filter(event=>event.id===id),overflow=overflowBook.get(id),kinds=new Set(own.map(event=>event.type));for(let kind of overflow?.kinds??[])kinds.add(kind);let humanInput=own.some(event=>event.type==="line"&&event.humanInput===!0)||overflow?.humanInput===!0;return{id,description:own[0]?.description??overflow?.description??id,eventCount:own.length+(overflow?.count??0),kinds:[...kinds],...humanInput?{humanInput:!0}:{}}})}var SYSTEM_REMINDER_OPEN="<system-reminder>",SYSTEM_REMINDER_CLOSE="</system-reminder>",WAKE_BUDGET_PAUSE_NOTICE="Monitor paused after repeated updates. Completion still wakes this session; peek bash_output or re-arm only for intermediate events.";function eventBody(event){let value=event.type==="line"?event.line:event.summary;return sanitizeTerminalOutput(value).replace(/[\r\n]+/g," ").trimEnd()}function renderedLength(event){return`Monitor event(${event.description}): ${eventBody(event)}`.length}function groupHeader(description){return`Monitor event(${description}): `}function monitorShareChars(events,notice2){let first=events[0];return(first===void 0?0:groupHeader(first.description).length+events.reduce((total,event)=>total+eventBody(event).length+1,0))+(notice2.length>0?notice2.length+1:0)}function clip(text3,maxChars){return text3.length<=maxChars?text3:maxChars<=3?text3.slice(0,maxChars):`${text3.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=>`${groupHeader(group.description)}${group.bodies.join(`
|
|
1810
1810
|
`)}`).join(`
|
|
1811
1811
|
`)}function buildWakeMessage(events,notices,pauseNotice,maxChars){let suffix=[...notices,pauseNotice].filter(Boolean).join(`
|
|
1812
1812
|
`),fixedChars=SYSTEM_REMINDER_OPEN.length+SYSTEM_REMINDER_CLOSE.length+(suffix?suffix.length+1:0),body=clip(formatEvents(events),Math.max(0,maxChars-fixedChars));return`${SYSTEM_REMINDER_OPEN}${body}${body&&suffix?`
|
|
@@ -2038,13 +2038,13 @@ Press any key to continue...`)),await new Promise(resolve55=>{process.stdin.setR
|
|
|
2038
2038
|
`)}await rebindSession(),initialMessage&&await session.prompt(initialMessage,{images:initialImages,sessionTitlePrompt:!1});for(let message of messages)await session.prompt(message,{sessionTitlePrompt:!1});await session.waitForSettledSessionWork();let lastMessage=session.state.messages.findLast(message=>message.role==="assistant"),failed=lastMessage?.role==="assistant"&&(lastMessage.stopReason==="error"||lastMessage.stopReason==="aborted"),exitCode=failed?1:0;if(mode==="text"&&lastMessage?.role==="assistant"){let assistantMsg=lastMessage;if(failed){let described=assistantMsg.errorCause?.type==="usage_limit"&&assistantMsg.errorCause.scope==="account"?assistantMsg.errorMessage:describeProviderFailureForUser(assistantMsg.errorMessage,{model:`${assistantMsg.provider}/${assistantMsg.model}`,usageLimit:usageLimitScope(assistantMsg)});console.error(described??(stripTurnRetrySuppressionPrefix(assistantMsg.errorMessage??"")||`Request ${assistantMsg.stopReason}`))}else for(let content of assistantMsg.content)content.type==="text"?writeRawStdout(`${content.text}
|
|
2039
2039
|
`):content.type==="providerNative"&&(writeRawStdout(`${formatProviderNativeSummary(assistantMsg,content,!1)}
|
|
2040
2040
|
`),writeRawStdout(`${formatProviderNativeBody(content,!1)}
|
|
2041
|
-
`))}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 readdirSync15,readFileSync as readFileSync46}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 entry2 of readdirSync15("/proc")){let pid=Number(entry2);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 readFileSync46(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat19=linuxStat(pid),tail=stat19?.slice(stat19.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat19=linuxStat(pid),open12=stat19?.indexOf("(")??-1,close=stat19?.lastIndexOf(")")??-1;return stat19===void 0||open12===-1||close<=open12?"":stat19.slice(open12+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_MS2=1e3,CHILD_REAPER_IDLE_TICK_MS=5e3,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_MS2,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)},get childCount(){return tracked.size}}}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,count2])=>`${name} x${count2}`).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});return scheduleChildReaper(reaper,config.tickMs)}function scheduleChildReaper(reaper,tickMs){let timer,arm=()=>{timer=setTimeout(()=>{reaper.tick(),timer!==void 0&&arm()},reaper.childCount>0?tickMs:Math.max(tickMs,CHILD_REAPER_IDLE_TICK_MS)),timer.unref()};return arm(),()=>{timer!==void 0&&clearTimeout(timer),timer=void 0}}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-U36U7JTE.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 randomUUID16}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync29,renameSync as renameSync17,rmSync as rmSync14}from"node:fs";import{basename as basename34,dirname as dirname67,join as join99,relative as relative21,resolve as resolve51,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path14){return toNamespacedPath(resolve51(path14))}function getQuarantineRoot(packageDir){let current=resolve51(packageDir);for(;;){if(basename34(current).toLowerCase()==="node_modules")return join99(current,QUARANTINE_DIR_NAME);let parent=dirname67(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 value of sharedObjects){if(typeof value!="string")continue;let filePath=normalizePath3(value),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=join99(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID16()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join99(quarantineRunDir,relative21(resolvedPackageDir,loadedFile));mkdirSync29(dirname67(quarantinePath),{recursive:!0}),renameSync17(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;function collectAuthDiagnostics(authStorage,context,options){return[...authStorage.drainErrors().map(error2=>error2.message),...authStorage.takePendingNotices(options).map(notice2=>notice2.message)].map(message=>({type:"warning",message:`(${context}, auth storage) ${message}`}))}function interactiveAuthNotices(authStorage){let pending=authStorage.takePendingNotices({persistSeen:!1});return{messages:[...authStorage.drainErrors().map(error2=>error2.message),...pending.map(notice2=>notice2.message)],markSeen:()=>authStorage.markNoticesSeen(pending.map(notice2=>notice2.id))}}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path14,error:error2})=>({type:"warning",message:`Failed to load extension "${path14}": ${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(value){return value?value==="1"||value.toLowerCase()==="true"||value.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}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(`
|
|
2041
|
+
`))}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 readdirSync15,readFileSync as readFileSync46}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 entry2 of readdirSync15("/proc")){let pid=Number(entry2);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 readFileSync46(`/proc/${pid}/stat`,"utf8")}catch{return}}function parentOf(pid){let stat19=linuxStat(pid),tail=stat19?.slice(stat19.lastIndexOf(")")+2).split(" ");return tail===void 0?void 0:Number(tail[1])}function linuxName(pid){let stat19=linuxStat(pid),open12=stat19?.indexOf("(")??-1,close=stat19?.lastIndexOf(")")??-1;return stat19===void 0||open12===-1||close<=open12?"":stat19.slice(open12+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_MS2=1e3,CHILD_REAPER_IDLE_TICK_MS=5e3,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_MS2,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)},get childCount(){return tracked.size}}}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,count2])=>`${name} x${count2}`).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});return scheduleChildReaper(reaper,config.tickMs)}function scheduleChildReaper(reaper,tickMs){let timer,arm=()=>{timer=setTimeout(()=>{reaper.tick(),timer!==void 0&&arm()},reaper.childCount>0?tickMs:Math.max(tickMs,CHILD_REAPER_IDLE_TICK_MS)),timer.unref()};return arm(),()=>{timer!==void 0&&clearTimeout(timer),timer=void 0}}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-TN5NEGNF.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 randomUUID16}from"node:crypto";import{copyFileSync as copyFileSync3,existsSync as existsSync45,mkdirSync as mkdirSync29,renameSync as renameSync17,rmSync as rmSync14}from"node:fs";import{basename as basename34,dirname as dirname67,join as join99,relative as relative21,resolve as resolve51,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath3(path14){return toNamespacedPath(resolve51(path14))}function getQuarantineRoot(packageDir){let current=resolve51(packageDir);for(;;){if(basename34(current).toLowerCase()==="node_modules")return join99(current,QUARANTINE_DIR_NAME);let parent=dirname67(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 value of sharedObjects){if(typeof value!="string")continue;let filePath=normalizePath3(value),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=join99(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID16()}`);for(let loadedFile of loadedFiles){if(!existsSync45(loadedFile))continue;let quarantinePath=join99(quarantineRunDir,relative21(resolvedPackageDir,loadedFile));mkdirSync29(dirname67(quarantinePath),{recursive:!0}),renameSync17(loadedFile,quarantinePath),copyFileSync3(quarantinePath,loadedFile)}}var EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME} -ne".`;function collectAuthDiagnostics(authStorage,context,options){return[...authStorage.drainErrors().map(error2=>error2.message),...authStorage.takePendingNotices(options).map(notice2=>notice2.message)].map(message=>({type:"warning",message:`(${context}, auth storage) ${message}`}))}function interactiveAuthNotices(authStorage){let pending=authStorage.takePendingNotices({persistSeen:!1});return{messages:[...authStorage.drainErrors().map(error2=>error2.message),...pending.map(notice2=>notice2.message)],markSeen:()=>authStorage.markNoticesSeen(pending.map(notice2=>notice2.id))}}function collectExtensionLoadDiagnostics(errors){return errors.map(({path:path14,error:error2})=>({type:"warning",message:`Failed to load extension "${path14}": ${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(value){return value?value==="1"||value.toLowerCase()==="true"||value.toLowerCase()==="yes":!1}function resolveAppMode(parsed,stdinIsTTY,stdoutIsTTY){return parsed.mode==="rpc"?"rpc":parsed.mode==="json"?"json":parsed.print||!stdinIsTTY||!stdoutIsTTY?"print":"interactive"}function toPrintOutputMode(appMode){return appMode==="json"?"json":"text"}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(`
|
|
2042
2042
|
`));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}
|
|
2043
2043
|
`),!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}
|
|
2044
|
-
`),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:text3,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text3,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localSessions=sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd),localMatch=localSessions.find(s=>s.id===sessionId)??localSessions.find(s=>sessionFileNameId(s.path)===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}function findSessionByIdOrFileName(sessions2,arg){return sessions2.find(s=>s.id===arg)??sessions2.find(s=>sessionFileNameId(s.path)===arg)??sessions2.find(s=>s.id.startsWith(arg))}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=findSessionByIdOrFileName(localSessions,sessionArg);if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=findSessionByIdOrFileName(allSessions,sessionArg);return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve55=>{let rl=createInterface3({input:process.stdin,output:process.stdout}),settled2=!1,settle2=result3=>{settled2||(settled2=!0,resolve55(result3))};rl.question(`${message} [y/N] `,answer3=>{let normalized2=answer3.trim().toLowerCase();settle2(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle2(!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(path14,sessionDir){try{return SessionManager.open(path14,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)}}async function sessionCwdOrUndefined(sessionFile){try{return await readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.spawnedBy&&(parsed.session||parsed.resume||parsed.continue||parsed.fork||parsed.rebind)&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming or forking a session.")),parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,{id:parsed.sessionId,spawnedBy:parsed.spawnedBy});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:await 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":{if(resolved.cwd!==""&&resolvePath(resolveMovedPath(resolved.cwd))===resolvePath(cwd))return openSessionOrExit(resolved.path,sessionDir);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-KQUFWDQC.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 movedHere=sessionDir===void 0?await movedHereSessionToContinue(cwd):void 0;if(movedHere!==void 0)return SessionManager.open(movedHere,sessionDir);let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let movedChoice=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return movedChoice===void 0?recent:rebindSessionOrExit(movedChoice,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return parsed.spawnedBy&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming an existing session.")),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,spawnedBy:parsed.spawnedBy})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value=>isLocalPath(value)?resolvePath(value,cwd):value)}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,toolRuntime}=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":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),fullAccessTrust=presetTrustsProject(sessionExtensionFlagValues(parsed.unknownFlags,launchProfile).get("permission-preset"),startupSettingsManager.getGlobalSettings().permissionPreset)&&trustStore.get(cwd2)!==!1,shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&!fullAccessTrust&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(fullAccessTrust||!hasTrustRequiringResources||trustStore.get(cwd2)===!0),trustFromFullAccess=fullAccessTrust&&hasTrustRequiringResources&&cachedProjectTrust===void 0&&parsed.projectTrustOverride===void 0&&trustStore.get(cwd2)!==!0,runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted,trustFromFullAccess});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: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:path14,warning})=>({type:"warning",message:`Extension package "${path14}": ${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,...toolRuntime!==void 0?{toolRuntime}:{}});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("--print-prompt-sizes")||args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;await exitAfterOutput("",exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories}))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&await exitAfterOutput("",hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&await exitAfterOutput("",scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}let toolRuntimeResolution=resolveToolRuntime(parsed);!toolRuntimeResolution.ok&&!parsed.version&&!parsed.help&&(console.error(source_default.red(`Error: ${toolRuntimeResolution.message}`)),process.exit(1));let toolRuntime=toolRuntimeResolution.ok?toolRuntimeResolution.value:"in-process";if(time("parseArgs"),parsed.version&&await printThenExit(()=>console.log(DISPLAY_VERSION),0),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}await printThenExit(()=>console.log(`Exported to: ${result3}`),0)}let appMode=parsed.printPromptSizes?"print":resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),await printThenExit(()=>{printHelp(flags2),printTimings()},0)}if(parsed.listTips){let{listTips}=await import("./list-tips-CREX4IXZ.js");await printThenExit(listTips,0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing",{persistSeen:!0})]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode,toolRuntime},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-M7HVUMRH.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join100(agentDir,"auth.json")),authPath:join100(agentDir,"auth.json"),agentDir,modelsPath:join100(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),offlineMode||startSubscriptionUsagePolling({agentDir,report:message=>{process.stderr.write(`${message}
|
|
2044
|
+
`),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:text3,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages});return buildInitialMessage({parsed,fileText:text3,fileImages:images,stdinContent})}async function findLocalSessionByExactId(sessionId,cwd,sessionDir){let localSessions=sessionDir?await SessionManager.listAll(sessionDir):await SessionManager.list(cwd),localMatch=localSessions.find(s=>s.id===sessionId)??localSessions.find(s=>sessionFileNameId(s.path)===sessionId);return localMatch?{type:"local",path:localMatch.path}:void 0}function findSessionByIdOrFileName(sessions2,arg){return sessions2.find(s=>s.id===arg)??sessions2.find(s=>sessionFileNameId(s.path)===arg)??sessions2.find(s=>s.id.startsWith(arg))}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=findSessionByIdOrFileName(localSessions,sessionArg);if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=findSessionByIdOrFileName(allSessions,sessionArg);return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message){return new Promise(resolve55=>{let rl=createInterface3({input:process.stdin,output:process.stdout}),settled2=!1,settle2=result3=>{settled2||(settled2=!0,resolve55(result3))};rl.question(`${message} [y/N] `,answer3=>{let normalized2=answer3.trim().toLowerCase();settle2(normalized2==="y"||normalized2==="yes"),rl.close()}),rl.once("close",()=>settle2(!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(path14,sessionDir){try{return SessionManager.open(path14,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)}}async function sessionCwdOrUndefined(sessionFile){try{return await readSessionCwd(sessionFile)}catch{return}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager,appMode){if(parsed.spawnedBy&&(parsed.session||parsed.resume||parsed.continue||parsed.fork||parsed.rebind)&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming or forking a session.")),parsed.noSession||parsed.help||parsed.listModels!==void 0||parsed.listTips)return SessionManager.inMemory(cwd,{id:parsed.sessionId,spawnedBy:parsed.spawnedBy});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:await 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":{if(resolved.cwd!==""&&resolvePath(resolveMovedPath(resolved.cwd))===resolvePath(cwd))return openSessionOrExit(resolved.path,sessionDir);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-465FVXQG.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 movedHere=sessionDir===void 0?await movedHereSessionToContinue(cwd):void 0;if(movedHere!==void 0)return SessionManager.open(movedHere,sessionDir);let recent=SessionManager.continueRecent(cwd,sessionDir),recentFile=recent.getSessionFile();if(recentFile!==void 0&&existsSync46(recentFile))return recent;let movedChoice=await movedSessionToContinue({cwd,...sessionDir===void 0?{}:{sessionDir},interactive:appMode==="interactive",confirm:promptConfirm,out:line=>console.log(line),err:line=>console.error(line)});return movedChoice===void 0?recent:rebindSessionOrExit(movedChoice,cwd,sessionDir)}if(parsed.sessionId){let existingSession=await findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return parsed.spawnedBy&&console.error(source_default.yellow("Warning: --spawned-by is ignored when resuming an existing session.")),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,spawnedBy:parsed.spawnedBy})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error,code:"model_unresolved"}),resolved.model&&(options.model=resolved.model,options.serviceTier=resolved.serviceTier,options.initialModelProvenance="cli",!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,options.thinkingSelection=resolved.thinkingSelection,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,options.initialModelProvenance="scoped",!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel,options.thinkingSelection=savedInScope.thinkingSelection)):(options.model=scopedModels[0].model,options.initialModelProvenance="scoped",!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel,options.thinkingSelection=scopedModels[0].thinkingSelection))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking,options.thinkingSelection={level:parsed.thinking,source:"explicit"}),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel,thinkingSelection:sm.thinkingSelection,serviceTier:sm.serviceTier}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value=>isLocalPath(value)?resolvePath(value,cwd):value)}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,toolRuntime}=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":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),fullAccessTrust=presetTrustsProject(sessionExtensionFlagValues(parsed.unknownFlags,launchProfile).get("permission-preset"),startupSettingsManager.getGlobalSettings().permissionPreset)&&trustStore.get(cwd2)!==!1,shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&!fullAccessTrust&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(fullAccessTrust||!hasTrustRequiringResources||trustStore.get(cwd2)===!0),trustFromFullAccess=fullAccessTrust&&hasTrustRequiringResources&&cachedProjectTrust===void 0&&parsed.projectTrustOverride===void 0&&trustStore.get(cwd2)!==!0,runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted,trustFromFullAccess});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: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:path14,warning})=>({type:"warning",message:`Extension package "${path14}": ${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,...toolRuntime!==void 0?{toolRuntime}:{}});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("--print-prompt-sizes")||args.includes("--offline")||isTruthyEnvFlag2(envValue("OFFLINE"));if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args))return;if(isModelsDiscoverCommand(args)){process.exitCode=await runModelsDiscoverCommand(args.slice(2));return}if(await dispatchInternalSupervisor(args))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getInstallPackageDir());let cwd=process.cwd(),agentDir=getAgentDir(),fromSourceWarning=getFromSourceRealConfigWarning(agentDir);fromSourceWarning&&console.error(source_default.yellow(fromSourceWarning));let bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await dispatchPackageCommand(args,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args[0]==="update")return;await exitAfterOutput("",exitCode);return}if(await dispatchConfigCommand(args,{extensionFactories}))return;let hostExitCode=await dispatchHostCommand(args);hostExitCode!==void 0&&await exitAfterOutput("",hostExitCode);let scheduleExitCode=await dispatchScheduleCommand(args);scheduleExitCode!==void 0&&await exitAfterOutput("",scheduleExitCode);let parsed=parseArgs(args);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}let toolRuntimeResolution=resolveToolRuntime(parsed);!toolRuntimeResolution.ok&&!parsed.version&&!parsed.help&&(console.error(source_default.red(`Error: ${toolRuntimeResolution.message}`)),process.exit(1));let toolRuntime=toolRuntimeResolution.ok?toolRuntimeResolution.value:"in-process";if(time("parseArgs"),parsed.version&&await printThenExit(()=>console.log(DISPLAY_VERSION),0),parsed.export){let result3;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result3=await exportFromFile(parsed.export,outputPath)}catch(error2){let message=error2 instanceof Error?error2.message:"Failed to export session";console.error(source_default.red(`Error: ${message}`)),process.exit(1)}await printThenExit(()=>console.log(`Exported to: ${result3}`),0)}let appMode=parsed.printPromptSizes?"print":resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);if(appMode!=="interactive"&&(!isPlainRuntimeMetadataCommand(parsed)||parsed.help&&parsed.mode==="json")&&takeOverStdout(),parsed.mode==="json"){let log=console.log.bind(console);console.log=(...args2)=>console.error(...args2),process.once("exit",()=>{console.log=log})}parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateRebindFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir);reportDiagnostics(collectSettingsDiagnosticsWithContext(startupSettingsManager,"startup session lookup"));let resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes);if(isPlainHelpRequest(parsed)){let projectTrusted=resolveHelpProjectTrust(parsed,cwd,agentDir),scope=helpFlagsScope(parsed,cwd,agentDir,projectTrusted),{flags:flags2,extensionPaths}=await resolveHelpExtensionFlags({cwd,agentDir,settingsManager:SettingsManager.create(cwd,agentDir,{projectTrusted}),additionalExtensionPaths:resolvedExtensionPaths??[],noExtensions:parsed.noExtensions===!0,...extensionFactories?{extensionFactories}:{}});writeHelpFlagsCache({scope,flags:flags2,extensionPaths}),await printThenExit(()=>{printHelp(flags2),printTimings()},0)}if(parsed.listTips){let{listTips}=await import("./list-tips-CREX4IXZ.js");await printThenExit(listTips,0)}if(parsed.listModels!==void 0){let services2=await createAgentSessionServices({cwd,agentDir,settingsManager:startupSettingsManager,extensionFlagValues:parsed.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,extensionFactories}});reportDiagnostics([...services2.diagnostics,...collectSettingsDiagnosticsWithContext(services2.settingsManager,"model listing"),...collectAuthDiagnostics(services2.authStorage,"model listing",{persistSeen:!0})]);let searchPattern2=typeof parsed.listModels=="string"?parsed.listModels:void 0;await printThenExit(()=>listModels(services2.modelRuntime,searchPattern2),0)}if(appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&!parsed.listTips&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme}),installMemoryReportSignal(),appMode==="rpc"&&parsed.multiSession){if(options?.extensionFactories?.length)throw new Error("Shared RPC workers require file-backed extensions; inline factories cannot cross isolates");let runtimeConfiguration={parsed,cwd,agentDir,appMode,toolRuntime},sessionRuntime=resolveSessionRuntime(parsed),{runMultiSessionHost}=await import("./multi-session-host-VTTY5MFT.js"),hostModelRuntime=sessionRuntime==="worker"?void 0:await ModelRuntime.create({credentials:AuthStorage.create(join100(agentDir,"auth.json")),authPath:join100(agentDir,"auth.json"),agentDir,modelsPath:join100(agentDir,"models.json"),signal:AbortSignal.timeout(15e3)});initTheme(startupSettingsManager.getTheme(),!1),offlineMode||startSubscriptionUsagePolling({agentDir,report:message=>{process.stderr.write(`${message}
|
|
2045
2045
|
`)}}),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,toolRuntime})}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,toolRuntime},{extensionFactories,startupSettingsManager,startupLoadingIndicator});time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager}).catch(error2=>{if(!(error2 instanceof ModelUsabilityBudgetError))throw error2;startupLoadingIndicator.stop(),console.error(source_default.red(error2.message)),process.exit(1)}).finally(()=>{startupLoadingIndicator.stop()});time("createAgentSessionRuntime"),parsed.printPromptSizes&&await printPromptSizes(runtime),await prepareSessionOpening(sessionManager,appMode);let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());let loadedExtensions2=resourceLoader.getExtensions().extensions,extensionFlags=loadedExtensions2.flatMap(extension=>Array.from(extension.flags.values()));parsed.help&&await printThenExit(()=>printHelp(extensionFlags),0),time("extensionFlags"),writeHelpFlagsCache({scope:helpFlagsScope(parsed,cwd,agentDir,settingsManager.isProjectTrusted()),flags:extensionFlags,extensionPaths:loadedExtensions2.map(extension=>extension.resolvedPath)}),time("helpFlagsCache");let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(pipedStdinOptions(parsed,process.stderr)),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([...resourceLoader.getAgentsFiles().diagnostics??[],...resourceLoader.getSkills().diagnostics].filter(diagnostic2=>diagnostic2.type==="warning"&&diagnostic2.category==="size-limit").map(diagnostic2=>({type:"warning",message:diagnostic2.path?`${diagnostic2.path}: ${diagnostic2.message}`:diagnostic2.message}))),reportDiagnostics(collectAuthDiagnostics(services.authStorage,"runtime creation",{persistSeen:appMode!=="rpc"}))),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}
|
|
2046
2046
|
`)});if(!offlineMode&&(appMode==="rpc"||appMode==="interactive")&&startSubscriptionUsagePolling({agentDir,report:appMode==="interactive"?()=>{}:message=>{process.stderr.write(`${message}
|
|
2047
|
-
`)}}),appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-
|
|
2047
|
+
`)}}),appMode==="rpc"){let{runRpcMode:runRpcMode2}=await import("./rpc-mode-TOXYD4XA.js");printTimings(),await runRpcMode2(runtime,toolRuntime)}else if(appMode==="interactive"){let{InteractiveMode:InteractiveMode2}=await import("./interactive-mode-SCSROHD5.js"),interactiveMode=new InteractiveMode2(runtime,{migratedProviders,authNotices:interactiveAuthNotices(services.authStorage),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(resolve55=>setTimeout(resolve55,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve55=>process.stdout.once("drain",resolve55)),process.stderr.writableLength>0&&await new Promise(resolve55=>process.stderr.once("drain",resolve55)),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",{persistSeen:!0})),stopChildReaper(),stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}import*as fs6 from"node:fs";import*as os7 from"node:os";import*as path12 from"node:path";import{spawn as spawn12}from"child_process";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 entry2 of entries){if(entry2.type==="compaction"||entry2.type==="branch_summary"){prev=void 0;continue}if(entry2.type==="usage"&&entry2.kind==="cache_warm"){let promptTokens=entry2.usage.input+entry2.usage.cacheRead+entry2.usage.cacheWrite;promptTokens>0&&(prev={promptTokens,modelKey:`${entry2.provider}/${entry2.model}`,timestamp:Date.parse(entry2.timestamp),reportedCache:!0})}else if(entry2.type==="message"&&entry2.message.role==="assistant"){let miss=detectMiss(prev,entry2.message,models);miss&&(totals2.missedTokens+=miss.missedTokens,totals2.missedCost+=miss.missedCost,totals2.missCount+=1,misses.set(entry2.message,miss)),prev=asPreviousRequest(entry2.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(value){return value.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(`
|
|
2048
2048
|
`).slice(1).filter(line=>/^\s+at\s/u.test(line)).map(line=>{try{return decodeURI(line)}catch{return line}}).join(`
|
|
2049
2049
|
`).replace(/\\/g,"/"),matches2=[],seen=new Set;for(let extension of extensions){let resolvedPath=normalizeStackPath(extension.resolvedPath),singleFilePackage=extension.sourceInfo.origin==="package"&&!/^(?:npm:|git:|https?:\/\/|ssh:\/\/)/u.test(extension.sourceInfo.source)&&/\.[cm]?[jt]s$/u.test(extension.sourceInfo.source),packageRoot=extension.sourceInfo.origin==="package"&&!singleFilePackage&&extension.sourceInfo.baseDir?extension.sourceInfo.baseDir:void 0,slashIndex=resolvedPath.lastIndexOf("/"),directoryEntry=/\/index\.[cm]?[jt]s$/u.test(resolvedPath);if(!(packageRoot?stackContainsPath(normalizedStack,packageRoot,!0):directoryEntry&&slashIndex!==-1?stackContainsPath(normalizedStack,resolvedPath.slice(0,slashIndex),!0):stackContainsPath(normalizedStack,resolvedPath,!1)))continue;let label3=extension.sourceInfo.origin==="package"&&extension.sourceInfo.source?extension.sourceInfo.source:extension.path;seen.has(label3)||(seen.add(label3),matches2.push(label3))}return matches2}import{spawn as spawn10,spawnSync}from"node:child_process";function checkGhAuth(){let result3=spawnSync("gh",["auth","status"],{encoding:"utf-8"});return result3.error!==void 0?"missing":result3.status===0?"ok":"logged-out"}function uploadSecretGist(html,fileName,signal){return new Promise(resolve55=>{if(signal.aborted){resolve55({code:null,stdout:"",stderr:"",aborted:!0});return}let child=spawn10("gh",["gist","create","--filename",fileName,"-"],{stdio:["pipe","pipe","pipe"]}),stdout="",stderr="",onAbort=()=>signalSpawnedChild(child);signal.addEventListener("abort",onAbort,{once:!0}),child.stdout.on("data",data=>{stdout+=data.toString()}),child.stderr.on("data",data=>{stderr+=data.toString()}),child.on("error",error2=>{signal.removeEventListener("abort",onAbort),resolve55({code:null,stdout,stderr:error2.message,aborted:signal.aborted})}),child.on("close",code=>{signal.removeEventListener("abort",onAbort),resolve55({code,stdout,stderr,aborted:signal.aborted})}),child.stdin.on("error",()=>{}),child.stdin.end(html)})}import{homedir as homedir24,hostname,userInfo}from"node:os";var RUN_CHAR="[A-Za-z0-9+/_-]",PAD="={0,2}",GAP=String.raw`(?:\\?\r?\n[ \t]*|(?:\\r)?\\n[ \t]*|["'][ \t]*[+,]?[ \t]*(?:\r?\n[ \t]*)?["'])`,SINGLE_RUN=new RegExp(`(?<!${RUN_CHAR})${RUN_CHAR}{20,}${PAD}(?![A-Za-z0-9+/=_-])`,"g"),SPLIT_RUN=new RegExp(`(?<!${RUN_CHAR})(${RUN_CHAR}{8,})(${GAP})(${RUN_CHAR}{8,}${PAD})(?![A-Za-z0-9+/=_-])`,"g"),WRAPPED_TAIL=new RegExp(`(<redacted>)(${GAP})(${RUN_CHAR}{6,}${PAD})(?![A-Za-z0-9+/=_-])`,"g"),INTEGRITY_PREFIX=/sha(?:256|384|512)-$/,INTEGRITY_RUN=/^sha(?:256|384|512)-/;function shannonBitsPerChar(text3){let counts=new Map;for(let char of text3)counts.set(char,(counts.get(char)??0)+1);let bits=0;for(let n of counts.values())bits-=n/text3.length*Math.log2(n/text3.length);return bits}var WORD_PIECE=/[A-Z]?[a-z]{3,}|[0-9]+/g,CASE_PIECE=/[A-Z]?[a-z]+|[A-Z]+(?![a-z])|[0-9]+/g;function pronounceable(piece){return/^[0-9]+$/.test(piece)?piece.length<=3:/[aeiouy]/i.test(piece)&&!/[^aeiouy]{4,}/i.test(piece)}function readsAsWords(run2,coverage=.6){let letters=run2.replace(/[^A-Za-z]/g,""),vowels=letters.replace(/[^aeiouAEIOU]/g,"").length;if(letters.length===0||vowels/letters.length<.3)return!1;let covered=[...run2.matchAll(WORD_PIECE)].map(match=>match[0]).filter(pronounceable).reduce((sum,piece)=>sum+piece.length,0),pieces=run2.match(CASE_PIECE)??[];return covered>=run2.length*coverage&&pieces.length>0&&run2.length/pieces.length>=3}function readsAsPath(run2){let segments2=run2.split("/").filter(segment=>segment.length>0);return segments2.length>=2&&segments2.every(isPlainSegment)}function isPlainSegment(segment){return/^[a-z0-9._@-]+$/.test(segment)||/^[A-Z0-9_]+$/.test(segment)||readsAsWords(segment)}function looksGenerated(run2){let body=run2.replace(/=+$/,"");if(body.length<16)return!1;let upper=body.replace(/[^A-Z]/g,"").length,lower2=body.replace(/[^a-z]/g,"").length,digits=body.replace(/[^0-9]/g,"").length,symbols=body.replace(/[^+/]/g,"").length,classes=[upper,lower2,digits,symbols].filter(n=>n>0).length;return lower2<2||upper<2&&classes<3||shannonBitsPerChar(body)<Math.min(3.8,Math.log2(body.length)-1.2)?!1:!readsAsWords(body)&&!readsAsPath(body)}function plainHalf(half3){return/^[a-z0-9._@-]+$/.test(half3)||/^[A-Z0-9_]+$/.test(half3)||readsAsPath(half3)||readsAsWords(half3,.85)}function integrityAt(run2,offset,whole){return INTEGRITY_RUN.test(run2)||INTEGRITY_PREFIX.test(whole.slice(Math.max(0,offset-7),offset))}function joinedLooksGenerated(head,tail){return!plainHalf(head)&&!plainHalf(tail)&&looksGenerated(head+tail)}function redactGeneratedValues(text3,onRedact){let result3=text3.replace(SPLIT_RUN,(match,head,gap,tail,offset,whole)=>integrityAt(head,offset,whole)||!joinedLooksGenerated(head,tail)?match:(onRedact(),`<redacted>${gap}<redacted>`));return result3=result3.replace(SINGLE_RUN,(run2,offset,whole)=>integrityAt(run2,offset,whole)||run2.length<32&&!/[+/]|=$/.test(run2)||!looksGenerated(run2)?run2:(onRedact(),"<redacted>")),result3.replace(WRAPPED_TAIL,(match,redacted,gap,tail)=>!(/[A-Za-z]/.test(tail)&&(/[0-9]/.test(tail)||/[A-Z]/.test(tail)&&/[a-z]/.test(tail)))||/^[a-z0-9._@-]+$/.test(tail)||/^[A-Z0-9_]+$/.test(tail)||readsAsPath(tail)?match:(onRedact(),`${redacted}${gap}<redacted>`))}var EDGE_START=new RegExp(`^(${RUN_CHAR}{8,}${PAD})`),EDGE_END=new RegExp(`(?<!${RUN_CHAR})(${RUN_CHAR}{8,})$`);function redactAcrossBoundary(left,right,onRedact){let end=EDGE_END.exec(left)?.[1],start=EDGE_START.exec(right)?.[1];return end===void 0||start===void 0||!joinedLooksGenerated(end,start)?[left,right]:(onRedact(),[`${left.slice(0,-end.length)}<redacted>`,`<redacted>${right.slice(start.length)}`])}var SENSITIVE_WORDS=new Set(["key","keys","apikey","token","tokens","secret","secrets","pass","passwd","password","passwords","passphrase","pwd","auth","authorization","credential","credentials","cookie","cookies","session","sessionid","private","signature"]),ORDINARY_NAMES=new Set(["public_key","public_key_path","key_id","auth_mode","auth_type","max_tokens","max_output_tokens"]);function words3(name){return name.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(word=>word.length>0)}function isSensitiveKeyName(name){let parts=words3(name);return parts.some(word=>SENSITIVE_WORDS.has(word))?!ORDINARY_NAMES.has(parts.join("_")):!1}function currentShareRedactionContext(){let userName="";try{userName=userInfo().username}catch{userName=process.env.USER??process.env.USERNAME??""}return{homeDirectory:homedir24(),userName,hostName:hostname()}}var MIN_LITERAL_LENGTH=3,IDENTITY_CHAR="[\\p{L}\\p{N}\\p{M}_.-]",WORD_CHAR="[\\p{L}\\p{N}\\p{M}]",COMMON_NAMES=new Set(["admin","user","users","test","home","root","runner","guest","default","shared"]);function escapeRegExp4(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ANY_SEPARATOR="(?:/|\\\\{1,2}|%2[Ff]|%5[Cc])";function homePattern(homeDirectory){let segments2=homeDirectory.split(/[\\/]+/).filter(segment=>segment.length>0);if(segments2.length===0)return;let drive=/^[A-Za-z]:$/.test(segments2[0]??"")?segments2.shift():void 0,body=segments2.map(segment=>escapeRegExp4(segment).replace(/ /g,"(?: |%20|\\+)")).join(ANY_SEPARATOR),prefix=drive===void 0?ANY_SEPARATOR:`${escapeRegExp4(drive)}${ANY_SEPARATOR}`;return new RegExp(`(?:file:${ANY_SEPARATOR}{0,3})?${prefix}${body}(?!${IDENTITY_CHAR})`,"giu")}var OTHER_HOME=new RegExp(`(?:[A-Za-z]:)?${ANY_SEPARATOR}(?:Users|home)${ANY_SEPARATOR}[^\\s/\\\\'"%:)<>\\]]{1,64}`,"gi");function literalPattern(value){let trimmed=value.trim();if(!(trimmed.length<MIN_LITERAL_LENGTH||COMMON_NAMES.has(trimmed.toLowerCase())))return new RegExp(`(?<!${WORD_CHAR})${escapeRegExp4(trimmed)}(?!${WORD_CHAR})`,"giu")}var PRIVATE_KEY_BLOCK=/-----BEGIN [A-Z0-9 ]{0,40}PRIVATE KEY(?: BLOCK)?-----(?:[\s\S]*?-----END [A-Z0-9 ]{0,40}PRIVATE KEY(?: BLOCK)?-----|[\s\S]*$)/g,CREDENTIAL_REWRITES=[[/\b(Bearer|Basic|Token)(\s{1,5})(?:<redacted>)?(?=[A-Za-z]*[0-9._~+/=-])[A-Za-z0-9._~+/=-]{8,}/gi,(_m,scheme,gap)=>`${scheme}${gap}<redacted>`],[/\b([A-Za-z][A-Za-z0-9+.-]{0,20}:\/\/[^\s/:@]{1,64}:)[^\s/@]{1,256}@/g,(_m,prefix)=>`${prefix}<redacted>@`],[/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,()=>"<redacted>"],[/\b(?:sk|pk|rk)-[A-Za-z0-9_-]{16,}/g,()=>"<redacted>"],[/\bgh[pousr]_[A-Za-z0-9]{20,}/g,()=>"<redacted>"],[/\bgithub_pat_[A-Za-z0-9_]{20,}/g,()=>"<redacted>"],[/\bxox[abprs]-[A-Za-z0-9-]{10,}/g,()=>"<redacted>"],[/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g,()=>"<redacted>"],[/\bAIza[0-9A-Za-z_-]{35}\b/g,()=>"<redacted>"],[/\b(?:sk|pk|rk)_(?:live|test)_[A-Za-z0-9]{10,}/g,()=>"<redacted>"],[/\bhf_[A-Za-z0-9]{30,}/g,()=>"<redacted>"],[/\bnpm_[A-Za-z0-9]{36}\b/g,()=>"<redacted>"],[/\bglpat-[A-Za-z0-9_-]{20,}/g,()=>"<redacted>"],[/(?<![A-Za-z0-9-])((?:Set-)?Cookie)(\s{0,3}:\s{0,3})[^\n"]+/gi,(_m,name,sep21)=>`${name}${sep21}<redacted>`]],KEY_VALUE=/([A-Za-z0-9_.[\]-]{1,128})((?:\\?["'])?[ \t]{0,3}[:=][ \t]{0,3})(?:(\\?["'])((?:(?!\3)[^\n]){0,2000})\3|([^\s"'\\&,;}[{(=)][^\n"'\\&,;}()]{0,1999}))/g,KEY_COLLECTION=/((["']?)([A-Za-z0-9_.-]{1,128})\2[ \t]{0,3}[:=][ \t]{0,3})(\[[^\]\n]{0,2000}\]|\{[^}\n]{0,2000}\})/g,KEY_YAML_LIST=/^([ \t]*)([A-Za-z0-9_.-]{1,128}):[ \t]*\r?\n((?:\1[ \t]*-[ \t]+[^\n]*(?:\r?\n|$))+)/gm,ALREADY_REDACTED=/^(?:(?:Bearer|Basic|Token|Digest)\s+)?(?:<redacted>\s*)+$/i,QUOTED2=/"(?:[^"\\\n]|\\.)*"|'[^'\n]*'/g,DATA_URI=/data:[a-z]+\/[a-z0-9.+-]+;base64,[A-Za-z0-9+/=]+/gi,EMAIL=/(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]{1,64}(?:@|%40)[A-Za-z0-9-]{1,63}(?:\.[A-Za-z0-9-]{1,63}){1,5}/g,IPV4=/(?<!\d|\d\.)(?:\d{1,3}\.){3}\d{1,3}(?!\d|\.\d)/g;function keepsAddress(address){return address.startsWith("127.")||address==="0.0.0.0"}function count(tally,category){tally.set(category,(tally.get(category)??0)+1)}function redactQuoted(quoted2,tally){let quote=quoted2[0]??'"';if(quoted2.length<=2)return quoted2;let replaced=`${quote}<redacted>${quote}`;return replaced!==quoted2&&count(tally,"credential"),replaced}var PLACEHOLDER=/<(?:redacted(?: private key)?|email|ip|host|user)>|\[image omitted from share\]/g;function replaceOutsidePlaceholders(text3,pattern,replace){let out="",last=0;for(let match of text3.matchAll(PLACEHOLDER)){let at=match.index??0;out+=text3.slice(last,at).replace(pattern,replace)+match[0],last=at+match[0].length}return out+text3.slice(last).replace(pattern,replace)}function redactShareText(text3,context,tally){if(text3.length===0)return text3;let result3=text3,home=homePattern(context.homeDirectory);home&&(result3=result3.replace(home,()=>(count(tally,"home path"),"~"))),result3=result3.replace(OTHER_HOME,match=>(count(tally,"home path"),match.replace(/[^/\\%]+$/,"<user>"))),result3=result3.replace(DATA_URI,()=>(count(tally,"image"),"[image omitted from share]")),result3=result3.replace(PRIVATE_KEY_BLOCK,()=>(count(tally,"private key"),"<redacted private key>")),result3=result3.replace(KEY_COLLECTION,(match,prefix,_quote,key,collection)=>isSensitiveKeyName(key)?prefix+collection.replace(QUOTED2,quoted2=>redactQuoted(quoted2,tally)):match),result3=result3.replace(KEY_YAML_LIST,(match,indent,key,items)=>{if(!isSensitiveKeyName(key))return match;let redacted=items.replace(/^([ \t]*-[ \t]+)(\S[^\n]*)/gm,(_item,bullet,item)=>(item!=="<redacted>"&&count(tally,"credential"),`${bullet}<redacted>`));return`${indent}${key}:
|
|
2050
2050
|
${redacted}`});for(let[pattern,rewrite]of CREDENTIAL_REWRITES)result3=result3.replace(pattern,(...args)=>{let match=String(args[0]),groups=args.slice(1).filter(value=>typeof value=="string"),replaced=rewrite(match,...groups);return replaced!==match&&count(tally,"credential"),replaced});result3=result3.replace(KEY_VALUE,(match,key,separator,quote,quoted2,bare)=>{if(!isSensitiveKeyName(key)||quote===void 0&&bare==="<redacted>")return match;let replaced=quote===void 0?`${key}${separator}<redacted>${(bare??"").match(/\s*$/)?.[0]??""}`:`${key}${separator}${quote}<redacted>${quote}`,value=quote===void 0?bare??"":quoted2;return replaced!==match&&!ALREADY_REDACTED.test(value.trim())&&count(tally,"credential"),replaced}),result3=redactGeneratedValues(result3,()=>count(tally,"credential")),result3=result3.replace(EMAIL,()=>(count(tally,"email"),"<email>")),result3=result3.replace(IPV4,address=>keepsAddress(address)?address:(count(tally,"ip address"),"<ip>"));let shortHost=context.hostName.split(".")[0]??"";for(let[value,placeholder,category]of[[context.hostName,"<host>","host name"],[shortHost,"<host>","host name"],[context.userName,"<user>","user name"],...(context.extraLiterals??[]).map(value2=>[value2,"<user>","user name"])]){let pattern=literalPattern(value);pattern&&(result3=replaceOutsidePlaceholders(result3,pattern,()=>(count(tally,category),placeholder)))}return result3}import{createHash as createHash29}from"node:crypto";import{mkdtempSync,rmSync as rmSync15,writeFileSync as writeFileSync26}from"node:fs";import{tmpdir as tmpdir8}from"node:os";import{join as join101}from"node:path";function newOutputOmissions(){return{count:0}}var OMITTED_RESULT_HTML=["resultHtmlCollapsed","resultHtmlExpanded"];function note(label3){return{type:"text",text:`[output omitted: ${label3}]`}}function omit(omissions){omissions.count++}function projectRecord(record10,omissions){if(record10.role==="toolResult"){omit(omissions);let toolName=typeof record10.toolName=="string"?record10.toolName:"tool";return{...record10,content:[note(toolName)],details:void 0}}if(record10.role==="bashExecution")return omit(omissions),{...record10,output:"[output omitted: command]",fullOutputPath:void 0};if(record10.role==="custom"||record10.type==="custom_message"){omit(omissions);let customType=typeof record10.customType=="string"?record10.customType:"extension";return{...record10,content:[note(customType)],details:void 0}}if(record10.type==="custom")return{...record10,data:void 0};if(record10.type==="compaction")return{...record10,details:void 0,systemMessage:void 0};if(record10.type==="branch_summary")return{...record10,details:void 0};if(record10.type==="context_edit"&&record10.replacement!==null&&typeof record10.replacement=="object")return omit(omissions),{...record10,replacement:{content:[note("context edit")]}}}function projectRenderedTools(value){return value===null||typeof value!="object"?value:Object.fromEntries(Object.entries(value).map(([id,rendered])=>{if(rendered===null||typeof rendered!="object")return[id,rendered];let kept=Object.entries(rendered).filter(([key])=>!OMITTED_RESULT_HTML.some(omitted=>omitted===key));return[id,Object.fromEntries(kept)]}))}function omitToolOutputs(value,omissions){return project(value,omissions)}function project(value,omissions){if(Array.isArray(value))return value.map(item=>project(item,omissions));if(value===null||typeof value!="object")return value;let record10=value,projected=projectRecord(record10,omissions);if(projected)return projected;let out={};for(let[key,child]of Object.entries(record10))out[key]=key==="renderedTools"?projectRenderedTools(child):project(child,omissions);return out}function isImageBlock(value){if(typeof value.type=="string"&&/image/i.test(value.type))return!0;let source2=value.source;return typeof source2=="object"&&source2!==null&&Reflect.get(source2,"type")==="base64"}var SCHEMA_TYPES=new Set(["string","number","integer","boolean","object","array","null"]),SCHEMA_KEYWORDS=new Set(["type","description","title","format","enum","items","properties","required","minLength","maxLength","pattern","additionalProperties","nullable"]);function isSchemaNode(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let type2=Reflect.get(value,"type");return typeof type2!="string"||!SCHEMA_TYPES.has(type2)?!1:Object.keys(value).every(key=>SCHEMA_KEYWORDS.has(key))}function dropAllStrings(value,tally){return typeof value=="string"?value.length===0?value:(value!=="<redacted>"&&count(tally,"credential"),"<redacted>"):Array.isArray(value)?value.map(item=>dropAllStrings(item,tally)):value===null||typeof value!="object"?value:Object.fromEntries(Object.entries(value).map(([key,child])=>[key,dropAllStrings(child,tally)]))}function redactShareValue(value,context,tally){return redactNode(value,context,tally)}function redactNode(value,context,tally){if(typeof value=="string")return redactShareText(value,context,tally);if(Array.isArray(value))return joinAdjacentText(value.map(item=>redactNode(item,context,tally)),tally);if(value===null||typeof value!="object")return value;let record10=value;if(isImageBlock(record10))return count(tally,"image"),{type:"text",text:"[image omitted from share]"};let out={};for(let[key,child]of Object.entries(record10))out[key]=isSensitiveKeyName(key)&&!isSchemaNode(child)?dropAllStrings(child,tally):redactNode(child,context,tally);return out}function textOf3(item){if(typeof item=="string")return item;if(item===null||typeof item!="object"||Reflect.get(item,"type")!=="text")return;let text3=Reflect.get(item,"text");return typeof text3=="string"?text3:void 0}function withText(item,text3){return typeof item=="string"?text3:{...item,text:text3}}function joinAdjacentText(items,tally){for(let index=0;index+1<items.length;index++){let left=textOf3(items[index]),right=textOf3(items[index+1]);if(left===void 0||right===void 0)continue;let[nextLeft,nextRight]=redactAcrossBoundary(left,right,()=>count(tally,"credential"));nextLeft!==left&&(items[index]=withText(items[index],nextLeft),items[index+1]=withText(items[index+1],nextRight))}return items}function prepareShare(render2,context,includeOutputs=!1){let tally=new Map,omittedOutputs=0,html=render2(value=>{if(includeOutputs)return redactShareValue(value,context,tally);let omissions=newOutputOmissions(),projected=omitToolOutputs(value,omissions);return omittedOutputs=Math.max(omittedOutputs,omissions.count),redactShareValue(projected,context,tally)}),sha2563=createHash29("sha256").update(html).digest("hex");return{html,sha256:sha2563,tally,includesOutputs:includeOutputs,omittedOutputs}}var CATEGORY_ORDER2=["credential","private key","home path","user name","host name","email","ip address","image"];function describeTally(tally){let parts=CATEGORY_ORDER2.flatMap(category=>{let total=tally.get(category)??0;return total===0?[]:[`${total} ${category}${total===1?"":"s"}`]});return parts.length===0?"nothing matched the redaction rules":parts.join(", ")}function describeShare(prepared,viewerBase){let kilobytes=Math.max(1,Math.round(Buffer.byteLength(prepared.html)/1024)),viewer=viewerBase===void 0?"No viewer is configured, so you get the gist link only.":`The link opens in ${viewerBase}, a viewer set by SHARE_VIEWER_URL that receives the gist id.`;return["Share this session as a secret GitHub gist?","",prepared.includesOutputs?`Uploads: the conversation, tool calls AND their outputs, system prompt and tool list, as one HTML file (${kilobytes} KB, sha256 ${prepared.sha256.slice(0,12)}).`:`Uploads: your messages and the replies, tool names and arguments (including any file content the agent wrote or edited), system prompt and tool list, as one HTML file (${kilobytes} KB, sha256 ${prepared.sha256.slice(0,12)}).`,prepared.includesOutputs?"Tool outputs are included (file contents, command output, extension messages).":`Tool outputs are left out: ${prepared.omittedOutputs} replaced by "[output omitted]".`,`Removed first: ${describeTally(prepared.tally)}. Images are always left out.`,"Who can read it: anyone with the link. A secret gist is unlisted, not private, and stays until you delete it on GitHub.",viewer,"Redaction is pattern-based and can miss things; review the exact file if the session holds anything sensitive."].join(`
|
|
@@ -2117,10 +2117,10 @@ ${skill.content}`).join(`
|
|
|
2117
2117
|
`){let selected=this.trustOptions[this.selectedIndex];selected&&this.onSelectCallback({trusted:selected.trusted,updates:selected.updates})}else kb.matches(keyData,"tui.select.cancel")&&this.onCancelCallback()}};var OSC133_ZONE_START2="\x1B]133;A\x07",OSC133_ZONE_END2="\x1B]133;B\x07",OSC133_ZONE_FINAL2="\x1B]133;C\x07",UserMessageComponent=class extends Container{constructor(text3,markdownTheme=sharedMarkdownTheme(),outputPad=1,markdownTransformers=[],answerHeaders=[]){super(),this.text=text3,this.markdownTheme=markdownTheme,this.outputPad=outputPad,this.markdownTransformers=markdownTransformers,this.answerHeaders=answerHeaders,this.rebuild()}setOutputPad(padding){this.outputPad=padding,this.rebuild()}rebuild(){this.clear();let contentBox=new Markdown(this.text,this.outputPad,1,this.markdownTheme,{color:content=>theme.fg("userMessageText",content),bgColor:content=>theme.bg("userMessageBg",content)},{preserveOrderedListMarkers:!0,preserveBackslashEscapes:!0,transform:createMarkdownTransform("user",!1,this.markdownTransformers)}),answer3=parseAskUserAnswerFrame(this.text);this.addChild(answer3?new AskUserAnswerChip(answer3,this.answerHeaders,contentBox):contentBox)}getRenderRevision(){return this.childRenderRevision()}render(width){let lines=super.render(width);return lines.length===0?lines:lines.length===1?(lines[0]=OSC133_ZONE_START2+lines[0]+OSC133_ZONE_END2+OSC133_ZONE_FINAL2,lines):(lines[0]=OSC133_ZONE_START2+lines[0],lines[lines.length-1]=OSC133_ZONE_END2+OSC133_ZONE_FINAL2+lines[lines.length-1],lines)}};var UserMessageList=class{constructor(messages,initialSelectedId){this.messages=[],this.selectedIndex=0,this.maxVisible=10,this.messages=messages;let initialIndex=initialSelectedId?messages.findIndex(message=>message.id===initialSelectedId):-1;this.selectedIndex=initialIndex>=0?initialIndex:Math.max(0,messages.length-1)}invalidate(){}render(width){let lines=[];if(this.messages.length===0)return lines.push(theme.fg("muted"," No user messages found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.messages.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.messages.length);for(let i=startIndex;i<endIndex;i++){let message=this.messages[i],isSelected=i===this.selectedIndex,normalizedMessage=message.text.replace(/\n/g," ").trim(),cursor=isSelected?theme.fg("accent","\u203A "):" ",maxMsgWidth=width-2,truncatedMsg=truncateToWidth(normalizedMessage,maxMsgWidth),messageLine=cursor+(isSelected?theme.bold(truncatedMsg):truncatedMsg);lines.push(messageLine);let metadata=` Message ${i+1} of ${this.messages.length}`,metadataLine=theme.fg("muted",metadata);lines.push(metadataLine),lines.push("")}if(startIndex>0||endIndex<this.messages.length){let scrollInfo=theme.fg("muted",` (${this.selectedIndex+1}/${this.messages.length})`);lines.push(scrollInfo)}return lines}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.messages.length-1:this.selectedIndex-1;else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.messages.length-1?0:this.selectedIndex+1;else if(kb.matches(keyData,"tui.select.confirm")){let selected=this.messages[this.selectedIndex];selected&&this.onSelect&&this.onSelect(selected.id)}else kb.matches(keyData,"tui.select.cancel")&&this.onCancel&&this.onCancel()}},UserMessageSelectorComponent=class extends Container{constructor(messages,onSelect,onCancel,initialSelectedId){super(),this.addChild(new Spacer(1)),this.addChild(new Text(theme.bold("Fork from Message"),1,0)),this.addChild(new Text(theme.fg("muted","Select a user message to copy the active path up to that point into a new session"),1,0)),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.messageList=new UserMessageList(messages,initialSelectedId),this.messageList.onSelect=onSelect,this.messageList.onCancel=onCancel,this.addChild(this.messageList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),messages.length===0&&setTimeout(()=>onCancel(),100)}getMessageList(){return this.messageList}};var unobservedInput=new WeakMap;function insertProgrammaticComposerInput(editor,data){(unobservedInput.get(editor)??editor.handleInput.bind(editor))(data)}function observeComposerActivity(editor,onActivity){let handleInput=editor.handleInput.bind(editor);unobservedInput.set(editor,handleInput),editor.handleInput=data=>{let previousText=editor.getText(),onSubmit=editor.onSubmit,submitted=!1;editor.onSubmit=(...args)=>{submitted=!0,onSubmit?.(...args)};try{handleInput(data),!submitted&&editor.getText()!==previousText&&onActivity()}finally{editor.onSubmit=onSubmit}}}var IMAGE_MARKER_PATTERN=/\[Image #[1-9]\d*\]/g;function transferEditorContent(source2,target){let rawText=source2.getText(),pasteState=source2.getPasteState?.(),imageState=source2.getImageMarkerState?.(),imageMarkersTransferred=!!(imageState&&target.getImageMarkerState&&target.setImageMarkerState&&target.insertImageMarker);if(pasteState&&target.getPasteState&&target.setPasteState)target.setText(imageMarkersTransferred?rawText:stripImageMarkers(rawText)),target.setPasteState(pasteState);else{let expanded=source2.getExpandedText?.()??(pasteState?expandPasteMarkers(rawText,pasteState):rawText);target.setText(imageMarkersTransferred?expanded:stripImageMarkers(expanded))}return imageMarkersTransferred&&imageState&&target.setImageMarkerState?.(imageState),{imageMarkersTransferred}}function stripImageMarkers(text3){return text3.replace(IMAGE_MARKER_PATTERN,"").replace(/[ \t]{2,}/g," ").trim()}function expandEditorSubmission(editor,text3){let pasteState=editor.getPasteState?.();return editor.getExpandedText?.()??(pasteState?expandPasteMarkers(text3,pasteState):text3)}function expandSubmittedText(editor,text3){let liveExpandedText=editor.getExpandedText?.();if(liveExpandedText)return liveExpandedText;let pasteState=editor.getPasteState?.();return pasteState?expandPasteMarkers(text3,pasteState):text3}function sanitizeTuiErrorMessage(value){return value.replace(/\u001b\][\s\S]*?(?:\u0007|\u001b\\|\u009c|$)/g,"").replace(/(?:\u001b\[|\u009b)[0-?]*[ -/]*[@-~]/g,"").replace(/\r\n?/g,`
|
|
2118
2118
|
`).replace(/[\u0000-\u0008\u000b-\u001f\u007f-\u009f]/g,"").replace(/[ \t\f\v]+/g," ")}function formatExtensionErrorHeadline(error2){let message=sanitizeTuiErrorMessage(error2.error);if(error2.extensionPath===RUNTIME_EXTENSION_PATH){let event=error2.event?sanitizeTuiErrorMessage(error2.event):void 0;return event?`Runtime error (${event}): ${message}`:`Runtime error: ${message}`}return`Extension "${sanitizeTuiErrorMessage(error2.extensionPath)}" error: ${message}`}var GrokFooter=class{constructor(session,_footerData){this.session=session}setSession(session){this.session=session}setAutoCompactEnabled(_enabled){}invalidate(){}dispose(){}render(width){let tokens=getGrokChromeTokens(),cwd=this.session.sessionManager.getCwd(),model=this.session.state.model?.id??"no-model";return[truncateToWidth(`${tokens.cwd(cwd)} ${tokens.modelLabel(model)}`,width,"")]}};var GrokInputCard=class{constructor(editor){this.editor=editor}invalidate(){this.editor.invalidate?.()}render(width){if(width<3)return this.editor.render(width);let tokens=getGrokChromeTokens(),contentWidth=width-2,horizontal="\u2500".repeat(contentWidth),editorLines=this.editor.render(contentWidth),paddedLines=(editorLines.length>0?editorLines:[""]).map(line=>{let truncated=truncateToWidth(line,contentWidth,"");return`${truncated}${" ".repeat(Math.max(0,contentWidth-visibleWidth(truncated)))}`});return[tokens.inputBorder(`\u256D${horizontal}\u256E`),...paddedLines.map(line=>`${tokens.inputBorder("\u2502")}${tokens.inputInterior(line)}${tokens.inputBorder("\u2502")}`),tokens.inputBorder(`\u2570${horizontal}\u256F`)]}};function formatDisplayVersion(version){return/^[0-9]/.test(version)?`v${version}`:version}var GrokWelcomeCard=class{constructor(appName,version){this.appName=appName,this.version=version}invalidate(){}render(width){let tokens=getGrokChromeTokens();if(width<3)return[tokens.primaryText(truncateToWidth(`${this.appName} ${formatDisplayVersion(this.version)}`,width,""))];let contentWidth=width-2,line=text3=>{let truncated=truncateToWidth(text3,contentWidth,"");return`${truncated}${" ".repeat(Math.max(0,contentWidth-visibleWidth(truncated)))}`},interior=text3=>`${tokens.cardBorder("\u2502")}${tokens.inputInterior(line(text3))}${tokens.cardBorder("\u2502")}`;return[tokens.cardBorder(`\u256D${"\u2500".repeat(contentWidth)}\u256E`),interior(` ${tokens.primaryText(`${this.appName} ${formatDisplayVersion(this.version)}`)}`),interior(" Ready for your next task."),tokens.cardBorder(`\u2570${"\u2500".repeat(contentWidth)}\u256F`)]}};var GrokFooterSurface=class{constructor(content){this.content=content}invalidate(){this.content.invalidate()}render(width){let surface=getGrokChromeTokens().surface;return this.content.render(width).map(surface)}dispose(){this.content.dispose?.()}},GrokRootSpacer=class{constructor(ui,content){this.ui=ui,this.content=content}invalidate(){}render(width){let contentHeight=this.content.reduce((height,component)=>height+component.render(width).length,0);return Array.from({length:Math.max(0,this.ui.terminal.rows-contentHeight)},()=>"")}},GrokEditor=class extends CustomEditor{constructor(ui,editorTheme,keybindings,options){super(ui,editorTheme,keybindings,options),this.card=new GrokInputCard({render:width=>this.renderBase(width),invalidate:()=>super.invalidate()})}render(width){return this.card.render(width)}renderBase(width){return super.render(width)}},GrokChrome=class{constructor(){this.toolPresentation="grok"}createBaseEditor({ui,keybindings,editorOptions}){return new GrokEditor(ui,this.getEditorTheme(),keybindings,editorOptions)}getEditorTheme(){let tokens=getGrokChromeTokens();return{borderColor:tokens.inputBorder,keywordHighlight:getReservedKeywordHighlight(),selectList:{selectedPrefix:text3=>theme.fg("accent",text3),selectedText:text3=>tokens.primaryText(text3),description:text3=>tokens.mutedText(text3),scrollInfo:text3=>tokens.mutedText(text3),noMatch:text3=>tokens.mutedText(text3),renderRow:({prefix,primary,description,isSelected})=>{let row=`${prefix}${tokens.primaryText(primary)}${description?tokens.mutedText(description):""}`;return isSelected?theme.bg("selectedBg",row):row}}}}createFooter(session,footerData){return new GrokFooter(session,footerData)}createWelcomeContent(appName,version){return new GrokWelcomeCard(appName,version)}createWorkingIndicator(ui,message,indicator){return new WorkingStatusIndicator(ui,message,{...indicator,frames:[GROK_GLYPHS.spinner],indicatorFormatter:frame=>theme.fg("accent",frame)})}getEditorBorderColor(_context){return getGrokChromeTokens().inputBorder}arrangeRoot(children,ui){let inputTailStart=Math.max(0,children.length-3),content=children.slice(0,inputTailStart),inputTail=children.slice(inputTailStart),footer=inputTail.at(-1),tail=footer?[...inputTail.slice(0,-1),new GrokFooterSurface(footer)]:[...inputTail],arranged=[...content,...tail];return ui?[...content,new GrokRootSpacer(ui,arranged),...tail]:arranged}};import{closeSync as closeSync10,openSync as openSync10,readFileSync as readFileSync51,writeSync as writeSync4}from"node:fs";function seedKeybindingsFile(configPath,keybindings){let fd;try{fd=openSync10(configPath,"wx")}catch(error2){if(error2.code==="EEXIST")return!1;throw error2}try{writeSync4(fd,`${JSON.stringify(keybindings.getEffectiveConfig(),null,2)}
|
|
2119
2119
|
`)}finally{closeSync10(fd)}return!0}function applyKeybindingsFileEdit(configPath,keybindings){let raw;try{raw=readFileSync51(configPath,"utf-8")}catch(error2){return{status:"invalid",message:error2 instanceof Error?error2.message:String(error2)}}try{JSON.parse(raw)}catch(error2){return{status:"invalid",message:error2 instanceof Error?error2.message:String(error2)}}return keybindings.reload(),{status:"reloaded"}}var GROUP_ORDER=["project","user","path","system"];function isSystemResource(sourceInfo){return sourceInfo?.scope==="system"}function isPackageSourceInfo(sourceInfo){let source2=sourceInfo?.source??"";return source2.startsWith("npm:")||source2.startsWith("git:")}function getResourceScopeGroup(sourceInfo){let source2=sourceInfo?.source??"local",scope=sourceInfo?.scope??"project";if(scope==="system")return"system";if(source2==="cli")return"path";switch(scope){case"temporary":return"path";case"user":return"user";case"project":return"project";default:return assertNever5(scope)}}function buildResourceScopeGroups(items){let groups=new Map(GROUP_ORDER.map(scope=>[scope,{scope,paths:[],packages:new Map}]));for(let item of items){let group=groups.get(getResourceScopeGroup(item.sourceInfo));if(group!==void 0)if(isPackageSourceInfo(item.sourceInfo)){let source2=item.sourceInfo?.source??"local",list3=group.packages.get(source2)??[];list3.push(item),group.packages.set(source2,list3)}else group.paths.push(item)}return GROUP_ORDER.map(scope=>groups.get(scope)).filter(group=>group!==void 0&&(group.paths.length>0||group.packages.size>0))}function formatResourceScopeGroups(groups,options){let lines=[];for(let group of groups){lines.push(` ${theme.fg("accent",group.scope)}`);let sortedPaths=[...group.paths].sort((a,b)=>a.path.localeCompare(b.path));for(let item of sortedPaths)lines.push(theme.fg("dim",` ${options.formatPath(item)}`));let sortedPackages=Array.from(group.packages.entries()).sort(([a],[b])=>a.localeCompare(b));for(let[source2,items]of sortedPackages){lines.push(` ${theme.fg("mdLink",source2)}`);let sortedPackagePaths=[...items].sort((a,b)=>a.path.localeCompare(b.path));for(let item of sortedPackagePaths)lines.push(theme.fg("dim",` ${options.formatPackagePath(item,source2)}`))}}return lines.join(`
|
|
2120
|
-
`)}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(value){throw new Error(`Unexpected resource scope: ${String(value)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage5(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage5(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 errorMessage5(error2){return error2 instanceof Error?error2.message:String(error2)}var DEFAULT_FLAG="--default";function parseModelCommandArgument(argument){let words5=(argument??"").trim().split(/\s+/).filter(word=>word.length>0),asDefault=words5.includes(DEFAULT_FLAG);return{searchTerm:words5.filter(word=>word!==DEFAULT_FLAG).join(" "),asDefault}}function isAnnouncedElsewhere(source2){return source2==="fallback"||source2==="fallback-revert"}function describeOrigin(origin){return origin.actor===void 0?origin.source:`${origin.source}: ${origin.actor}`}function modelChangeNoticeText(input){return`\u21C4 Model changed mid-turn \xB7 ${input.from===void 0?input.to:`${input.from} \u2192 ${input.to}`} (${describeOrigin(input.origin)})`}function liveModelChangeNotice(event){if(!(!event.duringTurn||isAnnouncedElsewhere(event.origin.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:event.previousModel?.id,to:event.model.id,origin:event.origin})}}function replayedModelChangeNotice(entry2){if(!(entry2.duringTurn!==!0||entry2.source===void 0||isAnnouncedElsewhere(entry2.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:entry2.originalModelId,to:entry2.modelId,origin:entry2.actor===void 0?{source:entry2.source}:{source:entry2.source,actor:entry2.actor}})}}var PAUSE_STATUS_KEY="session-pause";function pauseFooterText(view){if(!view.paused&&!view.runPaused)return;let held=view.pausedNoticeCount===1?"1 update held":`${view.pausedNoticeCount} updates held`;return view.runPaused?`Run paused \xB7 ${held} \xB7 type to continue, /resume to resume the run`:`Paused \xB7 ${held} \xB7 type to continue, /resume to resume`}function resumeCommandTarget(view){return view.paused||view.runPaused?"resume_session":"session_picker"}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 count2=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count2}. 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 errorMessage6=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage6}],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}
|
|
2120
|
+
`)}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(value){throw new Error(`Unexpected resource scope: ${String(value)}`)}var LOGIN_CANCELLED_NOTICE="Login cancelled";function isLoginCancellation(error2){return error2==null||typeof error2=="object"&&error2.name==="AbortError"?!0:errorMessage5(error2)===LOGIN_CANCELLED_NOTICE}function describeLoginFailure(error2,providerName,method){if(isLoginCancellation(error2))return{level:"status",message:LOGIN_CANCELLED_NOTICE};let message=errorMessage5(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 errorMessage5(error2){return error2 instanceof Error?error2.message:String(error2)}var DEFAULT_FLAG="--default";function parseModelCommandArgument(argument){let words5=(argument??"").trim().split(/\s+/).filter(word=>word.length>0),asDefault=words5.includes(DEFAULT_FLAG);return{searchTerm:words5.filter(word=>word!==DEFAULT_FLAG).join(" "),asDefault}}function isAnnouncedElsewhere(source2){return source2==="fallback"||source2==="fallback-revert"}function describeOrigin(origin){return origin.actor===void 0?origin.source:`${origin.source}: ${origin.actor}`}function modelChangeNoticeText(input){return`\u21C4 Model changed mid-turn \xB7 ${input.from===void 0?input.to:`${input.from} \u2192 ${input.to}`} (${describeOrigin(input.origin)})`}function liveModelChangeNotice(event){if(!(!event.duringTurn||isAnnouncedElsewhere(event.origin.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:event.previousModel?.id,to:event.model.id,origin:event.origin})}}function replayedModelChangeNotice(entry2){if(!(entry2.duringTurn!==!0||entry2.source===void 0||isAnnouncedElsewhere(entry2.source)))return{type:"model_change_notice",text:modelChangeNoticeText({from:entry2.originalModelId,to:entry2.modelId,origin:entry2.actor===void 0?{source:entry2.source}:{source:entry2.source,actor:entry2.actor}})}}var PAUSE_STATUS_KEY="session-pause";function pauseFooterText(view){if(!view.paused&&!view.runPaused)return;let held=view.pausedNoticeCount===1?"1 update held":`${view.pausedNoticeCount} updates held`;return view.pauseView?.records.some(record10=>record10.key==="interrupted-run")?`Interrupted \xB7 ${view.pausedNoticeCount>0?`${held} \xB7 `:""}type to continue, /resume to resume`:view.runPaused?`Run paused \xB7 ${held} \xB7 type to continue, /resume to resume the run`:`Paused \xB7 ${held} \xB7 type to continue, /resume to resume`}function resumeCommandTarget(view){return view.paused||view.runPaused?"resume_session":"session_picker"}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 count2=attempts===void 0?"":` after ${attempts} retries`;this.notice?.setSummary(`The model provider could not complete the request${count2}. 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 errorMessage6=message.stopReason==="aborted"?abortedMessageForRendering(message,0,void 0).errorMessage||"Provider request failed":message.errorMessage||"Error";component.updateResult({content:[{type:"text",text:errorMessage6}],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}
|
|
2121
2121
|
This directory is the same git repository: ${cwd}
|
|
2122
2122
|
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 existsSync48,mkdirSync as mkdirSync31,readFileSync as readFileSync52,realpathSync as realpathSync18,writeFileSync as writeFileSync28}from"node:fs";import{join as join104}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 update2=brand.update;if(update2===void 0)return;let installSpec=update2.distTag==="latest"?update2.packageName:`${update2.packageName}@${update2.distTag}`;return{packageName:update2.packageName,installSpec,ignoreScripts:!1}}function uninstallCommand(method,packageName){switch(method){case"npm":return`npm uninstall -g ${packageName}`;case"pnpm":return`pnpm remove -g ${packageName}`;case"yarn":return`yarn global remove ${packageName}`;case"bun":case"bun-binary":case"unknown":return}}function bunReinstallCommand(method,target){let install=`bun add -g ${target.ignoreScripts?"--ignore-scripts ":""}${target.installSpec}`,uninstall=uninstallCommand(method,target.packageName);return uninstall===void 0?install:`${uninstall} && ${install}`}function installBunCommand(platform5){return platform5==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash"}function bunStep(input){switch(input.bun.kind){case"missing":return{text:`Install Bun: ${installBunCommand(input.platform)}`,tone:"accent"};case"outdated":return{text:`Upgrade Bun (found ${input.bun.version??"an unreadable version"}, needs ${MIN_BUN_VERSION}+): bun upgrade`,tone:"accent"};case"ready":return}}function reinstallStep(input,afterBunStep){let lead=afterBunStep?"Then reinstall":"Reinstall";return input.installMethod==="bun"||input.target===void 0?{text:`${afterBunStep?"Then restart":"Restart"} ${input.appCommand}.`,tone:"accent"}:{text:`${lead} with Bun: ${bunReinstallCommand(input.installMethod,input.target)}`,tone:"accent"}}function buildRuntimeNotice(input){let first=bunStep(input),extra=[...first===void 0?[]:[first],reinstallStep(input,first!==void 0),{text:`To stay on Node.js and hide this notice, set ${input.pinEnvName}=node.`}];return{title:"Running on Node.js",tone:"warning",why:`${input.appName} is running on Node.js ${input.nodeVersion}. It starts faster and every feature works on Bun ${MIN_BUN_VERSION}+.`,extra}}var RUNTIME_NOTICE_STATE_FILE="runtime-notice.json";function readShownVersion(agentDir){let parsed;try{parsed=JSON.parse(readFileSync52(join104(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{mkdirSync31(agentDir,{recursive:!0}),writeFileSync28(join104(agentDir,RUNTIME_NOTICE_STATE_FILE),`${JSON.stringify({shownVersion:version})}
|
|
2123
|
-
`)}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 value=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value!==void 0&&value!==""&&value!=="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(existsSync48,realpathSync18)),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.registering=Promise.resolve(),this.context=context}register(options){let next=this.registering.then(()=>this.registerNow(options));return this.registering=next.catch(()=>{}),next}async registerNow(options){await this.disposeActive().catch(error2=>this.context().surface.notice(`control endpoint teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`));let{registerSessionControlEndpoint}=await import("./session-control-endpoint-
|
|
2123
|
+
`)}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 value=envValue(SKIP_RUNTIME_NOTICE_ENV_SUFFIX);return value!==void 0&&value!==""&&value!=="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(existsSync48,realpathSync18)),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.registering=Promise.resolve(),this.context=context}register(options){let next=this.registering.then(()=>this.registerNow(options));return this.registering=next.catch(()=>{}),next}async registerNow(options){await this.disposeActive().catch(error2=>this.context().surface.notice(`control endpoint teardown failed: ${error2 instanceof Error?error2.message:String(error2)}`));let{registerSessionControlEndpoint}=await import("./session-control-endpoint-HFFMBALG.js"),outcome=await registerSessionControlEndpoint({...this.context(),editorRevision:()=>this.editorRevision},options);if(!("endpoint"in outcome))return outcome.registration;let endpoint=outcome.endpoint;return this.active=endpoint,{...outcome.registration,dispose:async()=>{await endpoint.dispose(),this.active===endpoint&&(this.active=void 0)}}}attachEditor(editor,hasDraft){let change=editor.onChange;editor.onChange=text3=>{change?.(text3),this.editorChanged(hasDraft())};let submit2=editor.onSubmit;editor.onSubmit=(text3,...details)=>{this.submitting=!0,queueMicrotask(()=>{this.submitting=!1});let ticket=this.openTicket();this.handoff=ticket;try{submit2?.(text3,...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=text3=>theme.fg("dim",text3),share=`${(report.failureShare*100).toFixed(1)}% failed`,info=`
|
|
2124
2124
|
${theme.bold("Failures")}
|
|
2125
2125
|
`;if(info+=`${label3("Requests:")} ${report.requests} ${label3(`(${report.erroredRequests} errored, ${report.abortedRequests} aborted, ${share})`)}
|
|
2126
2126
|
`,info+=`${label3("Time in failed requests:")} ${formatDuration3(report.failedDurationMs)}
|
|
@@ -2145,7 +2145,7 @@ ${onboarding()}`,this.getStartupExpansionState(),1,0),appendStartupHeader(this.h
|
|
|
2145
2145
|
`)}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(path14){let result3=this.formatDisplayPath(path14);return result3=result3.replace(/\/index\.ts$/,"").replace(/\/index\.js$/,""),result3}formatContextPath(p){let cwd=path12.resolve(this.sessionManager.getCwd()),absolutePath=path12.isAbsolute(p)?path12.resolve(p):path12.resolve(cwd,p),relativePath=getCwdRelativePath(absolutePath,cwd);return relativePath!==void 0?relativePath:this.formatDisplayPath(absolutePath)}getStartupExpansionState(){return this.options.verbose||this.toolOutputExpanded}async handleKeybindingsCommand(){let configPath=path12.join(getAgentDir(),"keybindings.json"),editorCommand=process.env.VISUAL||process.env.EDITOR;if(!editorCommand){this.showError(`Set $EDITOR or $VISUAL to edit ${configPath}.`);return}let seeded=seedKeybindingsFile(configPath,this.keybindings),edit=await this.withTerminalHandedOver(()=>editFileInExternalEditor({command:editorCommand,path:configPath}));if(edit.status==="launch-failed"){seeded&&fs6.rmSync(configPath,{force:!0}),this.showError(`Could not open ${configPath} with "${editorCommand}".`);return}if(edit.status==="exited"){this.showError(`"${editorCommand}" exited with code ${edit.code}; keybindings were not reloaded.`);return}let applied=applyKeybindingsFileEdit(configPath,this.keybindings);if(applied.status==="invalid"){this.showError(`Keybindings not reloaded - ${configPath} is not valid JSON: ${applied.message}`);return}this.showStatus("Keybindings reloaded")}updateShortcutOverlay(nextText){let previousText=this.lastEditorText;this.lastEditorText=nextText;let inputKind=classifyEditorInput(previousText,nextText,this.lastInputWasPaste);if(this.lastInputWasPaste=!1,shouldShowShortcutOverlay(previousText,nextText,inputKind)){this.shortcutOverlay||(this.shortcutOverlay=new ShortcutOverlay,this.headerContainer.addChild(this.shortcutOverlay),this.ui.requestRender());return}this.hideShortcutOverlay()}hideShortcutOverlay(){this.shortcutOverlay&&(this.headerContainer.removeChild(this.shortcutOverlay),this.shortcutOverlay=void 0,this.ui.requestRender())}recordShownTip(tipId){this.sessionShownTipIds.add(tipId);let next=recordTipShown(this.settingsManager.getTipsHistory(),tipId,Date.now());this.settingsManager.setTipShown(tipId,next[tipId]??Date.now())}getShortPath(fullPath,sourceInfo){let normalizedFullPath=fullPath.replace(/\\/g,"/"),baseDir=sourceInfo?.baseDir;if(baseDir&&this.isPackageSource(sourceInfo)){let normalizedBaseDir=baseDir.replace(/\\/g,"/"),npmRootMatch=normalizedBaseDir.match(/^(.*\/node_modules)\/(@?[^/]+(?:\/[^/]+)?)$/);if(npmRootMatch?.[1]&&normalizedFullPath.startsWith(`${npmRootMatch[1]}/`))return path12.posix.relative(normalizedBaseDir,normalizedFullPath);let relativePath=path12.relative(path12.resolve(baseDir),path12.resolve(fullPath));if(relativePath&&relativePath!=="."&&!relativePath.startsWith("..")&&!relativePath.startsWith(`..${path12.sep}`)&&!path12.isAbsolute(relativePath))return relativePath.replace(/\\/g,"/")}let 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),segments2=shortPath.replace(/\\/g,"/").split("/").filter(segment=>segment.length>0&&segment!=="~");return segments2.length>0?segments2[segments2.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=path12.posix.parse(packagePath);return parsedPath.name==="index"?!parsedPath.dir||parsedPath.dir==="."?sourceLabel2:`${sourceLabel2}:${parsedPath.dir}`:`${sourceLabel2}:${packagePath}`}getCompactDisplayPathSegments(resourcePath){return this.formatDisplayPath(resourcePath).replace(/\\/g,"/").split("/").filter(segment=>segment.length>0&&segment!=="~")}getCompactNonPackageExtensionLabel(resourcePath,index,allPaths){let segments2=allPaths[index]?.segments;if(!segments2||segments2.length===0)return this.getCompactPathLabel(resourcePath);for(let segmentCount=1;segmentCount<=segments2.length;segmentCount+=1){let candidate=segments2.slice(-segmentCount).join("/");if(allPaths.every((item,itemIndex)=>itemIndex===index?!0:item.segments.slice(-segmentCount).join("/")!==candidate))return candidate}return segments2.join("/")}getCompactExtensionLabels(extensions){let nonPackageExtensions=extensions.map(extension=>{let segments2=this.getCompactDisplayPathSegments(extension.path),lastSegment=segments2[segments2.length-1];return segments2.length>1&&(lastSegment==="index.ts"||lastSegment==="index.js")&&segments2.pop(),{path:extension.path,sourceInfo:extension.sourceInfo,segments:segments2}}).filter(extension=>!this.isPackageSource(extension.sourceInfo));return extensions.map(extension=>{if(this.isPackageSource(extension.sourceInfo))return this.getCompactExtensionLabel(extension.path,extension.sourceInfo);let nonPackageIndex=nonPackageExtensions.findIndex(item=>item.path===extension.path);return nonPackageIndex===-1?this.getCompactPathLabel(extension.path,extension.sourceInfo):this.getCompactNonPackageExtensionLabel(extension.path,nonPackageIndex,nonPackageExtensions)})}getDisplaySourceInfo(sourceInfo){return getDisplaySourceInfo(sourceInfo)}isPackageSource(sourceInfo){return isPackageSourceInfo(sourceInfo)}buildScopeGroups(items){return buildResourceScopeGroups(items)}formatScopeGroups(groups,options){return formatResourceScopeGroups(groups,options)}findSourceInfoForPath(p,sourceInfos){let exact=sourceInfos.get(p);if(exact)return exact;let current=p;for(;current.includes("/");){current=current.substring(0,current.lastIndexOf("/"));let parent=sourceInfos.get(current);if(parent)return parent}}formatPathWithSource(p,sourceInfo){if(sourceInfo){let shortPath=this.getShortPath(p,sourceInfo),{label:label3,scopeLabel}=this.getDisplaySourceInfo(sourceInfo);return`${scopeLabel?`${label3} (${scopeLabel})`:label3} ${shortPath}`}return this.formatDisplayPath(p)}formatDiagnostics(diagnostics,sourceInfos){let lines=[],collisions=new Map,otherDiagnostics=[];for(let d of diagnostics)if(d.type==="collision"&&d.collision){let list3=collisions.get(d.collision.name)??[];list3.push(d),collisions.set(d.collision.name,list3)}else otherDiagnostics.push(d);for(let[name,collisionList]of collisions){let first=collisionList[0]?.collision;if(first){lines.push({text:` "${name}" collision:`,tone:"warning"}),lines.push({text:` \u2713 ${this.formatPathWithSource(first.winnerPath,this.findSourceInfoForPath(first.winnerPath,sourceInfos))}`,tone:"warning"});for(let d of collisionList)d.collision&&lines.push({text:` \u2717 ${this.formatPathWithSource(d.collision.loserPath,this.findSourceInfoForPath(d.collision.loserPath,sourceInfos))} (skipped)`,tone:"warning"})}}for(let d of otherDiagnostics){let tone=d.type==="error"?"error":"warning";if(d.path){let formattedPath=this.formatPathWithSource(d.path,this.findSourceInfoForPath(d.path,sourceInfos));lines.push({text:` ${formattedPath}`,tone}),lines.push({text:` ${d.message}`,tone})}else lines.push({text:` ${d.message}`,tone})}return lines}showLoadedResources(options){this.loadedResourcesContainer.clear();let showListing=options?.force||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)}
|
|
2146
2146
|
${body}`},()=>`${sectionHeader(name,color)}
|
|
2147
2147
|
${expandedBody()}`,this.getStartupExpansionState());this.loadedResourcesContainer.addChild(section)},skillsResult=this.session.resourceLoader.getSkills(),promptsResult=this.session.resourceLoader.getPrompts(),themesResult=this.session.resourceLoader.getThemes(),extensions=options?.extensions??this.session.resourceLoader.getExtensions().extensions.filter(extension=>!extension.hidden).map(extension=>({path:extension.path,sourceInfo:extension.sourceInfo})),sourceInfos=new Map;for(let extension of extensions)extension.sourceInfo&&sourceInfos.set(extension.path,extension.sourceInfo);for(let skill of skillsResult.skills)skill.sourceInfo&&sourceInfos.set(skill.filePath,skill.sourceInfo);for(let prompt of promptsResult.prompts)prompt.sourceInfo&&sourceInfos.set(prompt.filePath,prompt.sourceInfo);for(let loadedTheme of themesResult.themes)loadedTheme.sourcePath&&loadedTheme.sourceInfo&&sourceInfos.set(loadedTheme.sourcePath,loadedTheme.sourceInfo);if(showListing){let systemPromptSource=this.session.resourceLoader.getSystemPromptSource(),contextFiles=[...systemPromptSource?[systemPromptSource]:[],...this.session.resourceLoader.getAppendSystemPromptSources(),...this.session.resourceLoader.getAgentsFiles().agentsFiles];contextFiles.length>0&&(this.loadedResourcesContainer.addChild(new Spacer(1)),addLoadedSection("Context",()=>formatCompactList(contextFiles.map(contextFile=>this.formatContextPath(contextFile.path)),{sort:!1}),()=>contextFiles.map(f=>theme.fg("dim",` ${this.formatDisplayPath(f.path)}`)).join(`
|
|
2148
|
-
`)));let skills=skillsResult.skills;if(skills.length>0){let groups=this.buildScopeGroups(skills.map(skill=>({path:skill.filePath,sourceInfo:skill.sourceInfo})));addLoadedSection("Skills",()=>formatCompactList(skills.filter(skill=>!isSystemResource(skill.sourceInfo)).map(skill=>skill.name)),()=>this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}))}let templates=this.session.promptTemplates;if(templates.length>0){let groups=this.buildScopeGroups(templates.map(template=>({path:template.filePath,sourceInfo:template.sourceInfo}))),templateByPath=new Map(templates.map(t=>[t.filePath,t]));addLoadedSection("Prompts",()=>formatCompactList(templates.filter(template=>!isSystemResource(template.sourceInfo)).map(template=>`/${template.name}`)),()=>this.formatScopeGroups(groups,{formatPath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)},formatPackagePath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)}}))}if(extensions.length>0){let groups=this.buildScopeGroups(extensions),extList=()=>this.formatScopeGroups(groups,{formatPath:item=>this.formatExtensionDisplayPath(item.path),formatPackagePath:item=>this.formatExtensionDisplayPath(this.getShortPath(item.path,item.sourceInfo))}),extensionLabels=this.getCompactExtensionLabels(extensions.filter(extension=>!isSystemResource(extension.sourceInfo)));addLoadedSection("Extensions",()=>formatCompactList(extensionLabels),extList,"mdHeading")}}if(showDiagnostics){let addDiagnosticNotice=(title,diagnostics,why="Conflicting or invalid loaded resources were found.")=>{this.loadedResourcesContainer.addChild(buildNoticeBox({title,tone:"warning",why,extra:this.formatDiagnostics(diagnostics,sourceInfos)},{expanded:this.toolOutputExpanded},theme)),this.loadedResourcesContainer.addChild(new Spacer(1))},contextDiagnostics=[...this.session.resourceLoader.getAgentsFiles().diagnostics??[],...skillsResult.diagnostics.filter(diagnostic2=>diagnostic2.category==="size-limit")];contextDiagnostics.length>0&&addDiagnosticNotice("Context size limits",contextDiagnostics,"Context files or skill catalogs were limited to keep requests bounded.");let skillDiagnostics=skillsResult.diagnostics.filter(diagnostic2=>diagnostic2.category!=="size-limit"&&diagnostic2.category!=="skill-link-blocked");skillDiagnostics.length>0&&addDiagnosticNotice("Skill conflicts",skillDiagnostics);let promptDiagnostics=promptsResult.diagnostics;promptDiagnostics.length>0&&addDiagnosticNotice("Prompt conflicts",promptDiagnostics);let extensionDiagnostics=[],extensionsResult=this.session.resourceLoader.getExtensions();for(let error2 of extensionsResult.errors)extensionDiagnostics.push({type:"error",message:error2.error,path:error2.path});for(let warning of extensionsResult.warnings??[])extensionDiagnostics.push({type:"warning",message:warning.warning,path:warning.path});let commandDiagnostics=this.session.extensionRunner.getCommandDiagnostics();extensionDiagnostics.push(...commandDiagnostics),extensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));let shortcutDiagnostics=this.session.extensionRunner.getShortcutDiagnostics();extensionDiagnostics.push(...shortcutDiagnostics),extensionDiagnostics.length>0&&addDiagnosticNotice("Extension issues",extensionDiagnostics);let themeDiagnostics=themesResult.diagnostics;themeDiagnostics.length>0&&addDiagnosticNotice("Theme conflicts",themeDiagnostics)}}async bindCurrentSessionExtensions(){await this.sessionControlHost?.disposeActive(),this.session.setControlEndpointHost?.(this.sessionControlHost);let uiContext=this.createExtensionUIContext();this.detachMcpGrantPresentation?.(),this.detachMcpGrantPresentation=attachMcpGrantPresentation(this.session.sessionId,(title,choices,opts)=>uiContext.select(title,choices,opts)),this.unsubscribeSecurityNotices?.(),this.unsubscribeSecurityNotices=this.session.securityNotices?.subscribe(snapshot=>{for(let notice2 of snapshot.notices)uiContext.notify(notice2.message,"warning")}),await this.session.bindExtensions({uiContext,mode:"tui",abortHandler:()=>{this.restoreQueuedMessagesToEditor({abort:!0})},commandContextActions:{waitForIdle:()=>this.session.waitForIdle(),newSession:async options=>{this.clearStatusIndicator();try{return await this.runtimeHost.newSession(options)}catch(error2){return this.handleFatalRuntimeError("Failed to create session",error2)}},fork:async(entryId,options)=>{try{let result3=await this.runtimeHost.fork(entryId,options);return result3.cancelled||(this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")),{cancelled:result3.cancelled}}catch(error2){return this.handleFatalRuntimeError("Failed to fork session",error2)}},navigateTree:async(targetId,options)=>{let result3=await this.session.navigateTree(targetId,{summarize:options?.summarize,customInstructions:options?.customInstructions,replaceInstructions:options?.replaceInstructions,label:options?.label,expectedLeafId:options?.expectedLeafId});return result3.cancelled?{cancelled:!0}:(this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus("Navigated to selected point"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1})},editAssistantMessage:async(entryId,text3,options)=>{let result3=await this.session.editAssistantMessage(entryId,text3,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced assistant response"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},editUserMessage:async(entryId,text3,options)=>{let result3=await this.session.editUserMessage(entryId,text3,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced user prompt"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},switchSession:async(sessionPath,options)=>this.handleResumeSession(sessionPath,options),reload:async()=>{await this.handleReloadCommand()}},shutdownHandler:()=>{this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()},onError:error2=>{this.showExtensionError(error2)}}),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.setupAutocompleteProvider();let extensionRunner=this.session.extensionRunner;this.setupExtensionShortcuts(extensionRunner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0}),this.showStartupNoticesIfNeeded()}applyFullscreenScrollbarSetting(){this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar())}applyRuntimeSettings(){setCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides()),configureHttpDispatcher(this.settingsManager.getHttpIdleTimeoutMs()),this.applyFullscreenScrollbarSetting(),this.renderer instanceof TuiAltScreen&&(this.renderer.setCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect?.()??!0),this.renderer.setWheelScrollLines(this.settingsManager.getFullscreenWheelScrollLines?.()??"auto")),this.footer.setSession(this.session),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerDataProvider.setCwd(this.sessionManager.getCwd()),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.applySmoothStreamingRenderFps(),this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());let clearOnShrink=this.settingsManager.getClearOnShrink();this.ui.setClearOnShrink(clearOnShrink),!clearOnShrink&&!this.activeStatusIndicator&&this.statusContainer.clear();let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.defaultEditor.setPaddingX(editorPaddingX),this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible),this.editor!==this.defaultEditor&&(this.editor.setPaddingX?.(editorPaddingX),this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible))}async rebindCurrentSession(options={}){_InteractiveMode.restoreCompactionEscapeOverride(this),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let session=this.session;this.unsubscribe?.(),this.unsubscribe=void 0,this.applyRuntimeSettings(),options.renderBeforeBind&&(this.renderCurrentSessionState(),this.subscribeToAgent(),time("render","switch")),await this.bindCurrentSessionExtensions(),time("bindExtensions","switch"),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`);let extensionHint=this.getCrashExtensionHint(error2);extensionHint&&this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",extensionHint),this.outputPad,0)),stopThemeWatcher(),this.stop("transcript"),process.exit(1)}getCrashExtensionHint(error2){try{return formatCrashExtensionHint(findExtensionStackMatches(error2 instanceof Error?error2.stack:void 0,this.session.resourceLoader.getExtensions().extensions))}catch{return}}renderCurrentSessionState(){this.loadedResourcesContainer.clear(),this.chatContainer.clear(),this.pendingMessagesContainer.clear();for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionQueueGeneration+=1,this.compactionQueueFlushTail=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent=void 0,this.streamingMessage=void 0,this.assistantTextSegments.clear(),this.clearPendingTools(),this.clearToolHookStatuses(),this.renderInitialMessages()}getRegisteredToolDefinition(toolName){return withBuiltInRenderers(toolName,this.session.getToolDefinition(toolName)??askUserRenderers(toolName))}getMarkdownTransformers(){return[this.mermaidMarkdownTransformer,this.messagePathLinkTransformer,...this.session.extensionRunner.getMarkdownTransformers()]}setupExtensionShortcuts(extensionRunner){let shortcuts=extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig()),createContext=()=>({ui:this.createExtensionUIContext(),mode:"tui",hasUI:!0,cwd:this.sessionManager.getCwd(),agentDir:this.session.agentDir,sessionManager:this.sessionManager,modelRegistry:extensionRunner.getModelRegistry(),model:this.session.model,serviceTier:this.session.serviceTier,effectiveServiceTier:this.session.effectiveServiceTier,scopedModels:this.session.scopedModels,thinkingLevel:this.session.thinkingLevel,isIdle:()=>this.session.isIdle,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),signal:this.session.agent.signal,abort:()=>this.session.abort(),hasPendingMessages:()=>this.session.pendingMessageCount>0,requestReload:()=>this.handleReloadCommand(),isCompacting:()=>this.session.isCompacting,shutdown:()=>{this.requestExtensionShutdown()},getContextUsage:()=>this.session.getContextUsage(),getCompactionSettings:()=>this.settingsManager.getCompactionSettings(this.session.model),getPromptCacheSafeWaitSeconds:()=>this.session.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project2=this.settingsManager.getProjectSettings().lookAt;return{enabled:project2?.enabled??global?.enabled??!0,models:project2?.models??global?.models}},getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:extensionRunner.createContext().sessionSettings,compact:options=>{(async()=>{try{let result3=await this.session.compact(options?.customInstructions);options?.onComplete?.(result3)}catch(error2){let err=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err)}})()},getMessageRevision:()=>this.session.getMessageRevision(),applyCompaction:(precomputed,options)=>this.session.applyCompaction(precomputed,options),getSystemPrompt:()=>this.session.systemPrompt});this.defaultEditor.onExtensionShortcut=data=>{if(this.handleAskUserShortcut(data))return!0;for(let[shortcutStr,shortcut]of shortcuts)if(matchesKey(data,shortcutStr))return Promise.resolve(shortcut.handler(createContext())).catch(err=>{this.showError(`Shortcut handler error: ${err instanceof Error?err.message:String(err)}`)}),!0;return!1}}async withBlockedHostDialog(id,label3,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label3,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}setExtensionStatus(key,text3){this.footerDataProvider.setExtensionStatus(key,text3),this.ui.requestRender()}startToolHookStatusTimer(){if(this.hookStatusIntervalId)return;let intervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS);this.hookStatusIntervalId=setInterval(()=>{this.refreshToolHookStatuses()},intervalMs),this.hookStatusIntervalId.unref()}stopToolHookStatusTimer(){this.hookStatusIntervalId&&(clearInterval(this.hookStatusIntervalId),this.hookStatusIntervalId=void 0)}refreshToolHookStatuses(){if(this.hookStatusContainer.clear(),this.activeToolHooks.size===0){this.stopToolHookStatusTimer(),this.ui.requestRender();return}let now2=Date.now();for(let hook of this.activeToolHooks.values()){let elapsedMs=Math.max(0,now2-hook.startedAt),elapsedSeconds=Math.floor(elapsedMs/1e3);this.hookStatusContainer.addChild(new Text(formatToolHookStatusMessageFrame(hook.hookName,hook.statusMessage,elapsedSeconds,elapsedMs,{base:text3=>theme.fg("dim",text3),glow:text3=>theme.fg("text",text3),highlight:text3=>theme.bold(theme.fg("text",text3)),shimmer:formatWorkingStatusShimmerText,suffix:text3=>theme.fg("dim",text3)}),1,0))}this.ui.requestRender()}handleToolHookStatusEvent(event){if(event.phase==="start"){this.activeToolHooks.set(event.hookRunId,event),this.activeToolTerminalTitle=formatToolHookTerminalTitle(event),this.ui.terminal&&this.applyTerminalTitle(),this.startToolHookStatusTimer(),this.refreshToolHookStatuses();return}if(event.phase==="update"){let existing2=this.activeToolHooks.get(event.hookRunId);if(!existing2)return;let updated={...existing2,statusMessage:event.statusMessage};this.activeToolHooks.set(event.hookRunId,updated),this.activeToolTerminalTitle=formatToolHookTerminalTitle(updated),this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses();return}this.activeToolHooks.delete(event.hookRunId);let nextHook=this.activeToolHooks.values().next().value;this.activeToolTerminalTitle=nextHook?formatToolHookTerminalTitle(nextHook):void 0,this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses()}handleToolExecutionStart(event){let label3=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(frame,elapsedMs)=>formatWorkingStatusShimmerText(frame,elapsedMs):void 0,messageFormatter:(message,animationElapsedMs)=>formatWorkingStatusMessageFrame(message,this.getWorkingElapsedSeconds(),keyText("app.interrupt"),animationElapsedMs,{base:text3=>theme.fg("dim",text3),glow:text3=>theme.fg("text",text3),highlight:text3=>theme.bold(theme.fg("text",text3)),shimmer:formatWorkingStatusShimmerText,suffix:text3=>theme.fg("dim",text3)}),messageIntervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS)}}showStatusIndicator(indicator){indicator.kind==="working"&&(this.workingStartedAt=Date.now()),this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear();let embedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,indicator);this.activeWorkingIndicatorEmbedded=embedded;let workingTip=indicator.kind==="working"?this.resolveTurnWorkingTip():void 0;if(embedded){workingTip&&appendTipLine(this.statusContainer,theme.fg("dim",workingTip.line));return}if(!workingTip){this.statusContainer.addChild(indicator);return}let wrapper=new Container;wrapper.addChild(indicator),appendTipLine(wrapper,theme.fg("dim",workingTip.line)),this.statusContainer.addChild(wrapper)}resolveTurnWorkingTip(){return this.turnWorkingTip.resolve(()=>resolveWorkingTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),history:this.settingsManager.getTipsHistory(),sessionShownTipIds:this.sessionShownTipIds,now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)}),tip=>this.recordShownTip(tip.tipId))}updateWorkingIndicatorMessage(){this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setMessage(this.workingMessage??this.defaultWorkingMessage)}clearStatusIndicator(kind){if(kind&&this.activeStatusIndicator?.kind!==kind)return;let hadActiveStatusIndicator=this.activeStatusIndicator!==void 0,isClearingWorking=this.activeStatusIndicator?.kind==="working",clearedIndicatorWasEmbedded=this.activeWorkingIndicatorEmbedded,shouldReserveHeight=hadActiveStatusIndicator&&this.options.tuiMode==="regular"&&this.ui.getClearOnShrink(),renderedHeight=shouldReserveHeight?this.statusContainer.render(this.ui.terminal.columns).length:0;if(this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=void 0,isClearingWorking&&(this.workingStartedAt=void 0),this.activeWorkingIndicatorEmbedded=!1,this.statusContainer.clear(),embedStatusIndicatorInEditor(this.defaultEditor,this.editor,void 0),shouldReserveHeight&&(!clearedIndicatorWasEmbedded||renderedHeight>0)){let idleHeight=Math.min(this.ui.terminal.rows,Math.max(1,renderedHeight||2));this.idleStatus.setHeight(idleHeight),this.statusContainer.addChild(this.idleStatus)}}showWorkingStatusIndicator(){let colorFn=isWorkingStatusEditor(this.editor)?text3=>(this.editor.borderColor??theme.getThinkingBorderColor(this.session.thinkingLevel||"off"))(text3):void 0;this.showStatusIndicator(new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions(),colorFn))}setWorkingVisible(visible){if(this.workingVisible=visible,!visible){this.clearStatusIndicator("working"),this.ui.requestRender();return}this.session.isStreaming&&this.activeStatusIndicator?.kind!=="working"&&this.showStatusIndicator(this.chrome?this.chrome.createWorkingIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions()):new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions())),this.ui.requestRender()}setWorkingIndicator(options){this.workingIndicatorOptions=options,this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setIndicator(this.getWorkingIndicatorOptions()),this.ui.requestRender()}setHiddenThinkingLabel(label3){this.hiddenThinkingLabel=label3??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let existing3=map.get(key);existing3?.dispose&&existing3.dispose(),map.delete(key)};if(removeFrom(otherMap),content===void 0){removeFrom(targetMap),this.renderWidgets();return}let component;if(Array.isArray(content)){let container=new Container,shown=content.slice(0,_InteractiveMode.MAX_WIDGET_LINES),actions=options?.actions??[];for(let[index,line]of shown.entries())if(index===shown.length-1&&actions.length>0){let choices=actions.map(action=>`${action.label}: ${action.command}`).join(" \xB7 ");container.addChild(new ThemedText(()=>`${line} ${theme.fg("muted",choices)}`,1,0))}else container.addChild(new Text(line,1,0));content.length>_InteractiveMode.MAX_WIDGET_LINES&&container.addChild(new ThemedText(()=>theme.fg("muted","... (widget truncated)"),1,0)),component=container}else component=content(this.ui,theme);let existing2=targetMap.get(key);existing2?.dispose&&existing2.dispose(),targetMap.set(key,component),this.renderWidgets()}clearExtensionWidgets(){for(let widget of this.extensionWidgetsAbove.values())widget.dispose?.();for(let widget of this.extensionWidgetsBelow.values())widget.dispose?.();this.extensionWidgetsAbove.clear(),this.extensionWidgetsBelow.clear(),this.renderWidgets()}resetExtensionUI(){this.extensionSelector&&this.hideExtensionSelector(),this.extensionInput&&this.hideExtensionInput(),this.extensionEditor&&this.hideExtensionEditor(),this.askUserQuestion&&this.hideQuestionOverlay();for(let state3 of this.pendingQuestions.values())state3.finish({status:"cancelled",answers:{},unanswered:state3.request.questions.map(question=>question.id)});this.ui.hideOverlay(),this.clearExtensionTerminalInputListeners(),this.setExtensionFooter(void 0),this.setExtensionHeader(void 0),this.clearExtensionWidgets(),this.footerDataProvider.clearExtensionStatuses(),this.footer.invalidate(),this.autocompleteProviderWrappers=[],this.setCustomEditorComponent(void 0),this.setupAutocompleteProvider(),this.defaultEditor.onExtensionShortcut=void 0,this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.extensionTerminalTitle=void 0,this.updateTerminalTitle(),this.workingMessage=void 0,this.workingVisible=!0,this.setWorkingIndicator(),this.updateWorkingIndicatorMessage(),this.setHiddenThinkingLabel(),this.clearToolHookStatuses()}static{this.MAX_WIDGET_LINES=10}renderWidgets(){!this.widgetContainerAbove||!this.widgetContainerBelow||(this.renderWidgetContainer(this.widgetContainerAbove,this.extensionWidgetsAbove,!0,!0),this.renderWidgetContainer(this.widgetContainerBelow,this.extensionWidgetsBelow,!1,!1),this.ui.requestRender())}renderWidgetContainer(container,widgets,spacerWhenEmpty,leadingSpacer){if(container.clear(),widgets.size===0){spacerWhenEmpty&&container.addChild(new Spacer(1));return}leadingSpacer&&container.addChild(new Spacer(1));for(let component of widgets.values())container.addChild(component)}setExtensionFooter(factory){this.customFooter?.dispose&&this.customFooter.dispose(),this.footerContainer.clear(),factory?(this.customFooter=factory(this.ui,theme,this.footerDataProvider),this.footerContainer.addChild(this.customFooter)):(this.customFooter=void 0,this.footerContainer.addChild(this.footer)),this.ui.requestRender()}setExtensionHeader(factory){if(!this.builtInHeader)return;this.customHeader?.dispose&&this.customHeader.dispose();let currentHeader=this.customHeader||this.builtInHeader,index=this.headerContainer.children.indexOf(currentHeader);factory?(this.customHeader=factory(this.ui,theme),isExpandable(this.customHeader)&&this.customHeader.setExpanded(this.toolOutputExpanded),index!==-1?this.headerContainer.children[index]=this.customHeader:this.headerContainer.children.unshift(this.customHeader)):(this.customHeader=void 0,isExpandable(this.builtInHeader)&&this.builtInHeader.setExpanded(this.toolOutputExpanded),index!==-1&&(this.headerContainer.children[index]=this.builtInHeader)),this.ui.requestRender()}addExtensionTerminalInputListener(handler){let subscription={handler,unsubscribe:this.ui.addInputListener(handler)};return this.extensionTerminalInputSubscriptions.add(subscription),()=>{subscription.unsubscribe(),this.extensionTerminalInputSubscriptions.delete(subscription)}}rebindExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe(),subscription.unsubscribe=this.ui.addInputListener(subscription.handler)}clearExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe();this.extensionTerminalInputSubscriptions.clear()}createProjectTrustContext(cwd){let ui=this.createExtensionUIContext();return{cwd,mode:"tui",hasUI:!0,ui:{select:ui.select,confirm:ui.confirm,input:ui.input,notify:ui.notify}}}createExtensionUIContext(){return{select:(title,options,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionSelector(title,options,opts)),confirm:(title,message,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionConfirm(title,message,opts)),input:(title,placeholder,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionInput(title,placeholder,opts)),question:(request2,opts)=>request2.waitForAnswer?this.showQuestionOverlay(request2,opts):this.showAsyncQuestion(request2,opts),notify:(message,type2)=>this.showExtensionNotify(message,type2),onTerminalInput:handler=>this.addExtensionTerminalInputListener(handler),setStatus:(key,text3)=>this.setExtensionStatus(key,text3),setSubagentCost:costUsd=>{this.footerDataProvider.setSubagentCost(costUsd),this.ui.requestRender()},setWorkingMessage:message=>{this.workingMessage=message,this.updateWorkingIndicatorMessage()},setWorkingVisible:visible=>this.setWorkingVisible(visible),setWorkingIndicator:options=>this.setWorkingIndicator(options),setHiddenThinkingLabel:label3=>this.setHiddenThinkingLabel(label3),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor:text3=>insertProgrammaticComposerInput(this.editor,`\x1B[200~${text3}\x1B[201~`),setEditorText:text3=>this.editor.setText(text3),getEditorText:()=>this.getExpandedEditorText(),editor:(title,prefill)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionEditor(title,prefill)),addAutocompleteProvider:factory=>{this.autocompleteProviderWrappers.push(factory),this.setupAutocompleteProvider()},setEditorComponent:factory=>this.setCustomEditorComponent(factory),getEditorComponent:()=>this.editorComponentFactory,get theme(){return theme},getAllThemes:()=>getAvailableThemesWithPaths(),getTheme:name=>getThemeByName(name),setTheme:themeOrName=>{if(themeOrName instanceof Theme)return this.themeController.setThemeInstance(themeOrName);let result3=this.themeController.setThemeName(themeOrName);return result3.success&&this.settingsManager.getTheme()!==themeOrName&&this.settingsManager.setTheme(themeOrName),result3},getToolsExpanded:()=>this.toolOutputExpanded,setToolsExpanded:expanded=>this.setToolsExpanded(expanded)}}showExtensionSelector(title,options,opts){return new Promise(resolve55=>{if(opts?.signal?.aborted){resolve55(void 0);return}let onAbort=()=>{this.hideExtensionSelector(),resolve55(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionSelector=new ExtensionSelectorComponent(title,options,option=>{this.session.admitHumanAnswer(),opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve55(option)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve55(void 0)},{tui:this.ui,timeout:opts?.timeout,onToggleToolsExpanded:()=>this.toggleToolOutputExpansion()}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionSelector),this.ui.setFocus(this.extensionSelector),this.ui.requestRender()})}hideExtensionSelector(){this.extensionSelector?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionSelector=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}async showExtensionConfirm(title,message,opts){return await this.showExtensionSelector(`${title}
|
|
2148
|
+
`)));let skills=skillsResult.skills;if(skills.length>0){let groups=this.buildScopeGroups(skills.map(skill=>({path:skill.filePath,sourceInfo:skill.sourceInfo})));addLoadedSection("Skills",()=>formatCompactList(skills.filter(skill=>!isSystemResource(skill.sourceInfo)).map(skill=>skill.name)),()=>this.formatScopeGroups(groups,{formatPath:item=>this.formatDisplayPath(item.path),formatPackagePath:item=>this.getShortPath(item.path,item.sourceInfo)}))}let templates=this.session.promptTemplates;if(templates.length>0){let groups=this.buildScopeGroups(templates.map(template=>({path:template.filePath,sourceInfo:template.sourceInfo}))),templateByPath=new Map(templates.map(t=>[t.filePath,t]));addLoadedSection("Prompts",()=>formatCompactList(templates.filter(template=>!isSystemResource(template.sourceInfo)).map(template=>`/${template.name}`)),()=>this.formatScopeGroups(groups,{formatPath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)},formatPackagePath:item=>{let template=templateByPath.get(item.path);return template?`/${template.name}`:this.formatDisplayPath(item.path)}}))}if(extensions.length>0){let groups=this.buildScopeGroups(extensions),extList=()=>this.formatScopeGroups(groups,{formatPath:item=>this.formatExtensionDisplayPath(item.path),formatPackagePath:item=>this.formatExtensionDisplayPath(this.getShortPath(item.path,item.sourceInfo))}),extensionLabels=this.getCompactExtensionLabels(extensions.filter(extension=>!isSystemResource(extension.sourceInfo)));addLoadedSection("Extensions",()=>formatCompactList(extensionLabels),extList,"mdHeading")}}if(showDiagnostics){let addDiagnosticNotice=(title,diagnostics,why="Conflicting or invalid loaded resources were found.")=>{this.loadedResourcesContainer.addChild(buildNoticeBox({title,tone:"warning",why,extra:this.formatDiagnostics(diagnostics,sourceInfos)},{expanded:this.toolOutputExpanded},theme)),this.loadedResourcesContainer.addChild(new Spacer(1))},contextDiagnostics=[...this.session.resourceLoader.getAgentsFiles().diagnostics??[],...skillsResult.diagnostics.filter(diagnostic2=>diagnostic2.category==="size-limit")];contextDiagnostics.length>0&&addDiagnosticNotice("Context size limits",contextDiagnostics,"Context files or skill catalogs were limited to keep requests bounded.");let skillDiagnostics=skillsResult.diagnostics.filter(diagnostic2=>diagnostic2.category!=="size-limit"&&diagnostic2.category!=="skill-link-blocked");skillDiagnostics.length>0&&addDiagnosticNotice("Skill conflicts",skillDiagnostics);let promptDiagnostics=promptsResult.diagnostics;promptDiagnostics.length>0&&addDiagnosticNotice("Prompt conflicts",promptDiagnostics);let extensionDiagnostics=[],extensionsResult=this.session.resourceLoader.getExtensions();for(let error2 of extensionsResult.errors)extensionDiagnostics.push({type:"error",message:error2.error,path:error2.path});for(let warning of extensionsResult.warnings??[])extensionDiagnostics.push({type:"warning",message:warning.warning,path:warning.path});let commandDiagnostics=this.session.extensionRunner.getCommandDiagnostics();extensionDiagnostics.push(...commandDiagnostics),extensionDiagnostics.push(...this.getBuiltInCommandConflictDiagnostics(this.session.extensionRunner));let shortcutDiagnostics=this.session.extensionRunner.getShortcutDiagnostics();extensionDiagnostics.push(...shortcutDiagnostics),extensionDiagnostics.length>0&&addDiagnosticNotice("Extension issues",extensionDiagnostics);let themeDiagnostics=themesResult.diagnostics;themeDiagnostics.length>0&&addDiagnosticNotice("Theme conflicts",themeDiagnostics)}}async bindCurrentSessionExtensions(){await this.sessionControlHost?.disposeActive(),this.session.setControlEndpointHost?.(this.sessionControlHost);let uiContext=this.createExtensionUIContext();this.detachMcpGrantPresentation?.(),this.detachMcpGrantPresentation=attachMcpGrantPresentation(this.session.sessionId,(title,choices,opts)=>uiContext.select(title,choices,opts)),this.unsubscribeSecurityNotices?.(),this.unsubscribeSecurityNotices=this.session.securityNotices?.subscribe(snapshot=>{for(let notice2 of snapshot.notices)uiContext.notify(notice2.message,"warning")}),await this.session.bindExtensions({uiContext,mode:"tui",abortHandler:()=>{this.restoreQueuedMessagesToEditor({abort:!0})},commandContextActions:{waitForIdle:()=>this.session.waitForIdle(),newSession:async options=>{this.clearStatusIndicator();try{return await this.runtimeHost.newSession(options)}catch(error2){return this.handleFatalRuntimeError("Failed to create session",error2)}},fork:async(entryId,options)=>{try{let result3=await this.runtimeHost.fork(entryId,options);return result3.cancelled||(this.editor.setText(result3.selectedText??""),this.showStatus("Forked to new session")),{cancelled:result3.cancelled}}catch(error2){return this.handleFatalRuntimeError("Failed to fork session",error2)}},navigateTree:async(targetId,options)=>{let result3=await this.session.navigateTree(targetId,{summarize:options?.summarize,customInstructions:options?.customInstructions,replaceInstructions:options?.replaceInstructions,label:options?.label,expectedLeafId:options?.expectedLeafId});return result3.cancelled?{cancelled:!0}:(this.chatContainer.clear(),this.renderInitialMessages(),result3.editorText&&!this.editor.getText().trim()&&this.editor.setText(result3.editorText),this.showStatus("Navigated to selected point"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1})},editAssistantMessage:async(entryId,text3,options)=>{let result3=await this.session.editAssistantMessage(entryId,text3,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced assistant response"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},editUserMessage:async(entryId,text3,options)=>{let result3=await this.session.editUserMessage(entryId,text3,{summarize:options?.summarize,customInstructions:options?.customInstructions,expectedLeafId:options?.expectedLeafId});return result3.cancelled||result3.unchanged?{cancelled:result3.cancelled,unchanged:result3.unchanged}:(this.chatContainer.clear(),this.renderInitialMessages(),this.showStatus("Replaced user prompt"),this.flushCompactionQueue({willRetry:!1}),{cancelled:!1,entryId:result3.entryId})},switchSession:async(sessionPath,options)=>this.handleResumeSession(sessionPath,options),reload:async()=>{await this.handleReloadCommand()}},shutdownHandler:()=>{this.shutdownRequested=!0,this.session.isIdle&&this.shutdown()},onError:error2=>{this.showExtensionError(error2)}}),this.setExtensionStatus(PAUSE_STATUS_KEY,pauseFooterText(this.session)),setRegisteredThemes(this.session.resourceLoader.getThemes().themes),this.setupAutocompleteProvider();let extensionRunner=this.session.extensionRunner;this.setupExtensionShortcuts(extensionRunner),this.showLoadedResources({force:!1,showDiagnosticsWhenQuiet:!0}),this.showStartupNoticesIfNeeded()}applyFullscreenScrollbarSetting(){this.transcriptScrollView?.setScrollbar(this.settingsManager.getFullscreenScrollbar())}applyRuntimeSettings(){setCapabilityOverrides(this.settingsManager.getTerminalCapabilityOverrides()),configureHttpDispatcher(this.settingsManager.getHttpIdleTimeoutMs()),this.applyFullscreenScrollbarSetting(),this.renderer instanceof TuiAltScreen&&(this.renderer.setCopyOnSelect(this.settingsManager.getFullscreenCopyOnSelect?.()??!0),this.renderer.setWheelScrollLines(this.settingsManager.getFullscreenWheelScrollLines?.()??"auto")),this.footer.setSession(this.session),this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled),this.footerDataProvider.setCwd(this.sessionManager.getCwd()),this.hideThinkingBlock=this.settingsManager.getHideThinkingBlock(),this.outputPad=this.settingsManager.getOutputPad(),this.applySmoothStreamingRenderFps(),this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());let clearOnShrink=this.settingsManager.getClearOnShrink();this.ui.setClearOnShrink(clearOnShrink),!clearOnShrink&&!this.activeStatusIndicator&&this.statusContainer.clear();let editorPaddingX=this.settingsManager.getEditorPaddingX(),autocompleteMaxVisible=this.settingsManager.getAutocompleteMaxVisible();this.defaultEditor.setPaddingX(editorPaddingX),this.defaultEditor.setAutocompleteMaxVisible(autocompleteMaxVisible),this.editor!==this.defaultEditor&&(this.editor.setPaddingX?.(editorPaddingX),this.editor.setAutocompleteMaxVisible?.(autocompleteMaxVisible))}async rebindCurrentSession(options={}){_InteractiveMode.restoreCompactionEscapeOverride(this),this.externalOwnerCompactionNoticeShown=!1,this.footer?.setCompactionDelegated?.(!1);let session=this.session;this.unsubscribe?.(),this.unsubscribe=void 0,this.applyRuntimeSettings(),options.renderBeforeBind&&(this.renderCurrentSessionState(),this.subscribeToAgent(),time("render","switch")),await this.bindCurrentSessionExtensions(),time("bindExtensions","switch"),this.session===session&&(options.renderBeforeBind||this.subscribeToAgent(),this.updateAvailableProviderCount(),this.updateEditorBorderColor(),this.updateTerminalTitle())}async handleFatalRuntimeError(prefix,error2){let message=error2 instanceof Error?error2.message:String(error2);this.showError(`${prefix}: ${message}`);let extensionHint=this.getCrashExtensionHint(error2);extensionHint&&this.chatContainer.addChild(new ThemedText(()=>theme.fg("warning",extensionHint),this.outputPad,0)),stopThemeWatcher(),this.stop("transcript"),process.exit(1)}getCrashExtensionHint(error2){try{return formatCrashExtensionHint(findExtensionStackMatches(error2 instanceof Error?error2.stack:void 0,this.session.resourceLoader.getExtensions().extensions))}catch{return}}renderCurrentSessionState(){this.loadedResourcesContainer.clear(),this.chatContainer.clear(),this.pendingMessagesContainer.clear();for(let controller of this.compactionTransferAbortControllers.values())controller.abort();this.compactionQueueGeneration+=1,this.compactionQueueFlushTail=void 0,this.compactionQueuedMessages=[],this.compactionInFlightMessages=[],this.compactionTransferAbortControllers.clear(),this.streamingReveal.stop(),this.toolResultReveal.stop(),this.streamingComponent=void 0,this.streamingMessage=void 0,this.assistantTextSegments.clear(),this.clearPendingTools(),this.clearToolHookStatuses(),this.renderInitialMessages()}getRegisteredToolDefinition(toolName){return withBuiltInRenderers(toolName,this.session.getToolDefinition(toolName)??askUserRenderers(toolName))}getMarkdownTransformers(){return[this.mermaidMarkdownTransformer,this.messagePathLinkTransformer,...this.session.extensionRunner.getMarkdownTransformers()]}setupExtensionShortcuts(extensionRunner){let shortcuts=extensionRunner.getShortcuts(this.keybindings.getEffectiveConfig()),createContext=()=>({ui:this.createExtensionUIContext(),mode:"tui",hasUI:!0,cwd:this.sessionManager.getCwd(),agentDir:this.session.agentDir,sessionManager:this.sessionManager,modelRegistry:extensionRunner.getModelRegistry(),model:this.session.model,serviceTier:this.session.serviceTier,effectiveServiceTier:this.session.effectiveServiceTier,scopedModels:this.session.scopedModels,thinkingLevel:this.session.thinkingLevel,isIdle:()=>this.session.isIdle,isProjectTrusted:()=>this.settingsManager.isProjectTrusted(),signal:this.session.agent.signal,abort:()=>this.session.abort(),hasPendingMessages:()=>this.session.pendingMessageCount>0,requestReload:()=>this.handleReloadCommand(),isCompacting:()=>this.session.isCompacting,shutdown:()=>{this.requestExtensionShutdown()},getContextUsage:()=>this.session.getContextUsage(),getCompactionSettings:()=>this.settingsManager.getCompactionSettings(this.session.model),getPromptCacheSafeWaitSeconds:()=>this.session.resolvePromptCacheSafeWaitSeconds(),getPromptCacheGoalBackstopMaxSeconds:()=>this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),getLookAtSettings:()=>{let global=this.settingsManager.getGlobalSettings().lookAt,project2=this.settingsManager.getProjectSettings().lookAt;return{enabled:project2?.enabled??global?.enabled??!0,models:project2?.models??global?.models}},getImageSettings:()=>({autoResize:this.settingsManager.getImageAutoResize(),blockImages:this.settingsManager.getBlockImages()}),sessionSettings:extensionRunner.createContext().sessionSettings,compact:options=>{(async()=>{try{let result3=await this.session.compact(options?.customInstructions);options?.onComplete?.(result3)}catch(error2){let err=error2 instanceof Error?error2:new Error(String(error2));options?.onError?.(err)}})()},getMessageRevision:()=>this.session.getMessageRevision(),applyCompaction:(precomputed,options)=>this.session.applyCompaction(precomputed,options),getSystemPrompt:()=>this.session.systemPrompt});this.defaultEditor.onExtensionShortcut=data=>{if(this.handleAskUserShortcut(data))return!0;for(let[shortcutStr,shortcut]of shortcuts)if(matchesKey(data,shortcutStr))return Promise.resolve(shortcut.handler(createContext())).catch(err=>{this.showError(`Shortcut handler error: ${err instanceof Error?err.message:String(err)}`)}),!0;return!1}}async withBlockedHostDialog(id,label3,show){this.session.emitExtensionEvent("herdr:blocked",{active:!0,label:label3,id});try{return await show()}finally{this.session.emitExtensionEvent("herdr:blocked",{active:!1,id})}}setExtensionStatus(key,text3){this.footerDataProvider.setExtensionStatus(key,text3),this.ui.requestRender()}startToolHookStatusTimer(){if(this.hookStatusIntervalId)return;let intervalMs=largeSessionWorkingStatusInterval(this.sessionManager.getEntryCount(),DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS);this.hookStatusIntervalId=setInterval(()=>{this.refreshToolHookStatuses()},intervalMs),this.hookStatusIntervalId.unref()}stopToolHookStatusTimer(){this.hookStatusIntervalId&&(clearInterval(this.hookStatusIntervalId),this.hookStatusIntervalId=void 0)}refreshToolHookStatuses(){if(this.hookStatusContainer.clear(),this.activeToolHooks.size===0){this.stopToolHookStatusTimer(),this.ui.requestRender();return}let now2=Date.now();for(let hook of this.activeToolHooks.values()){let elapsedMs=Math.max(0,now2-hook.startedAt),elapsedSeconds=Math.floor(elapsedMs/1e3);this.hookStatusContainer.addChild(new Text(formatToolHookStatusMessageFrame(hook.hookName,hook.statusMessage,elapsedSeconds,elapsedMs,{base:text3=>theme.fg("dim",text3),glow:text3=>theme.fg("text",text3),highlight:text3=>theme.bold(theme.fg("text",text3)),shimmer:formatWorkingStatusShimmerText,suffix:text3=>theme.fg("dim",text3)}),1,0))}this.ui.requestRender()}handleToolHookStatusEvent(event){if(event.phase==="start"){this.activeToolHooks.set(event.hookRunId,event),this.activeToolTerminalTitle=formatToolHookTerminalTitle(event),this.ui.terminal&&this.applyTerminalTitle(),this.startToolHookStatusTimer(),this.refreshToolHookStatuses();return}if(event.phase==="update"){let existing2=this.activeToolHooks.get(event.hookRunId);if(!existing2)return;let updated={...existing2,statusMessage:event.statusMessage};this.activeToolHooks.set(event.hookRunId,updated),this.activeToolTerminalTitle=formatToolHookTerminalTitle(updated),this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses();return}this.activeToolHooks.delete(event.hookRunId);let nextHook=this.activeToolHooks.values().next().value;this.activeToolTerminalTitle=nextHook?formatToolHookTerminalTitle(nextHook):void 0,this.ui.terminal&&this.applyTerminalTitle(),this.refreshToolHookStatuses()}handleToolExecutionStart(event){let label3=formatActiveToolWorkingLabel(event.toolName,event.args);this.activeToolExecutions.size===0&&(this.workingMessageBeforeActiveTool=this.workingMessage),this.activeToolExecutions.set(event.toolCallId,label3),this.workingMessage=label3,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${label3}`,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}handleToolExecutionEnd(event){if(!this.activeToolExecutions.delete(event.toolCallId))return;let nextExecution=this.activeToolExecutions.values().next();nextExecution.done?(this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.activeToolExecutionTerminalTitle=void 0):(this.workingMessage=nextExecution.value,this.activeToolExecutionTerminalTitle=`${APP_TITLE} - ${nextExecution.value}`),this.refreshWorkingLoaderMessage(),this.applyTerminalTitle()}stopChatToolAnimations(){for(let child of this.chatContainer.children)child instanceof ToolExecutionComponent&&child.stopAnimation()}clearPendingTools(){this.toolArgsReveal.flushAll();for(let component of this.pendingTools.values())component.stopAnimation();this.pendingTools.clear()}clearActiveToolExecutionStatus(){this.activeToolExecutions.size===0&&this.activeToolExecutionTerminalTitle===void 0&&this.workingMessageBeforeActiveTool===void 0||(this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessage=this.workingMessageBeforeActiveTool,this.workingMessageBeforeActiveTool=void 0,this.refreshWorkingLoaderMessage(),this.applyTerminalTitle())}clearToolHookStatuses(){this.activeToolHooks.clear(),this.activeToolTerminalTitle=void 0,this.ui.terminal&&this.applyTerminalTitle(),this.hookStatusContainer.clear(),this.stopToolHookStatusTimer()}getWorkingElapsedSeconds(){return this.workingStartedAt===void 0?0:Math.max(0,Math.floor((Date.now()-this.workingStartedAt)/1e3))}getWorkingLoaderMessage(){return this.workingMessage??this.defaultWorkingMessage}refreshWorkingLoaderMessage(){if(this.activeStatusIndicator?.kind==="working"){this.activeStatusIndicator.setMessage(this.getWorkingLoaderMessage());return}this.loadingAnimation?.setMessage(this.getWorkingLoaderMessage())}getWorkingIndicatorOptions(){if(this.workingIndicatorOptions!==void 0)return this.workingIndicatorOptions;let sessionEntryCount=this.sessionManager.getEntryCount();return{frames:theme.getColorMode()==="truecolor"?["\u2022"]:[theme.fg("accent","\u2022"),theme.fg("muted","\u25E6")],intervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_REFRESH_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_REFRESH_INTERVAL_MS),indicatorFormatter:theme.getColorMode()==="truecolor"?(frame,elapsedMs)=>formatWorkingStatusShimmerText(frame,elapsedMs):void 0,messageFormatter:(message,animationElapsedMs)=>formatWorkingStatusMessageFrame(message,this.getWorkingElapsedSeconds(),keyText("app.interrupt"),animationElapsedMs,{base:text3=>theme.fg("dim",text3),glow:text3=>theme.fg("text",text3),highlight:text3=>theme.bold(theme.fg("text",text3)),shimmer:formatWorkingStatusShimmerText,suffix:text3=>theme.fg("dim",text3)}),messageIntervalMs:largeSessionWorkingStatusInterval(sessionEntryCount,DEFAULT_WORKING_STATUS_MESSAGE_ANIMATION_INTERVAL_MS,LARGE_SESSION_WORKING_STATUS_MESSAGE_INTERVAL_MS)}}showStatusIndicator(indicator){indicator.kind==="working"&&(this.workingStartedAt=Date.now()),this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=indicator,this.statusContainer.clear();let embedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,indicator);this.activeWorkingIndicatorEmbedded=embedded;let workingTip=indicator.kind==="working"?this.resolveTurnWorkingTip():void 0;if(embedded){workingTip&&appendTipLine(this.statusContainer,theme.fg("dim",workingTip.line));return}if(!workingTip){this.statusContainer.addChild(indicator);return}let wrapper=new Container;wrapper.addChild(indicator),appendTipLine(wrapper,theme.fg("dim",workingTip.line)),this.statusContainer.addChild(wrapper)}resolveTurnWorkingTip(){return this.turnWorkingTip.resolve(()=>resolveWorkingTipLine({tipsEnabled:this.settingsManager.getTipsEnabled(),history:this.settingsManager.getTipsHistory(),sessionShownTipIds:this.sessionShownTipIds,now:Date.now(),definitions:TIP_DEFINITIONS,keys:keyText,hasCommand:command=>this.hasRegisteredCommand(command)}),tip=>this.recordShownTip(tip.tipId))}updateWorkingIndicatorMessage(){this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setMessage(this.workingMessage??this.defaultWorkingMessage)}clearStatusIndicator(kind){if(kind&&this.activeStatusIndicator?.kind!==kind)return;let hadActiveStatusIndicator=this.activeStatusIndicator!==void 0,isClearingWorking=this.activeStatusIndicator?.kind==="working",clearedIndicatorWasEmbedded=this.activeWorkingIndicatorEmbedded,shouldReserveHeight=hadActiveStatusIndicator&&this.options.tuiMode==="regular"&&this.ui.getClearOnShrink(),renderedHeight=shouldReserveHeight?this.statusContainer.render(this.ui.terminal.columns).length:0;if(this.activeStatusIndicator?.dispose(),this.activeStatusIndicator=void 0,isClearingWorking&&(this.workingStartedAt=void 0),this.activeWorkingIndicatorEmbedded=!1,this.statusContainer.clear(),embedStatusIndicatorInEditor(this.defaultEditor,this.editor,void 0),shouldReserveHeight&&(!clearedIndicatorWasEmbedded||renderedHeight>0)){let idleHeight=Math.min(this.ui.terminal.rows,Math.max(1,renderedHeight||2));this.idleStatus.setHeight(idleHeight),this.statusContainer.addChild(this.idleStatus)}}showWorkingStatusIndicator(){let colorFn=isWorkingStatusEditor(this.editor)?text3=>(this.editor.borderColor??theme.getThinkingBorderColor(this.session.thinkingLevel||"off"))(text3):void 0;this.showStatusIndicator(new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions(),colorFn))}setWorkingVisible(visible){if(this.workingVisible=visible,!visible){this.clearStatusIndicator("working"),this.ui.requestRender();return}this.session.isStreaming&&this.activeStatusIndicator?.kind!=="working"&&this.showStatusIndicator(this.chrome?this.chrome.createWorkingIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions()):new WorkingStatusIndicator(this.ui,this.workingMessage??this.defaultWorkingMessage,this.getWorkingIndicatorOptions())),this.ui.requestRender()}setWorkingIndicator(options){this.workingIndicatorOptions=options,this.activeStatusIndicator?.kind==="working"&&this.activeStatusIndicator.setIndicator(this.getWorkingIndicatorOptions()),this.ui.requestRender()}setHiddenThinkingLabel(label3){this.hiddenThinkingLabel=label3??this.defaultHiddenThinkingLabel;for(let child of this.chatContainer.children)child instanceof AssistantMessageComponent&&child.setHiddenThinkingLabel(this.hiddenThinkingLabel);this.streamingComponent&&this.streamingComponent.setHiddenThinkingLabel(this.hiddenThinkingLabel),this.ui.requestRender()}setExtensionWidget(key,content,options){let placement=options?.placement??"aboveEditor",targetMap=placement==="belowEditor"?this.extensionWidgetsBelow:this.extensionWidgetsAbove,otherMap=placement==="belowEditor"?this.extensionWidgetsAbove:this.extensionWidgetsBelow,removeFrom=map=>{let existing3=map.get(key);existing3?.dispose&&existing3.dispose(),map.delete(key)};if(removeFrom(otherMap),content===void 0){removeFrom(targetMap),this.renderWidgets();return}let component;if(Array.isArray(content)){let container=new Container,shown=content.slice(0,_InteractiveMode.MAX_WIDGET_LINES),actions=options?.actions??[];for(let[index,line]of shown.entries())if(index===shown.length-1&&actions.length>0){let choices=actions.map(action=>`${action.label}: ${action.command}`).join(" \xB7 ");container.addChild(new ThemedText(()=>`${line} ${theme.fg("muted",choices)}`,1,0))}else container.addChild(new Text(line,1,0));content.length>_InteractiveMode.MAX_WIDGET_LINES&&container.addChild(new ThemedText(()=>theme.fg("muted","... (widget truncated)"),1,0)),component=container}else component=content(this.ui,theme);let existing2=targetMap.get(key);existing2?.dispose&&existing2.dispose(),targetMap.set(key,component),this.renderWidgets()}clearExtensionWidgets(){for(let widget of this.extensionWidgetsAbove.values())widget.dispose?.();for(let widget of this.extensionWidgetsBelow.values())widget.dispose?.();this.extensionWidgetsAbove.clear(),this.extensionWidgetsBelow.clear(),this.renderWidgets()}resetExtensionUI(){this.extensionSelector&&this.hideExtensionSelector(),this.extensionInput&&this.hideExtensionInput(),this.extensionEditor&&this.hideExtensionEditor(),this.askUserQuestion&&this.hideQuestionOverlay();for(let state3 of this.pendingQuestions.values())state3.finish({status:"cancelled",answers:{},unanswered:state3.request.questions.map(question=>question.id)});this.ui.hideOverlay(),this.clearExtensionTerminalInputListeners(),this.setExtensionFooter(void 0),this.setExtensionHeader(void 0),this.clearExtensionWidgets(),this.footerDataProvider.clearExtensionStatuses(),this.footer.invalidate(),this.autocompleteProviderWrappers=[],this.setCustomEditorComponent(void 0),this.setupAutocompleteProvider(),this.defaultEditor.onExtensionShortcut=void 0,this.activeToolExecutions.clear(),this.activeToolExecutionTerminalTitle=void 0,this.workingMessageBeforeActiveTool=void 0,this.extensionTerminalTitle=void 0,this.updateTerminalTitle(),this.workingMessage=void 0,this.workingVisible=!0,this.setWorkingIndicator(),this.updateWorkingIndicatorMessage(),this.setHiddenThinkingLabel(),this.clearToolHookStatuses()}static{this.MAX_WIDGET_LINES=10}renderWidgets(){!this.widgetContainerAbove||!this.widgetContainerBelow||(this.renderWidgetContainer(this.widgetContainerAbove,this.extensionWidgetsAbove,!0,!0),this.renderWidgetContainer(this.widgetContainerBelow,this.extensionWidgetsBelow,!1,!1),this.ui.requestRender())}renderWidgetContainer(container,widgets,spacerWhenEmpty,leadingSpacer){if(container.clear(),widgets.size===0){spacerWhenEmpty&&container.addChild(new Spacer(1));return}leadingSpacer&&container.addChild(new Spacer(1));for(let component of widgets.values())container.addChild(component)}setExtensionFooter(factory){this.customFooter?.dispose&&this.customFooter.dispose(),this.footerContainer.clear(),factory?(this.customFooter=factory(this.ui,theme,this.footerDataProvider),this.footerContainer.addChild(this.customFooter)):(this.customFooter=void 0,this.footerContainer.addChild(this.footer)),this.ui.requestRender()}setExtensionHeader(factory){if(!this.builtInHeader)return;this.customHeader?.dispose&&this.customHeader.dispose();let currentHeader=this.customHeader||this.builtInHeader,index=this.headerContainer.children.indexOf(currentHeader);factory?(this.customHeader=factory(this.ui,theme),isExpandable(this.customHeader)&&this.customHeader.setExpanded(this.toolOutputExpanded),index!==-1?this.headerContainer.children[index]=this.customHeader:this.headerContainer.children.unshift(this.customHeader)):(this.customHeader=void 0,isExpandable(this.builtInHeader)&&this.builtInHeader.setExpanded(this.toolOutputExpanded),index!==-1&&(this.headerContainer.children[index]=this.builtInHeader)),this.ui.requestRender()}addExtensionTerminalInputListener(handler){let subscription={handler,unsubscribe:this.ui.addInputListener(handler)};return this.extensionTerminalInputSubscriptions.add(subscription),()=>{subscription.unsubscribe(),this.extensionTerminalInputSubscriptions.delete(subscription)}}rebindExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe(),subscription.unsubscribe=this.ui.addInputListener(subscription.handler)}clearExtensionTerminalInputListeners(){for(let subscription of this.extensionTerminalInputSubscriptions)subscription.unsubscribe();this.extensionTerminalInputSubscriptions.clear()}createProjectTrustContext(cwd){let ui=this.createExtensionUIContext();return{cwd,mode:"tui",hasUI:!0,ui:{select:ui.select,confirm:ui.confirm,input:ui.input,notify:ui.notify}}}createExtensionUIContext(){return{select:(title,options,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionSelector(title,options,opts)),confirm:(title,message,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionConfirm(title,message,opts)),input:(title,placeholder,opts)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionInput(title,placeholder,opts)),question:(request2,opts)=>request2.waitForAnswer?this.showQuestionOverlay(request2,opts):this.showAsyncQuestion(request2,opts),notify:(message,type2)=>this.showExtensionNotify(message,type2),onTerminalInput:handler=>this.addExtensionTerminalInputListener(handler),setStatus:(key,text3)=>this.setExtensionStatus(key,text3),setSubagentCost:costUsd=>{this.footerDataProvider.setSubagentCost(costUsd),this.ui.requestRender()},setWorkingMessage:message=>{this.workingMessage=message,this.updateWorkingIndicatorMessage()},setWorkingVisible:visible=>this.setWorkingVisible(visible),setWorkingIndicator:options=>this.setWorkingIndicator(options),setHiddenThinkingLabel:label3=>this.setHiddenThinkingLabel(label3),setWidget:(key,content,options)=>this.setExtensionWidget(key,content,options),setFooter:factory=>this.setExtensionFooter(factory),setHeader:factory=>this.setExtensionHeader(factory),setTitle:title=>{this.extensionTerminalTitle=title,this.applyTerminalTitle()},custom:(factory,options)=>this.showExtensionCustom(factory,options),pasteToEditor:text3=>insertProgrammaticComposerInput(this.editor,`\x1B[200~${text3}\x1B[201~`),setEditorText:text3=>this.editor.setText(text3),getEditorText:()=>this.getExpandedEditorText(),editor:(title,prefill)=>this.withBlockedHostDialog(crypto.randomUUID(),title,()=>this.showExtensionEditor(title,prefill)),addAutocompleteProvider:factory=>{this.autocompleteProviderWrappers.push(factory),this.setupAutocompleteProvider()},setEditorComponent:factory=>this.setCustomEditorComponent(factory),getEditorComponent:()=>this.editorComponentFactory,get theme(){return theme},getAllThemes:()=>getAvailableThemesWithPaths(),getTheme:name=>getThemeByName(name),setTheme:themeOrName=>{if(themeOrName instanceof Theme)return this.themeController.setThemeInstance(themeOrName);let result3=this.themeController.setThemeName(themeOrName);return result3.success&&this.settingsManager.getTheme()!==themeOrName&&this.settingsManager.setTheme(themeOrName),result3},getToolsExpanded:()=>this.toolOutputExpanded,setToolsExpanded:expanded=>this.setToolsExpanded(expanded)}}showExtensionSelector(title,options,opts){return new Promise(resolve55=>{if(opts?.signal?.aborted){resolve55(void 0);return}let onAbort=()=>{this.hideExtensionSelector(),resolve55(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionSelector=new ExtensionSelectorComponent(title,options,option=>{this.session.admitHumanAnswer(),opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve55(option)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionSelector(),resolve55(void 0)},{tui:this.ui,timeout:opts?.timeout,onToggleToolsExpanded:()=>this.toggleToolOutputExpansion()}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionSelector),this.ui.setFocus(this.extensionSelector),this.ui.requestRender()})}hideExtensionSelector(){this.extensionSelector?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionSelector=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}async showExtensionConfirm(title,message,opts){return await this.showExtensionSelector(`${title}
|
|
2149
2149
|
${message}`,["Yes","No"],opts)==="Yes"}async promptForMissingSessionCwd(error2){return await this.showExtensionConfirm("Session cwd not found",formatMissingSessionCwdPrompt(error2.issue))?error2.issue.fallbackCwd:void 0}showExtensionInput(title,placeholder,opts){return new Promise(resolve55=>{if(opts?.signal?.aborted){resolve55(void 0);return}let onAbort=()=>{this.hideExtensionInput(),resolve55(void 0)};opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.extensionInput=new ExtensionInputComponent(title,placeholder,value=>{this.session.admitHumanAnswer(),opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve55(value)},()=>{opts?.signal?.removeEventListener("abort",onAbort),this.hideExtensionInput(),resolve55(void 0)},{tui:this.ui,timeout:opts?.timeout}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionInput),this.ui.setFocus(this.extensionInput),this.ui.requestRender()})}hideExtensionInput(){this.extensionInput?.dispose(),this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionInput=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showExtensionEditor(title,prefill){return new Promise(resolve55=>{this.extensionEditor=new ExtensionEditorComponent(this.ui,this.keybindings,title,prefill,value=>{this.session.admitHumanAnswer(),this.hideExtensionEditor(),resolve55(value)},()=>{this.hideExtensionEditor(),resolve55(void 0)},void 0,this.settingsManager.getExternalEditorCommand()),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.extensionEditor),this.ui.setFocus(this.extensionEditor),this.ui.requestRender()})}hideExtensionEditor(){this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.extensionEditor=void 0,this.ui.setFocus(this.editor),this.ui.requestRender()}showQuestionOverlay(request2,opts){return new Promise(resolve55=>{let settled2=!1,previousWorkingMessage=this.workingMessage,finish=response=>{settled2||(request2.waitForAnswer&&opts?.deliver!=="user-message"&&response.resolvedBy==="local_ui"&&this.session.admitHumanAnswer(),settled2=!0,opts?.signal?.removeEventListener("abort",onAbort),this.workingMessage=previousWorkingMessage,this.updateWorkingIndicatorMessage(),this.blockingQuestionHeader=void 0,this.applyTerminalTitle(),this.hideQuestionOverlay(),resolve55(response))},onAbort=()=>{finish({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)})};if(opts?.signal?.aborted){resolve55({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});return}opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.blockingQuestionHeader=request2.questions[0]?.header,this.applyTerminalTitle(),this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),this.workingMessage="Waiting for your answer",this.updateWorkingIndicatorMessage(),this.askUserQuestion=new AskUserQuestionComponent(request2,response=>finish(response),{tui:this.ui,timeoutMs:opts?.timeout??request2.timeoutMs,getDeadlineAtMs:opts?.getDeadlineAtMs,initialDraft:opts?.initialDraft,onProgress:opts?.onProgress}),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(this.askUserQuestion),this.syncQuestionMouseCapture(),this.ui.setFocus(this.askUserQuestion),this.ui.requestRender()})}hideQuestionOverlay(){this.askUserQuestion?.dispose(),this.askUserQuestion=void 0,this.syncQuestionMouseCapture(),this.questionSurface="collapsed",this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.ui.setFocus(this.editor),this.ui.requestRender()}showAsyncQuestion(request2,opts){let existing2=this.pendingQuestions.get(request2.requestId);if(existing2)return existing2.completion;let cancelled2=()=>({status:"cancelled",answers:{},unanswered:request2.questions.map(question=>question.id)});if(opts?.signal?.aborted)return Promise.resolve(cancelled2());let completion=Promise.withResolvers(),onAbort=()=>state3.finish(cancelled2()),state3={request:request2,timeoutMs:opts?.timeout??request2.timeoutMs,askedAtMs:Date.now(),completion:completion.promise,getDeadlineAtMs:opts?.getDeadlineAtMs,onProgress:opts?.onProgress,draft:opts?.initialDraft??{answers:{}},finish:response=>{this.pendingQuestions.get(request2.requestId)===state3&&(this.pendingQuestions.delete(request2.requestId),this.pendingOrder=this.pendingOrder.filter(id=>id!==request2.requestId),opts?.signal?.removeEventListener("abort",onAbort),this.composerDestination.kind==="answer"&&this.composerDestination.requestId===request2.requestId&&(this.setComposerReply(),this.editor.getText()!==""&&this.showStatus("That question is no longer pending")),this.pendingOrder.length===0&&this.questionSurface==="list"&&(this.ui.hideOverlay(),this.questionSurface="collapsed"),this.shownQuestionId===request2.requestId&&(this.questionSurface==="expanded"&&this.hideQuestionOverlay(),this.shownQuestionId=this.pendingOrder[0]),this.refreshAsyncWidget(),completion.resolve(response))}};return this.pendingQuestions.set(request2.requestId,state3),this.pendingOrder.push(request2.requestId),this.shownQuestionId??=request2.requestId,this.settingsManager.getAskUserSettings().bell&&this.ui.terminal.write("\x07"),opts?.signal?.addEventListener("abort",onAbort,{once:!0}),this.refreshAsyncWidget(),completion.promise}sessionControlContext(){return{session:this.session,agentDir:this.session.agentDir,surface:{draftHold:()=>this.sessionControlHost.submissionInFlight()?"draft":this.composerHold(),blockingQuestion:()=>this.askUserQuestion!==void 0,pendingQuestionIds:()=>[...this.pendingQuestions.keys()],pendingQuestion:requestId=>this.pendingQuestions.get(requestId)?.request,answerQuestion:(requestId,response)=>{let state3=this.pendingQuestions.get(requestId);return state3?.finish(response),state3!==void 0},notice:line=>this.showWarning(line),selectModel:model=>_InteractiveMode.applyModelSelection(this,model,{source:"control"}),selectThinkingLevel:(level,remember)=>_InteractiveMode.applyThinkingLevel(this,level,remember),interruptTurn:async()=>{await this.abortAndFireQueuedMessages()}}}}composerHold(){return this.pendingImages.size>0?"attachment":this.editor.getText().trim()===""?void 0:"draft"}refreshAsyncWidget(){this.sessionControlHost?.questionsChanged(),this.syncQuestionMouseCapture(),this.applyTerminalTitle();let state3=this.shownQuestion;if(!state3||this.questionSurface==="expanded"){this.setExtensionWidget(ASK_USER_WIDGET_KEY,void 0);return}this.setExtensionWidget(ASK_USER_WIDGET_KEY,tui=>new AskUserAsyncWidget({request:state3.request,draft:state3.draft,timeoutMs:state3.timeoutMs,getDeadlineAtMs:state3.getDeadlineAtMs,pendingCount:this.pendingOrder.length,tui,mouseCaptureActive:this.terminalMouseMode!=="off",onExpandClick:()=>this.expandPendingQuestion(state3.request.requestId),onNextQuestion:()=>this.cyclePendingQuestion(),onOptionClick:index=>this.clickPendingQuestion(state3,index),onOwnAnswerClick:()=>this.clickPendingQuestion(state3,"own-answer"),onExpire:()=>state3.finish(buildTimedOutResponse(state3.request,state3.draft,Date.now()-state3.askedAtMs))}))}cyclePendingQuestion(){if(this.pendingOrder.length<2)return;let index=this.pendingOrder.indexOf(this.shownQuestionId);this.shownQuestionId=this.pendingOrder[(index+1)%this.pendingOrder.length],this.refreshAsyncWidget()}clickPendingQuestion(state3,option){let unanswered=unansweredIds2(state3.request,state3.draft),index=state3.request.questions.findIndex(question=>question.id===unanswered[0]);if(index<0){state3.finish(buildAnsweredResponse(state3.request,state3.draft));return}this.expandPendingQuestion(state3.request.requestId,index)&&(option==="own-answer"?this.askUserQuestion.openOwnAnswer():this.askUserQuestion.clickOption(option,!0))}handleAskUserShortcut(data){let state3=this.shownQuestion;if(!state3||this.askUserQuestion||this.ui.hasOverlay()||this.extensionSelector||this.extensionInput||this.extensionEditor)return!1;if(matchesAskUserAnswerKey(data))return this.expandPendingQuestion();if(this.editor.getText()!==""||this.ui.getFocusedComponent()!==this.editor||this.defaultEditor.isShowingAutocomplete())return!1;if(this.keybindings.matches(data,"app.question.next"))return this.pendingOrder.length<2?!1:(this.cyclePendingQuestion(),!0);let unanswered=unansweredIds2(state3.request,state3.draft),questionIndex=state3.request.questions.findIndex(question2=>question2.id===unanswered[0]),question=state3.request.questions[questionIndex];if(/^[1-9]$/.test(data)&&question?.options[Number(data)-1])return this.expandPendingQuestion(state3.request.requestId,questionIndex,data),!0;let printable=decodeKittyPrintable(data)??data;return(data.startsWith("\x1B[200~")||printable!==""&&!/[\x00-\x1f\x7f]/.test(printable)&&!/^[/!]/.test(printable))&&this.setComposerReply(state3.request.requestId),!1}setComposerReply(requestId){this.composerDestination=requestId===void 0?{kind:"chat"}:{kind:"answer",requestId};let state3=requestId===void 0?void 0:this.pendingQuestions.get(requestId);this.defaultEditor.setReplyLabel(state3?theme.fg("muted",`\u21B3 reply to ${state3.request.questions[0].header} \xB7 ${keyText("app.message.followUp")} sends as message`):void 0),this.ui.requestRender()}async handleAnswerCommand(argument){let state3=this.shownQuestion;if(!state3){this.showStatus("No question is pending.");return}if(argument==="skip"){let response={status:"cancelled",cancelOrigin:"user",answers:state3.draft.answers??{},unanswered:unansweredIds2(state3.request,state3.draft)};if(state3.finish(response),await state3.completion,this.showStatus("The user dismissed the question."),showsPartialAnswers(response))return;await this.session.sendUserMessage(formatUserMessage(response,state3.request.requestId,state3.request.questions,state3.request.required===!0),{deliverAs:this.session.isStreaming?"steer":"followUp"});return}if(argument!==""){let id=/^[1-9]\d*$/.test(argument)?this.pendingOrder[Number(argument)-1]:void 0;if(id===void 0){this.showStatus("Choose a pending question number or /answer skip.");return}this.expandPendingQuestion(id);return}if(this.pendingOrder.length===1){this.expandPendingQuestion();return}let list3=new SelectList(this.pendingOrder.map(id=>{let pending=this.pendingQuestions.get(id),remaining=(pending.getDeadlineAtMs?.()??pending.askedAtMs+pending.timeoutMs)-Date.now();return{value:id,label:`${pending.request.questions[0].header} \xB7 ${formatCountdownLabel(Date.now()-pending.askedAtMs)} ago \xB7 ${formatCountdownLabel(remaining)} remaining`}}),10,getSelectListTheme()),close=()=>{this.ui.hideOverlay(),this.questionSurface="collapsed"};list3.onCancel=close,list3.onSelect=({value})=>{close(),this.expandPendingQuestion(value)},this.questionSurface="list",this.ui.showOverlay(list3,{width:"80%",anchor:"bottom-center"})}expandPendingQuestion(requestId=this.shownQuestionId,initialQuestionIndex,initialInput){let state3=requestId===void 0?void 0:this.pendingQuestions.get(requestId);if(!state3||this.askUserQuestion)return!1;this.shownQuestionId=state3.request.requestId;let component=new AskUserQuestionComponent(state3.request,response=>{if(this.pendingQuestions.get(state3.request.requestId)===state3){if(response.status!=="cancelled"){state3.finish(response);return}this.hideQuestionOverlay(),this.refreshAsyncWidget()}},{tui:this.ui,timeoutMs:state3.timeoutMs,getDeadlineAtMs:state3.getDeadlineAtMs,initialDraft:state3.draft,initialQuestionIndex,onProgress:draft=>{state3.draft=draft,state3.onProgress?.(draft)}});return this.askUserQuestion=component,this.questionSurface="expanded",this.refreshAsyncWidget(),this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender(),initialInput!==void 0&&component.handleInput(initialInput),!0}submitAsyncQuestionComment(text3){let destination=this.composerDestination,state3=destination.kind==="answer"?this.pendingQuestions.get(destination.requestId):void 0;return state3?(this.setComposerReply(),this.editor.addToHistory?.(text3),this.editor.setText(""),state3.finish(buildCommentResponse(state3.request,state3.draft,text3)),!0):!1}getExpandedEditorText(){return expandEditorSubmission(this.editor,this.editor.getText())}setCustomEditorComponent(factory){if(this.editorComponentFactory=factory,!(!factory&&this.editor===this.defaultEditor)){if(this.disposeActiveSelector(),this.editorContainer.clear(),factory){let newEditor=factory(this.ui,this.chrome?this.chrome.getEditorTheme():getEditorTheme(),this.keybindings);newEditor.onSubmit=text3=>{this.defaultEditor.onSubmit?.(expandSubmittedText(newEditor,text3))},newEditor.onChange=this.defaultEditor.onChange,observeComposerActivity(newEditor,()=>emitUserActivity(this.session,"draft")),transferEditorContent(this.editor,newEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(newEditor),newEditor.borderColor!==void 0&&(newEditor.borderColor=this.defaultEditor.borderColor),newEditor.setPaddingX!==void 0&&newEditor.setPaddingX(this.defaultEditor.getPaddingX()),newEditor.setAutocompleteMaxVisible!==void 0&&newEditor.setAutocompleteMaxVisible(this.defaultEditor.getAutocompleteMaxVisible()),newEditor.setAutocompleteProvider&&this.autocompleteProvider&&newEditor.setAutocompleteProvider(this.autocompleteProvider);let customEditor=newEditor;if("actionHandlers"in customEditor&&customEditor.actionHandlers instanceof Map){customEditor.onEscape||(customEditor.onEscape=()=>this.defaultEditor.onEscape?.()),customEditor.onCtrlD||(customEditor.onCtrlD=()=>this.defaultEditor.onCtrlD?.()),customEditor.onPasteImage||(customEditor.onPasteImage=()=>this.defaultEditor.onPasteImage?.()),customEditor.onExtensionShortcut||(customEditor.onExtensionShortcut=data=>this.defaultEditor.onExtensionShortcut?.(data));for(let[action,handler]of this.defaultEditor.actionHandlers)customEditor.actionHandlers.set(action,handler)}this.editor=newEditor}else this.editor!==this.defaultEditor&&(transferEditorContent(this.editor,this.defaultEditor).imageMarkersTransferred||this.pendingImages.clear(),this.subscribeImageMarkers(this.defaultEditor)),this.editor=this.defaultEditor;this.editorContainer.addChild(this.editor),this.activeStatusIndicator&&(this.statusContainer.clear(),this.activeWorkingIndicatorEmbedded=embedStatusIndicatorInEditor(this.defaultEditor,this.editor,this.activeStatusIndicator),this.activeWorkingIndicatorEmbedded||this.statusContainer.addChild(this.activeStatusIndicator)),this.ui.setFocus(this.editor),this.ui.requestRender()}}showExtensionNotify(message,type2){type2==="error"?this.showError(message):type2==="warning"?this.showWarning(message):this.showStatus(message)}async showExtensionCustom(factory,options){let savedText=this.editor.getText(),isOverlay=options?.overlay??!1,restoreEditor=()=>{this.editorContainer.clear(),this.editorContainer.addChild(this.editor),this.editor.setText(savedText),this.ui.setFocus(this.editor),this.ui.requestRender()};return new Promise((resolve55,reject)=>{let component,closed=!1,close=result3=>{if(!closed){closed=!0,isOverlay?this.ui.hideOverlay():restoreEditor(),resolve55(result3);try{component?.dispose?.()}catch{}}};Promise.resolve(factory(this.ui,theme,this.keybindings,close)).then(c=>{if(!closed)if(component=c,isOverlay){let overlayOptions=(()=>{if(options?.overlayOptions)return typeof options.overlayOptions=="function"?options.overlayOptions():options.overlayOptions;let w=component.width;return w?{width:w}:void 0})(),handle=this.ui.showOverlay(component,overlayOptions);options?.onHandle?.(handle)}else this.disposeActiveSelector(),this.editorContainer.clear(),this.editorContainer.addChild(component),this.ui.setFocus(component),this.ui.requestRender()}).catch(err=>{closed||(isOverlay||restoreEditor(),reject(err))})})}showExtensionError(error2){let errorMsg=formatExtensionErrorHeadline(error2),errorText6=new ThemedText(()=>theme.fg("error",errorMsg),1,0);if(this.chatContainer.addChild(errorText6),error2.stack){let stackLines=error2.stack.split(`
|
|
2150
2150
|
`).slice(1);if(stackLines.length>0){let renderStack=()=>stackLines.map(line=>theme.fg("dim",` ${line.trim()}`)).join(`
|
|
2151
2151
|
`);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=text3=>{let wasBashMode=this.isBashMode;this.isBashMode=text3.trimStart().startsWith("!"),wasBashMode!==this.isBashMode&&this.updateEditorBorderColor(),this.updateShortcutOverlay(text3)},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 text3=await readClipboardText();if(!text3||this.renderer.getFocusedComponent()!==target)return;handleInput.call(target,`\x1B[200~${text3}\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(`
|